3 回答
TA贡献1998条经验 获得超6个赞
我赞成约翰尼斯的回答,因为他对此是正确的。
*有人提出我的原始答案不正确的评论。如果alpha值与正常值相反,则可以正常工作。但是,根据定义,这在大多数情况下不起作用。因此,我更新了以下公式以适合正常情况。最终等于@hkurabko在下面的回答*
但是,一个更具体的答案是将alpha值基于不透明的背景色(或称为“遮罩”)合并到实际的颜色结果中。
为此有一个算法(来自此 Wikipedia链接):
标准化RGBA值,使它们都在0到1之间-只需将每个值除以255即可。我们称之为结果Source。
还可以对遮罩色进行归一化(黑色,白色等)。我们将结果称为“ BGColor 注” -如果背景颜色也是透明的,则必须首先递归该过程(再次选择遮罩),以获取此操作的源RGB。
现在,将转换定义为(在此处完整的伪代码!):
Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
要获得最终的0-255值,Target只需将所有归一化的值乘以255,并确保在任何组合值超过1.0时将上限设置为255(这是过度曝光,并且有更复杂的算法来处理此问题涉及整个图像处理等)。
编辑:在您的问题中,您说过您想要一个白色背景-在那种情况下,只需将BGColor固定为255,255,255即可。
- 3 回答
- 0 关注
- 1850 浏览
添加回答
举报