1. 程式人生 > >用CImage類來顯示PNG JPG等圖片

用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

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed