供CImage类显示的半透明PNG文件处理方法

原文链接: http://blog.sina.com.cn/s/blog_4070692f010003gy.html

前补:没想到这个帖子好像挺多人看哪……看来大家都被这个png郁闷的够呛。显示png的代码其实很简单的,声明个CImage 变量,在初始化时候用.Load()读取外部的png图片,然后在OnPaint()里面用.Draw()来绘制就可以了。

我把源代码放到mofile了,内不含可执行文件,如果信得过我就请下载来看吧 :)

http://pickup.mofile.com/0460431090939353

文件名:MFCHello.rar

尺寸:41KB

另外,不要指望CImage.LoadFromResource那个废柴函数……跟踪进去看看就会看到其实是调用的Windows Management的LoadImage。这个函数说明第一行如下:

The LoadImage function loads an icon, cursor, animated cursor, or bitmap.

根本就不支持bmp以外的图片类型!


用CImage类可以在MFC里显示半透明图片,这比起那些CBitmap、掩膜掩码之类的东西可以好太多了。网上一搜“VC”“半透明”“PNG”,大堆资料,但是都是泛泛谈到CImage支持PNG半透明,多余一点没说,就好像吃饭那么简单的事情一样根本没必要说。。。

但是捏,我去用CImage做的时候,做好的PNG明明背景是透明的,程序也没有问题,甚至跟踪到了::AlphaBlend(..) ,但是显示的图片就是底色纯白。不要说半透明,连全透明都没有 。。到这一步我还能做什么?

后来找来一个别的网页的Logo,是PNG格式的。在Photoshop里面看了看,背景也是透明的,就试试吧。果然有结果了!Logo文字附近经过羽化的地方是半透明的,而没有任何背景色的纯透明部分却是显示成白色的……这意味着什么呢?


尝试一下:

1. 在PS中新建文件,背景色选 透明

2. 正常贴进去图片后,新建一个图层。把新建图层挪到最下面,用黑色填充,再把图层透明度设置为1%;附带一提,我给中间那个“阴影层”设置的透明度是30%。好了,保存成png,没什么特别的地方了。

3. 效果呢,这样的!半透明成功!!!  别说我图片底色发白,所以显示的不是半透明...底色换成别的颜色一样可以透出来的 

附录:这是我做的png,可以右键另存吧。不过因为图层都合并了,没什么参考价值。仅仅是CImage能用罢了。



结论:大概是纯透明的背景反而被当成不透明了吧……不知道是故意这么设置还是bug来着,反正是给我找了不少麻烦。而且也没找到解决的资料,郁闷。所以放出来共享,不知能不能在某年某月某日被谁搜索到……凄凉啊……

时间: 2024-08-01 14:52:52

供CImage类显示的半透明PNG文件处理方法的相关文章

安卓 SD卡写入文件后不能立即显示被写入的文件解决方法

每次通过输出流往SD卡写入文件,连接上电脑,用MTP的方式模拟一个移动磁盘,打开磁盘却没有这样一个文件,而通过adb的方式查看就有,造成这个现象的原因是,每次写入之后,MTP的数据库并没有更新,因为更新一次MTP数据库需要的带价比较大,所以只有在重启,挂载和用户手动发送Intent出发,故存入文件后需要手动发送Intent广播,出发一下MTP数据库的更新. /** * 出发扫描 mtp下的文件,在保存文件到 sd卡下后,不能显示,故这里触发一下扫描机制,让手机连上电脑后,就可以读出文件了 * @

iOS加载并显示bundle的.txt文件的方法

- (void)jiazaitxt{ self.myWebview = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height+60)]; //    myWebView.delegate = self; //NSString   *path = [NSString stringWithFor

数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)

引入CImage类的原因 原有的CBitmap 类只能处理BMP格式的图片,非常受限.而CImage可以处理JPGE.GIF.BMP.PNG等多种格式图片,扩展了图片处理功能且能与CBitmap 进行转换( 因为所载入的位图句柄都是HBITMAP,所以可相互转换),因此引入CImage类进行图像处理. CImage类简介 CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG.GIF.BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换. CImage提供增强型的

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

CImage 是VC.NET中定义的一种MFC/ATL共享类,也是ATL的一种工具类,它提供增强型的(DDB和DIB)位图支持,可以装入.显示.转换和保存多种格式的图像文件,包括BMP.GIF.JPG.PNG.TIF等.CImage是一个独立的类,没有基类.(CImage类是基于GDI+的,从VC.NET起引进,VC 6.0中没有.)ATL (Active Template Library,活动模板库)是一套基于模板的 C++ 类,用以简化小而快的 COM 对象的编写.为了在MFC程序中使用CI

CImage类的介绍与使用

程序代码下载处:http://download.csdn.net/source/2098910 下载处:http://hi.baidu.com/wangleitongxing/blog/item/9063b03e5e20f3c97c1e71c8.html 备注:这个程序是在xp系统,vs2008下做的,当初測试没出什么问题. 昨天(2014-11-11)我下了程序在win7以下測试,出现了评论里说的问题,解决方法我已经写在评论里面了.主要是由于路径的问题.大家參照着改动測下应该就没问题了. Vi

CImage类

https://www.baidu.com/link?url=NUpABnCOzr-DHBL225vaREsRcKSFhI1ejA9I67GNiHhnGNxXlKdkZfc9ghWFu7EnkK8wVa2ockJ8q-D47YF4zuzdzoldA9CxsSzV4kqrSgu&wd=&eqid=c5b9143800018ffc0000000359ba9114 http://blog.csdn.net/shuilan0066/article/details/7080244 前言       

java类文件结构(字节码文件)

[0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构  的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编号,不关乎博文内容: [1]类文件概述 1)各种不同平台的虚拟机与所有平台都统一使用存储格式--字节码,他是构成平台无关性的基石: 2)时至今日,商业机构和开源机构已经在 java语言外发展出一大批在 jvm 上运行的语言,如 Groovy, JRuby, Jython,Scala等: 3)实现语言无关性的基

CImage类使用

前言          CImage类是基于GDI+的,但是这里为什么要讲归于GDI? 主要是基于这样的考虑: 在GDI+环境中,我们可以直接使用GDI+ ,没多少必要再使用CImage类 但是,如果再GDI环境中,我们要想使用GDI+,有点麻烦,还得加入头文件,加入启动GDI+的代码和关闭GDI+的代码,显得太罗嗦了,GDI  的CBitmap 处理功能又有局限,只能处理BMP格式的图片. 怎么办?这时,我们便可使用CImage类,因为这个类本身封装了GDI+得使用环境,所以无需我们手动设置,

TERSUS画画一样开发软件 显示元件介绍-图片图标类显示元件

TERSUS无代码手机电脑管理类软件开发,其中可拖放使用的图片图标类显示元件包括:图片显示元件(Image).通用显示块元件(HTML Tag). 图片显示元件(Image):显示图片用,直接指定所要显示的图片的地址,在属性中定义图片样式即可. 1.图片源文件可以是项目文件夹中图片文件夹中的图片,自定义的图片可以存入此文件夹,也可以在文件夹中放下一层文件夹并义所需图片放入: 2.地址可以以常量形式定义,拖放一个字符常量元件,用地址来命名此常量的名称,然后传值给图片<Caption>变量即可,也