使用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相关推荐

  1. vc可以实现对话框里显示html文档内容,也可以显示word内容吗,VC6中使用CHtmlView在对话框控制中显示HTML文档...

    VC6中使用CHtmlView在对话框控制中显示HTML文档 2008-02-23 05:29:58来源:互联网 阅读 () 在Visual Studio 6.0中出现了一个新类CHtmlView,利 ...

  2. 显示透明的PNG图片

    微软提供了CImage类,使用CImage可以非常方便显示PNG图片. 1.定义一个成员变量 CImage m_img; 2.导入png void LoadPNG(CImage &cimg, ...

  3. windows桌面待办事项_记录在电脑便签中的内容怎么在电脑桌面显示透明日历清单?...

    敬业签是一款能将便签和日历结合在一起的电脑便签软件,其有日历月视图,通过日历月视图可以查看月份中记录的各项待办事项,如果想找一款带有日历的便签软件,可以选择使用敬业签. 当在电脑上使用敬业签时,记录在 ...

  4. vc++ 6.0对话框上无法显示中文(乱码)

    是英文版的vc++,建立mfc向导时无法选择中文,到对话框里面改成中文还是乱码,怎么版啊 问题补充: 一般对话框是可以的,就是那个CPropertyPage 不可以对话框资源选成中文以后要ReBuil ...

  5. MFC子对话框初始化问题_从一个“断言”报警说起

    1.问题描述 在进行MFC开发时,希望将界面变得美观.因而调整了一下对话框上的字体与颜色.如果仅有一个对话框,那么直接把这些初始化的代码放到OnInitDialog()函数中就好.然而,我们会发现,利 ...

  6. MP-Ukagaka伪春菜插件扩展:在对话框用iframe显示链接

    MP-Ukagaka伪春菜插件写了个Javascript扩展:在对话框用Iframe显示链接. 调用方法: displayLinkInBox(对象,显示方式) 如:displayLinkInBox(t ...

  7. CAD进入选择状态前后对话框隐藏与显示(对话框发消息)

    CAD进入选择状态前后对话框隐藏与显示(对话框发消息) 1.通过ObjectArx 的 BeginEditorCommand() 及CompleteEditorCommand() void CModa ...

  8. MFC 显示透明png图片

    工作需要又得使用MFC编调试软件. 需要载入一张公司的logo,透明PNG图片. 查了很多资料都没显示,也不想使用其他类.最后用Cimage基本解决. 1.在对话框类的头文件中定义: [cpp] vi ...

  9. OSG中使用png图片显示透明效果

    常见的几种图片格式中只有png格式和gif格式的图片会有透明效果,其他图片格式都会使用白色作为底色.下面是使用OSG实现png纹理透明效果的代码,使用gif格式的图片也可以,注意:图片必须首先有透明的 ...

最新文章

  1. C++ Double Ended Queues(双向队列)
  2. 访问控制 - C++快速入门18
  3. Java中ArrayList最大容量为什么是Integer.MAX_VALUE-8?
  4. sql like 多条件
  5. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
  6. 00后感兴趣的“微醺生意”,居然被这位70后老兵做成功了?
  7. Fedora 35安装 VMware Workstation 16.1.2并解决报错:efore you can run VMware several modules must be compiled
  8. 计算机右键管理删除,使用QQ计算机管理器删除右键菜单中的多余项。doc
  9. nfs linux系统服务,Linux系统服务搭建之NFS
  10. [有限元] Ansys Workbench 实现 Edge 的分段 Pressure 的方法:SpaceClaim 中使用分割面
  11. 数值分析:插值与拟合
  12. 员工需签军令状放弃年终奖?传小米推出特殊激励计划 官方回应...
  13. 艾伟_转载:.NET Discovery 系列之二--string从入门到精通(勘误版下)
  14. python装饰器的应用案例
  15. 开源免费CRM云端的客户管理系统SuiteCRM简介(视频)
  16. 摄像头各参数的意义_摄像机参数详解—九大参数介绍
  17. 安卓推送、android文本推送、安卓富媒体推送解决方案
  18. c语言 类型、运算符、表达式
  19. [BJOI2019]勘破神机(斯特林数,数论)
  20. 基于MatlabSimulin的微电网模型及光伏电池建模仿真分析

热门文章

  1. VS2008下, Microsoft AJAX 组件开发单独js智能提示
  2. UVA983 Localized Summing for Blurring【前缀和+最大子段和+DP】
  3. HDU2098 分拆素数和【筛选法】
  4. advanced ip scanner —— 局域网下 ip 及设备的扫描
  5. utilities(C++)——枚举
  6. Python 基础 —— 文件
  7. python下载步骤-python3.8下载及安装步骤详解
  8. 从零开始学习python编程-新书推荐《Python3.7从零开始学》来了
  9. python是什么意思中文、好学吗-爬虫Python入门好学吗?学什么?
  10. python语言-Python 条件语句