使用CImage的时候,发现显示出来的并不是透明背景的图片,而是白色背景的图片。
后发现原因如下:
PNG图片的透明背景总是一片白色,后来才发现这其实是微软GDI+的设计问题,PNG图片是ARGB,使用GDI+载入图片的时候,GDI+会默认已经进行了预剩运算(PARGB),即每象素的实际值是已经和ALPHA值按比例相乘的结果,实际上它根本就没有做预乘,在使用透明图片的象素ALPHA通道的时候,CImage内部正是调用的AlphaBlend,没有预乘的图当作预乘的图片处理的结果就是这相当于一张和纯白背景进行了预剩,所以图象总是出现白色背景。
解决方法如下:
添加一个转换函数。
如下:
CImage img; HRESULT result = img.Load(_T("icon.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; } }
在这里贴上自己项目里面的代码。我的工程要求对话框启动的时候自动加载透明PNG图。开始的时候把加载函数添加到OnInitDialog()里面,但发现没有任何效果,网上查了半天原因,发现画图的函数要添加到OnPaint()里面,修改之后,就生效了。
启动自动加载透明PNG图片的代码(位于OnPaint() 中,待画图的控件是一个ID为IDC_V_H264_LOGO 的 Picture Control):
//画对话框不应该添加到OnInitDialog中,否则没有效果 //应该添加到OnPaint中 CRect rect; GetDlgItem(IDC_V_H264_LOGO)->GetClientRect(&rect); if(image.IsNull()==true) image.Load(".\\res\\264_ico.png"); //转换函数?加上后背景为白色的PNG就变成了透明的------------ //PNG图像自带Alpha通道,存储方式RGBA,代表了透明度,即pucColor[3] //当Alpha通道为0时,把RGB值都变成0 for(int i = 0; i < image.GetWidth(); i++) { for(int j = 0; j < image.GetHeight(); j++) { unsigned char* pucColor = reinterpret_cast<unsigned char *>(image.GetPixelAddress(i , j)); pucColor[0] = pucColor[0] * pucColor[3] / 255; pucColor[1] = pucColor[1] * pucColor[3] / 255; pucColor[2] = pucColor[2] * pucColor[3] / 255; } } //画一画 image.Draw(GetDlgItem(IDC_V_H264_LOGO)->GetDC()->m_hDC,rect);
结果如下图所示:
相关推荐
用Cimage显示png图片,最简单的程序了。
利用强大的CImage类打开和保存jpeg、bmp、gif和png格式图片,有VC下的Demo。
CImage 1.3.3, 用C++模版技术设计的一个好用的图形库,支持BMP,JPG,PNG等多种格式,只有一个头文件,使用相当方便。
MFC中基于CImage类在静态控件上显示图片,我目前使用的是VS2012,不知道和其他编程版本上是否存在问题,如果存在兼容问题,也可以直接打开CImageBaseMfcDlg.cpp文件,直接查看程序,通过参考应该能够顺利实现在静态...
使用CImage类处理图像显示与格式转换 使用CImage类处理图像显示与格式转换
CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。例如通过简单的几句,就可以实现CImage类和CBitmap类实例的:
利用CImage类读取png格式的图片生成精灵动画 /* 写此代码是为了教学所用,因为在网络上找了很久都没有找到一个利用CImage类来实现精灵动画的源码。图片使用的是网络资源,如有侵权,请联系成都信息工程学院计算机...
用MFC的CImage类完成图像的显示和保存是VC图像处理最基础工作。
MFC对话框显示图像,通过一个按钮,打开磁盘上的图片,很不错的代码哦。
Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它...因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。 现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法.
Mfc图像处理框架 VC编程 图像显示与处理Cimage显示OPencv处理
vs2017 c++ mfc利用CimageDC 类 截屏显示保存文件 CWindowDC winDC(pWnd); pWnd->GetWindowRect(&rect); int nBPP = winDC.GetDeviceCaps(BITSPIXEL) * winDC.GetDeviceCaps(PLANES); if (nBPP < 24) { ...
CImage类源代码(C++) 可以使用该类直接对图片处理,可以任意角度旋转
CImage类的一些基础应用,包括载入BMP、PNG、GIF、JPEG等图片,图片灰度转换等等
这是一个使用CImage类处理图像显示与格式转换的源码程序,包含了许多可以让大家学习的内容
昨天为了使用CImage,上网搜了一些CImage资料,网上的大都是关于CImage介绍的那篇老长老长的文章,好多都转载,转来转去没一个实际有用的例子。我自己捣鼓了好一会才发现,CImage用起来这么简单
C++ CImage类,用于处理BMP格式图像。
MFC CImage加载图片a通道