用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程序中使用CImage类,必须包含ATL的图像头文件atlimage.h:(在VS08 SP1中不用包含)

#include <atlimage.h>

这是一个强大的图像处理类,下面分别详细介绍在文档、对话框下的显示图片。

对于单文档程序: 
步骤一:添加头文件(由于我使用的是VS2008SP1,所以我未添加上面的头文件。)
步骤二:在Doc头文件里面声明对象,如:CImage img ;
步骤三:在Doc实现函数里面的序列化Serialize函数

void CImagePNGDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: 在此添加存储代码
    }
    else
    {
        // TODO: 在此添加加载代码
        if(!img.IsNull()) img.Destroy();
        img.Load(ar.GetFile()->GetFilePath()); 
    }
}

步骤四:在视图View的实现文件OnDraw()里面

void CImagePNGView::OnDraw(CDC* pDC )
{
    CImagePNGDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

// TODO: 在此处为本机数据添加绘制代码    
    if(!pDoc->img.IsNull()) pDoc->img.Draw(pDC->m_hDC, 0, 0); 
}

完成,以上可以显示大多数的图片格式。

对于对话框程序: 
步骤一:在对话框的头文件声明一个对象,如:CImage img ;

步骤二:dlg上添加一个Picture Control,Type设置为Rectangle

步骤三:在对话框的实现函数OnPaint()函数里面(使用类向导重载OnPaint)

 1 void CDrawPictureDlg::OnPaint()
 2 {
 3     CPaintDC dc(this); // device context for painting
 4     CDialog::OnPaint();
 5     CDialog::UpdateWindow();// 更新windows窗口,如果无这步调用,图片显示还会出现问题
 6
 7     CImage img;
 8     if(!img.IsNull()) img.Destroy();
 9     img.Load(_T("E:\\visual studio 2010\\Projects\\LoadDllDemo\\img\\skin\\111.jpg"));
10     if(!img.IsNull())
11     {
12         CRect rect;
13         CDC *pDC = GetDlgItem(IDC_STATIC_PIC)->GetDC();
14         HDC hDC= pDC->GetSafeHdc();
15         GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);
16         img.Draw(dc.m_hDC, 0, 0);//直接在对话框上绘制图片
17         //img.Draw(hDC, 0, 0);//在PictureControl上绘制图片
18         ReleaseDC(pDC);
19     }
20 }

时间: 2024-08-24 09:43:26

用CImage类来显示PNG、JPG等图片的相关文章

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

原文链接: http://blog.sina.com.cn/s/blog_4070692f010003gy.html 前补:没想到这个帖子好像挺多人看哪……看来大家都被这个png郁闷的够呛.显示png的代码其实很简单的,声明个CImage 变量,在初始化时候用.Load()读取外部的png图片,然后在OnPaint()里面用.Draw()来绘制就可以了. 我把源代码放到mofile了,内不含可执行文件,如果信得过我就请下载来看吧 :) http://pickup.mofile.com/04604

CImage类

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

数字图像处理 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提供增强型的

使用MFC CImage类和GDI+ Image加载并绘制PNG图片

一.使用MFC CImage类加载PNG图片        为了测试CImage绘制PNG图片的效果,我们用截图软件截得一张360的界面,然后使用PhotoShop等工具在图片的周边加上了透明的区域,然后保存成PNG图片文件.CImage首先从文件中加载,即 CImage* m_pImgBk; ...... m_pImgBk = new CImage; m_pImgBk->Load( _T("res\\bk.png")); if ( m_pImgBk->IsNull() )

CImage类使用

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

CImage类的介绍与使用

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

使用MFC CImage类绘制PNG图片时遇到的问题

原文链接: http://blog.csdn.net/chenlycly/article/details/9193143 为了测试CImage绘制PNG图片的效果,我们用截图软件截得一张360的界面,然后使用PhotoShop等工具在图片的周边加上了透明的区域,然后保存成PNG图片文件.CImage首先从文件中加载,即 CImage* m_pImgBk; ...... m_pImgBk = new CImage; m_pImgBk->Load( _T("res\\bk.png")

CImage类提供了GetBits()函数原理及实现

CImage类提供了GetBits()函数来读取数据区,GetBits()函数返回的是图片最后一行第一个像素的地址,网上有人说返回指针的起始位置是不同的,有些图片返回的是左上角像素的地址,有些是左下角像素的地址,跟图片内部顺序有关.GetPitch( ) 图像的间距. 如果返回值为负,位图是一个从下到上 DIB,并且原点是左下角. 如果返回值为正的,位图是一组 DIB,并且原点为左上角两个函数GetPitch()和GetHeight()一起使用就可以得到图片数据取得起始位置 img_Data=(

用宏定义成员函数,VC6的类视图显示错误

用宏定义成员函数,VC6的类视图显示错误,实际函数可以使用. VC7没此问题. #define ConstGetMemFunMac2(varName,funName,retType)\ retType funName()const{return varName;}; class A { public: ConstGetMemFunMac2(m_x,GetX,int); int m_x; };