PNG透明背景显示之路
来源:互联网 发布:青岛鹏为软件 编辑:程序博客网 时间:2024/05/17 00:10
使用CImage的一般方法
使用CImage的一般方法是这样的过程:
(1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:
#include <atlimage.h>
(2) 定义一个CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。
(3) 调用CImage::Draw方法绘制图像。Draw方法具有如下定义:
int nDestWidth, int nDestHeight, int xSrc, int ySrc,
int nSrcWidth, int nSrcHeight );
BOOL Draw( HDC hDestDC, const RECT& rectDest, const RECT& rectSrc );
BOOL Draw( HDC hDestDC, int xDest, int yDest );
BOOL Draw( HDC hDestDC, const POINT& pointDest );
BOOL Draw( HDC hDestDC, int xDest, int yDest,
int nDestWidth, int nDestHeight );
BOOL Draw( HDC hDestDC, const RECT& rectDest );
其中,hDestDC用来指定绘制的目标设备环境句柄,(xDest, yDest)和pointDest用来指定图像显示的位置,这个位置和源图像的左上角点相对应。nDestWidth和nDestHeight分别指定图像要显示的高度和宽度,xSrc、ySrc、nSrcWidth和nSrcHeight用来指定要显示的源图像的某个部分所在的位置和大小。rectDest和rectSrc分别用来指定目标设备环境上和源图像所要显示的某个部分的位置和大小。
需要说明的是,Draw方法综合了StretchBlt、TransparentBlt和AlphaBlend函数的功能。默认时,Draw的功能和StretchBlt相同。但当图像含有透明色或Alpha通道时,它的功能又和TransparentBlt、AlphaBlend相同。因此,在一般情况下,我们都应该尽量调用CImage::Draw方法来绘制图像。
现在简单介绍一下CImage图像的提取和显示,这个在很多的网站上都有讲述,随便都能找到的东西,我这里就不再详述,随便找了一个代码:
(1) 创建一个默认的单文档程序项目Ex_Image。
(2) 打开stdafx.h文件中添加CImage类的包含文件atlimage.h。
(3) 在CEx_ImageView类添加ID_FILE_OPEN的COMMAND事件映射程序,并添加下列代码:
{
CString strFilter;
CSimpleArray<GUID> aguidFileTypes;
HRESULT hResult;
// 获取CImage支持的图像文件的过滤字符串
hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,
_T( "All Image Files") );
if (FAILED(hResult)) {
MessageBox("GetExporterFilter调用失败!");
return;
}
CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
if(IDOK != dlg.DoModal())
return;
m_Image.Destroy();
// 将外部图像文件装载到CImage对象中
hResult = m_Image.Load(dlg.GetFileName());
if (FAILED(hResult)) {
MessageBox("调用图像文件失败!");
return;
}
// 设置主窗口标题栏内容
CString str;
str.LoadString(AFX_IDS_APP_TITLE);
AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName());
Invalidate(); // 强制调用OnDraw
}
(4) 定位到CEx_ImageView::OnDraw函数处,添加下列代码:
void CEx_ImageView::OnDraw(CDC* pDC)
{
CEx_ImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!m_Image.IsNull()) {
m_Image.Draw(pDC->m_hDC,0,0);
}
}
(5) 打开Ex_ImageView.h文件,添加一个公共的成员数据m_Image:
public:
CImage m_Image;
(6) 编译并运行。单击"打开"工具按钮,在弹出的对话框中指定一个图像文件后,单击"打开"按钮,其结果如图7.21所示。
如果这个时候加载透明图层,一般情况是不会显示透明背景的(我想能看到这里的朋友都是为透明所困的人吧),我也是卡在这里很长时间,查阅了大量的资料和网上跑了很多网站,都没有得到满意的答复,以下有些网站资料可以参考:
供CImage类显示的半透明PNG文件处理方法
在高兴之余,也很不理解
使用CImage类如何显示背景是透明的png格式图片
在网上搜索的结果让人感到很失望,我也开始思考是不是要用其他的方法来处理图片的透明,因为我原来写游戏都一直使用SDK的,在9.0的SDK中绘制透明PNG格式是支持透明的,为什么在2003的.net里他就不支持了呢?我觉得这个问题并不是CImage本身的处理能力问题,而是有的地方我们并设置好。先做一个实验:我调入一张带有透明背景图片,然后通过CImage保存成新的一张PNG,用PHOTOSHOP打开发现背景依然是透明的,这证明我的猜想是正确的,但是为什么就是不显示透明呢?我开始反复查阅MSDN,试图找到问题的根本原因。
在MSDN种介绍CImage::Draw 的段落并不多,如果在编译应用程序时将 _WIN32_WINNT 的值设置为等于或大于 0x0500,则 Draw 将在运行 Windows 2000 和 Windows 98 以及更高版本的系统上自动处理透明。它在 Windows NT 4.0 和 Windows 95 上同样有效,但没有透明支持。我们现用的系统是XP,按照MSDN说的,应该是自动处理透明,为什么我们就不自动呢?其中一句话引起了我的注意 如果编译应用程序时将 _WIN32_WINNT 的值设置为小于 0x0500,则 Draw 有效,但它在运行 Windows 2000 和 Windows 98 以及更高版本的系统上将不自动处理透明 这句话在本文开篇的时候我已经用蓝色标注出来了,这行字是Draw是否自动处理透明的关键,但是我早就把_WIN32_WINNT改成0x0500了,为什么还不行呢?我又重新查看了stdafx.h中需要修改的部分:
WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
_WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。
_WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。
这里的3个版本相关的内容,但是MSDN上只让我们修改了一出处,是不是问题出在这里呢?修改一下就知道了。
#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。
#define _WIN32_WINNT 0x0500 // 为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。
#define _WIN32_WINDOWS 0x0510 //为 Windows Me 及更新版本改变为适当的值。
#endif
编译原来的程序通过,打开带有半透明背景的图片,马上显示背面的网格,OK!问题找到了!打开透明的怎么样呢?结果令人失望,大片的透明背景被绘制成了白色背景,似乎还是没有解决好啊,再看看MSDN,里面有一个TransparentBlt绘制透明,他不是把透明变成白色的了吗?TransparentBlt里面的关键色改成白色绘制,哈哈,透明的图片出来了。
总结一下:
1.设置_WIN32系统,确保生成的程序支持透明(主要是WINVER)
2.用TransparentBlt输出透明图片,关键色定为白色
- PNG透明背景显示之路
- PNG透明背景显示之路
- pys60之背景透明png
- png 设置透明背景
- IE6下PNG背景透明的显示问题解决方案
- IE6下PNG背景透明的显示问题
- IE6显示png透明背景、图片的方法
- IE6显示png透明背景、图片的方法
- IE6显示png透明背景、图片的方法
- IE6下PNG背景透明的显示问题
- (转)CImage显示透明背景的PNG图片
- 显示透明PNG图片
- CImage显示透明PNG
- png IE设置透明背景
- ie6 下png背景透明
- vb.net简单实现透明窗体显示出背景透明的png
- CSS透明及PNG背景透明处理
- png显示黑色背景
- Good blogger (20070305)
- 如何在LR中做关联-Zee
- 读书笔记《Mastering Regular Expressions》(一)
- 可爱的 Python: Decorator 简化元编程
- asp 需要掌握的常用函数
- PNG透明背景显示之路
- 上传文件时判断文件夹是否存在
- 图灵程序设计图书新书发布台
- 使用Oracle的PL/SQL发送Email
- IBM SOA 解决方案设计师认证考试准备,第 1 部分:SOA 最佳实践
- 30岁前男人需要完成的事
- Why this code compile OK, but throw ClassCastException at run time?
- 开发基于 Ajax 的用户注释系统
- 认识 Atom 发布协议,第 1 部分:使用 Atom 发布协议创建和编辑 Web 资源