最近工作中写个工具软件要支持带Alpha通道的PNG图,使用libpng成功读取出了PNG的数据,但是用AlphaBlend进行显示的时候却遇到了问题。
在网上搜索了一下,好像很多前辈使用这个函数都不成功,最后得出的一致结论是AlphaBlend除了SourceConstantAlpha不等于255时可用以外,对带Alpha通道的图是显示不了的,需要自己写Alpha混合算法。因为是搞嵌入式开发,Alpha混合算法倒是很熟练了,所以也没多想就自己写了一个。回过头想想觉得还是有问题,难道微软会忽悠我们?后来仔细看了一下MSDN,恍然大悟。
微软的运算公式为:
Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue
注意,以上公式中 Src.Alpha 已经转换成了浮点数,并已除以 255 ,所以取值范围是 0 ~ 1.0 。
我们都知道,正确的Alpha混合的公式是:
Dst.Red = Src.Red * Src.Alpha + (1 - Src.Alpha) * Dst.Red Dst.Green = Src.Green * Src.Alpha + (1 - Src.Alpha) * Dst.Green Dst.Blue

在嵌入式开发中,使用AlphaBlend显示带Alpha通道的PNG图片时遇到问题。通常认为AlphaBlend对这类图不可用,需要自定义混合算法。但通过深入研究MSDN,发现只需将原图RGB分量乘以Alpha即可正确混合。微软的设计可能是为了平衡效率,减少了乘法运算,但引入了浮点运算。以下展示了修正后的Alpha混合公式。
最低0.47元/天 解锁文章
15万+

被折叠的 条评论
为什么被折叠?



