c++ - Alpha 混合说明

标签 c++ c alphablending

我正在实现 alpha 混合,我遇到的其中一个示例使用了这种格式。我很困惑为什么要除以 256 以及为什么红色和蓝色 channel 中没有 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;            
    }
} 

谁能澄清这是否是一种有效的方法,为什么?

最佳答案

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

inv_alpha256 相除总是会产生零,所以它可能是错误的,我猜你希望结果是 green如果 alpha255 并且 255 如果 alpha0。所以它会变成类似 (green*alpha+127)/255 + inv_alpha 的东西。

关于c++ - Alpha 混合说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362525/

相关文章:

c++ - 如何使用正则表达式确定 Linux 上 C/C++ 中文件组的存在和大小?

c++ - G++ 编译器错误或错误代码? : "template definition of non-template"

c++ - 无论如何我可以阻止 throw 调用 malloc

c - 将结构传递给 pthread_create,强制转换后未定义值?

C++ assert() 失败,没有给出任何错误消息,也没有给出失败的行

c++ - 使用 QPainter 在 QPixmap 上绘制图形

svg - 如何在 SVG 中使用我自己的混合公式?

c++ - CryptProtectData API 提供的加密有多安全?

c - 循环重复 printf 但不重复 scanf

Android - 是否可以直接在层列表 XML 定义中声明 alpha 掩码?