CImage 对话框初始化时候显示透明 PNG
来源:互联网 发布:淘宝购物返利群 编辑:程序博客网 时间:2024/06/05 15:41
使用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值都变成0for(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 对话框初始化时候显示透明 PNG
- CImage 对话框初始化时候显示透明 PNG
- CImage显示透明PNG
- 使用CImage显示透明的PNG图片
- 利用CImage显示透明PNG图片
- 使用CImage显示透明的PNG图片
- 使用CImage显示透明的PNG图片
- 利用CImage显示透明PNG图片
- 关于CImage和AlphaBlend的透明PNG图片显示问题
- (转)使用CImage显示透明的PNG图片
- (转)CImage显示透明背景的PNG图片
- CImage 加载透明PNG图片
- 显示透明PNG图片
- VC++使用CImage PNG转BMP图片透明背景处理
- 显示透明的PNG图片
- OpenGL如何显示透明PNG
- 用CImage类来显示PNG、JPG等图片
- Linux之fork函数
- linux tar命令
- java_面向对象
- 容器链表中splice()、merge()、insert()方法的区别
- 每日一算法 A^B Problem
- CImage 对话框初始化时候显示透明 PNG
- 云技术:弹性计算ECS
- SQL学习整理(1)
- Java基础----使用BigDecimal进行精确运算
- JavaScript
- java面向对象之条件语句的运用
- leetcode implement strStr
- android中上下文菜单的创建-----比如长按某个按钮删除数据
- jqueryui的button组件