如何混合两个RGB像素?

时间:2009-12-22 04:00:02

标签: puzzle graphics

如何混合两个ARGB像素?

实施例

Source: en.wikipedia.org/wiki/Alpha_compositing#mediaviewer/File:Alpha_compositing.svg

这里A是(带有Alpha的红色),B是(带有Alpha的蓝色)。

3 个答案:

答案 0 :(得分:32)

取自您获得图像的维基百科文章:

C_o = C_a \alpha_a + C_b \alpha_b \left(1 - \alpha_a\right)

转换为0到255之间的值:

rOut = (rA * aA / 255) + (rB * aB * (255 - aA) / (255*255))
gOut = (gA * aA / 255) + (gB * aB * (255 - aA) / (255*255))
bOut = (bA * aA / 255) + (bB * aB * (255 - aA) / (255*255))
aOut = aA + (aB * (255 - aA) / 255)

答案 1 :(得分:2)

看起来这就是你想要的:http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending,但我对你的符号感到有些困惑,因为维基百科说argb的值应该在0.0到1.0之间。所以我不认为这个公式会给你FA = 19。你能说清楚吗?

编辑:既然您已经开始了关于FA = 19的业务,我倾向于采用这个公式。

答案 2 :(得分:1)

以上是错误的算法。 可以通过替换aA = 0来验证这一点。然后证明,如果您尝试将颜色B与完全透明的颜色A(即不可见)混合,则逻辑上颜色B保持不变,但是根据此公式,它将更改。 The result of incorrect blending with gradient transparency. 因此,正确的解决方案将是这样的:

aOut = aA + (aB * (255 - aA) / 255)
rOut = (rA * aA + rB * aB * (255 - aA) / 255)/aOut 
gOut = (gA * aA + gB * aB * (255 - aA) / 255)/aOut 
bOut = (bA * aA + bB * aB * (255 - aA) / 255)/aOut 

The result of correct blending with gradient transparency.