我正在实现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;
}
}
任何人都可以澄清这是否是一种有效的方法,为什么?
答案 0 :(得分:2)
看起来你已经混合了整数和浮点混合的公式。例如,如果vga_red
和red
都是alpha
,则(red*alpha)/255
可能会变为255,因此它会更接近(red*alpha+127)/255
,但您可能应该通过使用{来确保正确的舍入{1}}。
inv_alpha
与256
的划分总是会产生零,所以它可能是错误的,我猜你希望结果为green
if {{如果alpha
为255
,则为255
和alpha
。所以它会变成0
。
答案 1 :(得分:0)
Alpha混合的公式为C = alpha_A * A + (1 - alpha_A * B)
。但是在这个公式中,我们使用浮点值,alpha是0到1之间的值。
由于我们使用整数值,因此alpha(以及红色,绿色和蓝色)的值介于0到255之间。因此1 - alpha_A
的值封装在inv_alpha_A = 255 - alpha_A
中。
由于每种颜色不能超过一个字节的最大值,我们必须确保计算出的数字不超过255.所以我们必须除以255.这导致:
C = (alpha_A * A + inv_aplha_A * B) / 255
(我故意跳过了舍入问题)。