
2009年9月7日 | K-Res 发布

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

查了MSDN后看到CImage的Draw函数会按照不同的先决条件执行不同的绘图操作,没有透明色或Alpha通道的之后直接使用StretchBltcimage draw 失真,有透明色没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
请输入应加密的内容
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-133140-1.html
恋爱给人以智慧
何况还有日寇在使阴招
大发