我正在实现 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;
}
}
谁能澄清这是否是一种有效的方法,为什么?
最佳答案
看起来您混合了整数和浮点混合的公式。例如,如果 red
和 alpha
都是 255,那么 vga_red
可能会变成 255,所以它会更接近于 (red*alpha)/255
,但您可能应该使用 (red*alpha+127)/255
来确保正确的舍入。
将 inv_alpha
与 256
相除总是会产生零,所以它可能是错误的,我猜你希望结果是 green
如果 alpha
是 255
并且 255
如果 alpha
是 0
。所以它会变成类似 (green*alpha+127)/255 + inv_alpha
的东西。
关于c++ - Alpha 混合说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362525/