zoukankan      html  css  js  c++  java
  • 用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

  • 相关阅读:
    gulp和webpack的区别和联系
    Cesium-CesiumWidget, Viewer, Scene三者之间的关系
    node-gpy
    Cesium与Threejs结合
    【每日一具1】Morin 魔音一款支持手机、电脑的音乐软件,全网歌曲免费听/下载
    Python网络爬虫(实践篇)
    Python网络爬虫(浏览器伪装技术)
    Python网络爬虫(理论篇)
    【每日一具1】Morin 魔音一款支持手机、电脑的音乐软件,全网歌曲免费听/下载
    永久免费,搞定全网音乐!
  • 原文地址:https://www.cnblogs.com/lidabo/p/3489599.html
Copyright © 2011-2022 走看看