一般数学计算中,颜色取值是:
所以对于一般的颜色混合有:
标准的颜色混合算法如下:
但是在计算机图像中,透明度alpha通常也是
所以,根据变化得到的代码是:
//浮点数版
float a1 = A1 / 256.0;
float a2 = A2 / 256.0;
float a = 1 - (1 - a1)*(1 - a2);
R = (a1*R1 + (1 - a1)*a2*R2) / a;
G = (a1*G1 + (1 - a1)*a2*G2) / a;
B = (a1*B1 + (1 - a1)*a2*B2) / a;
A = a * 256;
但是浮点数运算终究不快,经过优化后有如下算法
uint32_t a1 = A1;
uint32_t a2 = A2 - ((a1*A2) >> 8);
A = clamp(a1 + a2, 1, 255);
R = (a1*R1 + a2*R2) / A;
G = (a1*G1 + a2*G2) / A;
B = (a1*B1 + a2*B2) / A;