如果我有 RGB 颜色,不透明度为 100%。
我想要具有透明 Alpha 通道的相同颜色(或接近它)。我将在白色背景上绘制透明颜色。
如何计算 RGBA 颜色?
我想我要问的是这个问题的反面。
你的意思是你想要具有最大透明度的 RGBA 颜色,当在白色背景上绘制时,它会给出原始的 RGB 颜色?
设R 0、G 0、B 0为原色的分量,取值范围为0.0~1.0,设R、G、B、A为新RGBA颜色的分量(A =1表示100%不透明度)。我们知道颜色必须满足:
R 0 = A · R + (1 - A )
G 0 = A · G + (1 - A )
B 0 = A · B + (1 - A )
如果我们知道A,我们可以很容易地求解R、G和B:
R = ( R 0 - 1 + A ) / A = 1 - (1 - R 0 ) / A
G = ( G 0 - 1 + A ) / A = 1 - (1 - G 0 ) / A
B = ( B 0 - 1 + A ) / A = 1 - (1 - B 0 ) / A
由于我们要求R ≥ 0、G ≥ 0 和B ≥ 0,因此 1 - R 0 ≥ A、1 - G 0 ≥ A 和 1 - B 0 ≥ A,因此 A 的最小可能值为:
A = 最大值( 1 - R 0, 1 - G 0, 1 - B 0) = 1 - 最小值(R 0,G 0,B 0)
因此,我们想要的颜色是:
A = 1 - min( R 0 , G 0 , B 0 )
R = 1 - (1 - R 0 ) / A
G = 1 - (1 - G 0 ) / A
B = 1 - (1 - B 0 ) /一个
附言。对于黑色背景,相同的公式会更简单:
A = 最大值(R 0,G 0,B 0)
R = R 0 / A
G = G 0 / A
B = B 0 / A
pps。澄清一下,以上所有公式都适用于非预乘 RGBA 颜色。对于预乘 alpha,只需将上面计算的R、G和B乘以A,得到:
R = A · ( 1 - (1 - R 0 ) / A ) = R 0 - (1 - A )
G = A · ( 1 - (1 - G 0 ) / A ) = G 0 - (1 - A )
B = A · ( 1 - (1 - B 0 ) / A ) = B 0 - (1 - A )
(或者,对于黑色背景,只需R = R 0,G = G 0和B = B 0。)