Я реализую альфа-смешивание, и один из примеров, с которыми я столкнулся, использовал этот формат. Я смущен, почему деление на 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;
}
}
Может кто-нибудь уточнить, если это правильный метод, и почему?
Возможно, вы должны спросить, в чем разница 'inv_alpha/256', целочисленное деление между числом от 0 до 255 (предположим) и 256, дает .... 0. Я предполагаю, что вы можете просто игнорировать и убери это. –
У меня создалось впечатление, что фактическая формула: vga_red = red * alpha + inv_alpha * red. это неправильно? – pointnotfoe
Формула: red = source_red * alpha + destination_red * inv_alpha. В этом коде не происходит смешивания, потому что есть только один набор значений RGB. – samgak