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

系统环境:Windows 7
软件环境:Visual Studio 2008 SP1
本次目的:实现VC单文档、对话框程序显示图片效果

      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 ;
步骤二:在对话框的实现函数OnPaint()函数里面

void CTestDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CPaintDC dc(this);        
        if(!img.IsNull()) img.Destroy();
        img.Load(_T("图片3.png"));             
        if(!img.IsNull()) img.Draw(dc.m_hDC, 0, 0);     
        CDialog::OnPaint();        
    }
}

完成。上述可实现对话框显示大多数图片。

      特别注意,只有用Load()方式才能打开其他的图片格式,若是用资源加载的方式,则显示不出。下面介绍一种让PNG透明显示的方法:

if(!img.IsNull())img.TransparentBlt (dc.m_hDC,0,0,img.GetWidth(),img.GetHeight(),RGB(255,255,255));

一般透明色为白色,即只需要把关键色设置为白色即可。网上有很多相关的资料,可以参考一下:
使用CImage显示透明的PNG图片 http://blog.csdn.net/wormsun/archive/2008/11/13/3293741.aspx PNG透明背景显示之路 http://m9551.blog.sohu.com/29092953.html 
CImage http://hi.baidu.com/cauciee/blog/item/3053490994877438e8248822.html

时间: 2024-09-27 02:37:40

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

强大的CImage类

这下有了CImage类,处理其他类型的图片不再寻找第三方类库了.加载到对话框背景的代码如下:  //从资源里载入背景JPEG图片 HRSRC hRsrc=::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_JPG1), _T("JPG")); if(hRsrc!=NULL) { HGLOBAL hImgData=::LoadResource(AfxGetResourceHandle(),hRsrc); if(hImgDa

mfc-MFC中使用CImage类进行图片显,draw函数不显示图片

问题描述 MFC中使用CImage类进行图片显,draw函数不显示图片 代码: CImage image;//创建图片类 image.Load(_T("122.bmp"));//加载图片文件 CRect rect;//定义矩形类 int cx=image.GetWidth();//获取图片宽度 int cy=image.GetHeight();//获取图片高度 GetDlgItem(IDC_Picture)->GetWindowRect(&rect);//将窗口矩形选中到

C#调用C++ dll CImage类

问题描述 小白一个,想把一个C++写的图像处理的程序通过DLL在C#里调用.有点疑惑的是C++程序里用CImage类进行图像的载入.处理.显示等操作,有哪些方法能够把处理后的图形数据在C#里读取并显示出来呢?(C#直接调用C++程序的显示方法试过了,是不行的)网上找了些方法,比如http://bbs.csdn.net/topics/390389519这里说的句柄,或者是http://blog.csdn.net/devcopper/article/details/12647663使用C#从内存里获

python pyq...-pyqt5自动生成界面类无法显示,请大牛们帮帮忙!!

问题描述 pyqt5自动生成界面类无法显示,请大牛们帮帮忙!! 本人新手,采用Qt Designer自动生成界面类Ui_MainWindow后,采用下面两种方法结果为何不同,其中通过多重继承来显示界面的方法却没有显示预期效果,问题在哪里,纠结了好几天了!!请大牛们帮帮忙!!

图像处理-图像数据怎么从内存加载到CImage类,哪个函数可用?

问题描述 图像数据怎么从内存加载到CImage类,哪个函数可用? 比如说现在有个RGBQUAD类型的数组,怎么把里面的图象数据转换成CImage类图像,难道只有用指针循环取像素值然后赋值吗? 解决方案 RGBQUAD类型不知道你说的是什么,但是CImage其实就是内存中的一种. 解决方案二: CreateDIBitmap () ??

findnextfile-VC++中用CFileFind类的FindFile和FindNextFile实现图片文件的浏览

问题描述 VC++中用CFileFind类的FindFile和FindNextFile实现图片文件的浏览 我是在做一个图片浏览器.有一个功能是下一张图片,代码如下.其中Strpath是上一个文件的路径,现在我按了下一张按钮,想显示同一文件夹下的下一个图片文件.始终都不能实现,显示的一直是前一张图片,也就是说按下一张按钮没反应.大家帮帮忙,谢谢了. void CImage_ProcessingDlg::Onnextimage() { // TODO: Add your control notifi

在swt的canvas中,加载的图片大于窗口,并且在图片上画了一些图形,怎么在canvas中才能够获得完整的图片(目前只能获得当前窗口显示的区域的图片)

问题描述 如果按照加载进去的图片的大小来获得图片,会把canvas窗口外的区域也获得.而不是完整的加载进来的图片. 解决方案 解决方案二:我对canvas也不明白,聆听专家指教..期待中....解决方案三:加载图片的代码是什么?那里返回的是个啥东西?应该从它获得一些资料.解决方案四:顶下,解决方案五:不知道解决方案六:路过解决方案七:再顶下解决方案八:引用楼主dalu2290的帖子: 如果按照加载进去的图片的大小来获得图片,会把canvas窗口外的区域也获得.而不是完整的加载进来的图片. 不好意

android-如何在安卓中显示一组可切换图片

问题描述 如何在安卓中显示一组可切换图片 我最近遇到一个安卓的问题: 当我需要在一个Activity里面显示一组图片,而且: 1. 能用手势切换图片: 2. 图片不能是预先加入资源的那种,因为图片来自网络,不能预先加入工程,是动态的: 3. 点击居中的图片能响应. 查了一下网上,有人说用Gallery,又有人说Gallery过时了,不推荐.也有人用Fragment,但是看起来代码有点复杂. 请教各位,可有什么简单容易的实现?万分感谢! 解决方案 用三四个fragment,实现异步加载,根据手势切

求大神帮忙-ViewPager滑动加载图片时,中间的图片正常显示,两侧的图片添加阴影效果,这个怎么实现啊????

问题描述 ViewPager滑动加载图片时,中间的图片正常显示,两侧的图片添加阴影效果,这个怎么实现啊???? 解决方案 感觉应该用gallery,然后在修饰边框透明度 解决方案二: 可以参考下这个https://github.com/TangKe/SlideMenu 里边有滑动加阴影的部分 解决方案三: css样式实现给图片添加阴影效果