最近工作中写个工具软件要支持带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混合的公式是:
<