CImage类显示透明PNG
在做项目的时候,需要用到透明的png格式的图片,使用CImage类是个不错的选择,但在使用该类的时候,发现显示出来的并不是透明背景的图片,而且一些黑色边加一大片白色背景的图片,这是怎么回事呢?用ps来看的时候明明就是透明的。于是google一番,找到一些关于这类问题的看法:
以下为转述:
PNG图片的透明背景总是一片白色,后来才发现这其实是微软GDI+的设计问题,PNG图片是ARGB,使用GDI+载入图片的时候,GDI+会默认已经进行了预剩运算(PARGB),即每象素的实际值是已经和ALPHA值按比例相乘的结果,实际上它根本就没有做预乘,在使用透明图片的象素ALPHA通道的时候,CImage内部正是调用的AlphaBlend,没有预乘的图当作预乘的图片处理的结果就是这相当于一张和纯白背景进行了预剩,所以图象总是出现白色背景。
虽然找到了问题,但是还是要解决的。于是又google一番,使用如下代码来处理:
CImage img; HRESULT result = img.Load(_T("(你的工作路径)\\keys_base.png")); for(int i = 0; i < img.GetWidth(); i++) { for(int j = 0; j < img.GetHeight(); j++) { unsigned char* pucColor = reinterpret_cast<unsigned char *>(img.GetPixelAddress(i , j)); pucColor[0] = pucColor[0] * pucColor[3] / 255; pucColor[1] = pucColor[1] * pucColor[3] / 255; pucColor[2] = pucColor[2] * pucColor[3] / 255; } }
以上方法暂时解决了问题,不知道哪天哪个人会搜索到这篇文章呢?希望能有点帮助吧…