似乎它不像RGB1 * A1 + RGB2 * A2那么简单...如何修剪值?加权?等
这是一个依赖于上下文的问题吗?有不同的算法会产生不同的结果吗?还是一个标准实施?
我对特定于OpenGL的答案特别感兴趣,但其他环境的上下文也很有用。
答案 0 :(得分:3)
我不知道OpenGL,但不透明度A的一个像素通常是在另一个像素上绘制的,如下所示:
result.r = background.r * (1 - A) + foreground.r * A
result.g = background.g * (1 - A) + foreground.g * A
result.b = background.b * (1 - A) + foreground.b * A
对多个像素重复此操作。
答案 1 :(得分:3)
如果图像不是预乘alpha,则上述答案有效。但是,如果您将此类型的混合与预乘的Alpha图像一起使用,则会出现黑色边框。
预乘Alpha:
创建图像时,颜色值乘以Alpha通道。看一下这个像素的例子:
Pixel: r = 1, g = 0, b = 0, a = 0.5
当它被保存时,rgb值将乘以给出的alpha值:
Pixel: r = 0.5, g = 0, b = 0, a = 0.5
要混合此类图像,您需要使用以下公式:
result.r = background.r * (1 - A) + foreground.r
result.g = background.g * (1 - A) + foreground.g
result.b = background.b * (1 - A) + foreground.b
非预乘Alpha
在此示例中,Alpha通道与颜色通道完全分开。
Pixel: r = 1, g = 0, b = 0, a = 0.5
保存时:
Pixel: r = 1, g = 0, b = 0, a = 0.5
它是一样的。在这种情况下,minitech提供的答案是正确的。
可在此处找到更多详细信息:Premultiplied alpha