使用CImage 的alphablend函数描画32为Png 图片时发现不能够正确的按每个像素的透明度显示。
调查发现:
不能正确显示时的环境:
背景图:黑色
Png图:alpha 值为0,但是这一点的RGB值不是黑色
根据MSDN 关于BLENDFUNCTION部分关于alphablend介绍这种情况下的公式如下:
If the source bitmap does not use SourceConstantAlpha (that is, it equals 0xFF), the per-pixel alpha determines the blend of the source and destination bitmaps, as shown in the following table.
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 |
造成各个问题的原因是alphablend实现的方法问题。
如果才用下面的公式就应该没有问题了:
Dst.Red | = Src.Red*Src.Alpha | + (1 - Src.Alpha) * Dst.Red |
Dst.Green | = src.Green*Src.Alpha | + (1 - Src.Alpha) * Dst.Green |
Dst.Blue | = Src.Blue*Src.Alpha | + (1 - Src.Alpha) * Dst.Blue |