Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ α混合澄清_C++_C_Alphablending - Fatal编程技术网

C++ α混合澄清

C++ α混合澄清,c++,c,alphablending,C++,C,Alphablending,我正在实现alpha混合,我遇到的一个示例使用了这种格式。我不明白为什么除法是256,为什么在红色和蓝色通道中没有inv_alpha int pixel,vga_pixel; int alpha, blue, green, red, pixel; int height = 1296; int width = 968; int x, y; for (y = 0; y <= height; y++){ for (x = 0; x <= width; x++){

我正在实现alpha混合,我遇到的一个示例使用了这种格式。我不明白为什么除法是256,为什么在红色和蓝色通道中没有inv_alpha

int pixel,vga_pixel;
int alpha, blue, green, red, pixel;

int height = 1296;
int width = 968;
int x, y;

for (y = 0; y <= height; y++){
    for (x = 0; x <= width; x++){
        pixel = *(img.memloc + x + y);
            //0xff gets the first 8 bits, in this case red  
            red = pixel & 0xff; 

            //shift by 8 to get rid of red then AND  to get first 8, here green
            green = pixel >> 8 & 0xff; 

            blue = pixel >> 16 & 0xff;

            alpha = pixel >> 24 & 0xff;
            int inv_alpha = 0xff - alpha; // 1-alpha

            int vga_red = (red*(int)alpha);
            int vga_green = (green*(int)alpha + inv_alpha/256);
            int vga_blue = (blue*(int)alpha);
            int vga_alpha = 0xff;

            int vga_pixel = vga_alpha << 24 | vga_blue << 16 | vga_green << 8 | vga_red;            
    }
} 
int像素,vga\u像素;
int alpha、蓝色、绿色、红色、像素;
内部高度=1296;
整数宽度=968;
int x,y;
对于(y=0;y 8&0xff;
蓝色=像素>>16&0xff;
alpha=像素>>24&0xff;
int inv_alpha=0xff-alpha;//1-alpha
int vga_red=(红色*(int)alpha);
int vga_绿色=(绿色*(int)alpha+inv_alpha/256);
int vga_蓝色=(蓝色*(int)阿尔法);
int vga_alpha=0xff;

int vga_pixel=vga_alpha看起来就像你混合了整数和浮点混合的公式。例如,如果
red
alpha
都是,那么
vga_red
可能会变成255,所以它会更接近
(red*alpha)/255
,但您可能应该使用
(红色*alpha+127)/255
来确保正确的四舍五入


256
除以
inv\u alpha
总是会得到零,所以这可能是错误的,我猜如果
alpha
255
255
如果
alpha
0
,那么它会变成
(绿色*alpha+127)/255+inv_alpha
alpha混合的公式是
C=alpha_A*A+(1-alpha_A*B)
。但在这个公式中,我们使用的是浮点值,alpha是介于0和1之间的值

由于我们使用的是整数值,alpha(以及红色、绿色和蓝色)是一个介于0和255之间的值。因此
1-alpha\u a
的值封装在
inv\u alpha\u a=255-alpha\u a

由于每种颜色可能不超过一个字节的最大值,我们必须确保计算的数字不超过255。因此我们必须除以255。这将导致:

C=(alpha\u A*A+inv\u aplha\u A*B)/255


(我故意跳过了舍入问题)。

也许你应该问一下
inv_alpha/256
在0和255之间的整数除法有什么区别(我假设)256,给出了…0。我的猜测是,你可以简单地忽略并删除它。我的印象是,实际公式是:vga_red=redalpha+inv_alphared。这是错误的吗?公式是red=source_red*alpha+destination_red*inv_alpha。代码中没有混合,因为只有一组RGB值。那么为什么只有绿色的y?应该是
(1-αA)*B