文档章节

CImage 对话框初始化时候显示透明 PNG

雷霄骅
 雷霄骅
发布于 2014/08/16 13:48
字数 569
阅读 53
收藏 1

使用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);


结果如下图所示:



本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/12979337

雷霄骅

雷霄骅

粉丝 213
博文 419
码字总数 2129
作品 4
朝阳
程序员
私信 提问
加载中

评论(0)

用CImage类来显示PNG、JPG等图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/akof1314/article/details/5167279 系统环境:Windows 7 软件环境:Visual Studio 2008 SP1 本次目的:实现V...

无幻
2010/01/10
0
0
【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类

本系列文章由zhmxy555编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7422922 作者:毛星云 邮箱: happylifemxy@qq.com 欢迎邮件交流编程心得 我们知道,Visual C+...

长平狐
2012/11/12
284
0
CImage从资源中加载图片文件

CImage从资源中加载图片文件 CImage直接加载图片文件倒是好办,直接用Load函数就可以,但是如何从工程资源中添加jpg、gif、png等图片呢?用下面这个函数BOOL CDDCDlg::LoadImageFromResource...

霄霄月月
2012/10/01
1.3K
2
error RC2170: bitmap file xxx.png is not in 3.00

VS2010 error RC2170: bitmap file xxx.png is not in 3.00 format这个算是VS2010的一个Bug,对于不能识别的资源,添加的时候,VS会弹出一个对话框让你填类型,这个类型其实是字符串表示,而...

nao
2014/05/13
670
0
【译】TetroGL: An OpenGL Game Tutorial in C++ for Win32 Platforms - Part 2 (下)

原文链接:TetroGL: An OpenGL Game Tutorial in C++ for Win32 Platforms - Part 2 CImage类 现在我们来看看CImage类究竟是如何使用纹理图片的.早前已经看到,用户无法直接对CTexture对象进行...

嗯哼9925
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

21天完美搞定Vue框架技术(第3天)

前言: 上一节我们主要学的是【选项合并】,了解了初始化阶段各个选项的合并策略, 本节课我们来学一下【数据代理】这个知识点。 1、数据代理的定义 数据代理,也叫作数据劫持。有两个核心作...

有鱼是只猫
35分钟前
39
0
OSChina 周二乱弹 —— 一山里不容二猫

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《数え歌》- 池田綾子 手机党少年们想听歌,请使劲儿戳(这里) @诺墨 :哈哈哈哈...

小小编辑
49分钟前
43
1
敏捷开发验收评审会议

迭代验收评审是Scrum中的重要活动之一,迭代验收评审会议召开过程是否符合敏捷原则,实践是否贴近实际,参照以下:要点一:参加迭代验收评审会议的角色是否完整和投入 ●敏捷团队所有...

沐沐爸比
今天
43
0
js 获取文件本地内存路径

URL.createObjectURL(file)

DrChenXX
今天
51
0
CentOS 6.5 安装 Hadoop 集群【未完】

1、安装 CentOS 6.5 2、关闭 iptables 3、关闭 suliunx 4、修改 IP 4、修改 hostname 5、修改 hosts 6、SSH 免密 7、JDK(1.8)安装 华为镜像直达 8、...

产品哥
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部