vc 显示PNG

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

转载地址:http://blog.csdn.net/happy5856/article/details/2626509


Graphics  graphics(GetDC()-> m_hDC); Image  image(L"walkman.png",  FALSE); graphics.DrawImage(&image,  10,10, 100, 100);

 在VC7.1中 MFC图形处理类里有一个强大的成员---CImage,这个类提供了从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。例如,CImage::PlgBlt和CImage::MaskBlt只能在 Windows NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。CImage::AlphaBlend和CImage::TransparentBlt也只能在 Windows 2000/98或其更高版本中使用。即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用

新一篇: 在mfc编程中创建web风格的图形用户界面(一)

 

使用CImage的一般方法  使用CImage的一般方法是这样的过程:  (1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:#include <atlimage.h>  (2) 定义一个CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。  (3) 调用CImage::Draw方法绘制图像。Draw方法具有如下定义:

BOOL Draw( HDC hDestDC, int xDest, int yDest,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事件映射程序,并添加下列代码:

void CEx_ImageView::OnFileOpen(){ 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里面的关键色改成白色绘制,哈哈,透明的图片出来了。


MFC笔记九:界面美化--用图片作为界面背景和设置控件背景透明 设置图片作为界面背景 1.找到一张图片,放在res文件夹下 2.通过类向导添加成员变量CBrush m_brush 3.在OnInitDialog()后面加上如下代码,若没有OnInitDialog函数,通过类向导-->虚函数 添加 CString strBmpPath = _T(".\\res\\background.jpg"); CImage img; img.Load(strBmpPath); //MoveWindow(0, 0, img.GetWidth(), 阅读详情

相关推荐

VC2019 使用GDI+ 显示PNG图片

新建一个单文档工程; 添加一个菜单;在视类中处理此菜单; 视类CPP文件添加: #include "gdiplus.h" 视类.h文件添加成员: ULONG_PTR m_gdiplusToken; 视类.h文件头部添加: #pragma comment(lib,"gdiplus.lib") 这是载入GDI+的库; gdiplus.h,在 外部依赖项...

bcbobo21cn的专栏 2342

VC中GDI方法在Picture控件中显示PNG、bmp、jpg图片

vc中在Picture空间中显示png图片,使用重载OnPain和对话框背景色覆盖原图的方法实现了png半透明的显示并且不会加重阴影。支持bmp、jpg等多种格式

图像处理:在C/C++中实现图像部分透明化

通过使用图像处理库(例如OpenCV),我们可以读取输入图像,创建掩码图像来指定透明化区域,并将掩码应用到输入图像上,从而实现图像的部分透明化效果。这种技术在图像合成、图像叠加等应用中非常有用,可以为图像处理任务增加更多的灵活性和创造力。在图像处理中,一项常见的任务是将图像的部分区域设置为透明,以实现图像叠加、图像合成等效果。你可以从互联网上找到一张你喜欢的图像,或者使用自己的图像。然后,我们创建了一个与输入图像大小相同的掩码图像,使用。函数将掩码应用到输入图像上,实现图像的部分透明化。

qq_39605374的博客 799

PNG透明背景显示之路

 在VC7.1中 MFC图形处理类里有一个强大的成员---CImage,这个类提供了从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。例如,CImage::PlgBlt和CImage::MaskBlt只能在 Windows NT 4.0 或更高版本中

永远在跟随,从未去超越 6224

MFC通过CImage绘制透明图层的png图片

参考:https://blog.csdn.net/u013472838/article/details/80519525 https://blog.csdn.net/zhongbin104/article/details/8730935 https://blog.csdn.net/u011711997/article/details/52551106/ 一、Cimage类的介绍及使用 详细...

fengruoying93的专栏 3458

VC6.0显示透明PNG图片

VC做界面难免会遇到要用图片做界面,但VC6显示透明PNG还是非常费劲的,本文向大家介绍如何用CxImage类实现Static控件显示透明PNG1.创建一基于对话框的MFC工程2.新建类CMyStatic继承CStatic,源码如下:MyStatic.h#if !defined(AFX_MYSTATIC_H__384ED2FD_4979_4F49_A362_EF7AEFA836B4__INCLU

Jinhill's Blog 7747

VC透明显示带透明度PNG图片及不带透明度的图片

一、显示带透明度的PNG图片 PNG图片的透明背景总是一片白色,后来才发现这其实是微软GDI+的设计问题,PNG图片是ARGB,使用GDI+载入图片的时候,GDI+会默认已经进行了预剩运算(PARGB),即每象素的实际值是已经和ALPHA值按比例相乘的结果,实际上它根本就没有做预乘,在使用透明图片的象素ALPHA通道的时候,CImage内部正是调用的AlphaBlend,没有预乘的图当作预乘的图

itjobtxq的专栏 4756

vc win32 gdi+ 怎么显示PNG图片

<br />各位大哥看看,为什么我显示PNG图片有黑框???PNG图片的边缘为渐变透明的。渐变透明的地方变成了黑框<br />BOOL OnEraseBkgnd()<br />{<br /> HBITMAP hBitmap;<br /> BITMAP m_bitmap;<br /><br /> hBitmap=LoadImgFormRs(IDR_PNG_StatusBar,L"PNG");<br /> GetObject(hBitmap,sizeof(BITMAP),&m_bitmap); <br /><

kyoforking1的专栏 2473

VC利用GDI+显示透明的PNG图片

  VC利用GDI+显示透明的PNG图片2008年12月23日 星期二 20:44        GDI+在原来GDI的基础上进行了许多的升级和优化,比如线条平滑、颜色透明度、图形变换(平移、缩放、旋转),更多图片格式支持等技术都进行了很大的 改善,使用GDI+可以很方便的实现对各种图形的绘制和优化。       GDI+属于.NET组合,不过VC6.0的朋友也可以很方

churenxh的专栏 2745

vc6实现png图像文件的显示方法

vc6本身不会提供对png图像文件的显示支持,在这篇文章中谈谈怎样借用libpnp开源代码来实现这一点。

sstower的专栏 6266

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

用CImage类来显示PNG、JPG等图片 2011-09-23 15:40 系统环境:Windows 7 软件环境:Visual Studio 2008 SP1 本次目的:实现VC单文档、对话框程序显示图片效果       CImage 是VC.NET中定义的一种MFC/ATL共享类,也是ATL的一种工具类,它提供增强型的(DDB和DIB)位图支持,可以装入、显示

753

用CImage类来显示PNG JPG等图片

用CImage类来显示PNG JPG等图片

qq_43667968的博客 377
上一篇: unresolved external symbol __endthreadex错误解决
下一篇: 修改主窗口风格
yyxaf
博客等级 码龄17年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值