透明颜色混合算法

一般数学计算中,颜色取值是: R , G , B [ 0 , 255 ] , A [ 0 , 1 ]
所以对于一般的颜色混合有: C o l o r ( R G B A ) = C o l o r ( R 1 G 1 B 1 A 1 ) + C o l o r ( R 2 G 2 B 2 A 2 )

标准的颜色混合算法如下:
A = 1 ( 1 α 1 ) ( 1 α 2 )
R = 1 A ( α 1 R 1 + ( 1 α 1 ) α 2 R 2 )
G = 1 A ( α 1 G 1 + ( 1 α 1 ) α 2 G 2 )
B = 1 A ( α 1 B 1 + ( 1 α 1 ) α 2 B 2 )

但是在计算机图像中,透明度alpha通常也是 A [ 0 , 255 ]
所以,根据变化得到的代码是:

//浮点数版
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;

猜你喜欢

转载自blog.csdn.net/aa13058219642/article/details/80953341