CImage的Draw对Alpha混合的处理问题

ATL库中的CImage类封装了GDI+的一些猥琐函数,使在win32下对PNG等非直接BMP的图片格式的操作方便了很多。但最近在用到Draw函数时发现其对Alpha混合的处理有些与众不同(不知道是不是m$的bug),PNG中A为0的像素被画成了纯白色!

查了MSDN后发现CImage的Draw函数会根据不同的先决条件执行不同的绘图操作,没有透明色或Alpha通道的时候直接使用StretchBlt,有透明色没A通的时候用TransparentBlt,最后有A的时候用AlphaBlend。(注意:如果编译时没有定义WINVER宏版本>=0x0500的话即使有A也不会执行处理透明的绘图方式!)。

跟了一下程序确实是执行了AlphaBlend绘图,但就是将透明的背景画成了白色,G了半天,发现有人提到GDI+的Alpha Blend使用的是PARGB(P=Premultiplied)像素格式,预乘的ARGB,所有RGB的值乘以Alpha。但不知道为什么对此PNG的处理没有进行预乘,却按预乘后的数据来进行混合,导致纯白背景。而CImage加载的图片ARGB数据确实没错,因为后面我将此CImage转换为了OpenGL材质进行贴图绘制时就没有出现透明背景色的错误问题!

PS:最后发现有一些png图的透明色可以被正常处理,现在怀疑是这些图片的导出方式不对导致。

Powered by Zoundry Raven

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。