17

如何混合两个 ARGB 像素?

例子

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

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

4

3 回答 3

36

取自您获得图像的同一篇 Wikipedia 文章:

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)
于 2009-12-22T04:35:46.217 回答
5

以上是错误的算法。这可以通过代入 aA = 0 来验证。然后事实证明,如果您尝试将颜色 B 与完全透明的颜色 A 混合,即不可见,那么从逻辑上讲颜色 B 保持不变,但根据这个公式它会改变。 与渐变透明度不正确混合的结果。 因此,正确的解决方案是这样的:

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 

与渐变透明度正确混合的结果。

于 2020-11-03T01:27:57.263 回答
2

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

编辑:既然你把 FA=19 的业务拿掉了,我倾向于使用那个公式。

于 2009-12-22T04:06:36.607 回答