用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