原地址:MFC中png格式圖片貼圖的實現
學vc,正在做五子棋,五子棋中的圖片格式都是bmp格式的,所以貼圖用CBitmap可以很簡單的實現。剛開始也沒有在意那么多,今天剛把五子棋做完就興沖沖的把代碼和release版本的exe文件發給我的指導老師看,發現我的文件相當大,所以指導老師給我指出了bmp格式的圖片比較占內存,讓我尋找一下png格式的貼圖。
於是我在網上搜索了大量的資料,看到了有用API OleLoadPicture來加載JPG、GIF格式的圖片,但是這種方法不支持png格式,並且GIF格式只能加載第一幀,所以決定放棄這種方法。還看到可以用庫CxImage,但是覺得這種方法比較麻煩,所以也決定放棄。看了很多種方法之后,看到有人說CImage類比較容易,所以打算嘗試一下。
經過閱讀網上的資料和方法,終於被我成功加載了一張png格式的背景圖片,下面我總結一下貼圖的步驟:
(1)首先在頭文件stdafx.h中包含
#include <atlimage.h>
(2)設置對話框與目標圖片一樣大小
CImage img; img.Load(_T("res/test.png")); //wuziqi.png是我要加載的圖片名稱,包含路徑 HBITMAP hbitmap = img.Detach(); //像操作 BMP 圖片一樣處理圖片 ,下面是顯示圖片的操作 CBitmap cBitmap; BITMAP bitmap; cBitmap.Attach(hbitmap); cBitmap.GetBitmap(&bitmap); m_rect.bottom = bitmap.bmHeight; m_rect.right = bitmap.bmWidth; MoveWindow(m_rect);
(3)在工程視圖文件的Ondraw/OnPaint函數中添加一下代碼:
CDC* pDC = GetDC();
CImage img;
GetClientRect(m_rect);
img.Load(_T("res/test.png")); //test.png是我要加載的圖片名稱,包含路徑 HBITMAP hbitmap = img.Detach(); //像操作 BMP 圖片一樣處理圖片 ,下面是顯示圖片的操作 CBitmap cBitmap; BITMAP bitmap; CDC memdc; cBitmap.Attach(hbitmap); memdc.CreateCompatibleDC(pDC); memdc.SelectObject(hbitmap); cBitmap.GetBitmap(&bitmap); pDC->StretchBlt(0, 0, m_rect.Width(), m_rect.Height(), &memdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
下面讓我們來看一下StretchBlt這個函數:
函數功能:函數從源矩形中復制一個位圖到目標矩形,必要時按目前目標設備設置的模式進行圖像的拉伸或壓縮。
函數原型:
BOOL StretchBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop );
參數:
hdcDest :指向目標設備環境的句柄。
nXOriginDest :指定目標矩形左上角的X軸坐標,按邏輯單位表示坐標。
nYOriginDest :指定目標矩形左上角的Y軸坐標,按邏輯單位表示坐標。
nWidthDest :指定目標矩形的寬度,按邏輯單位表示寬度。
nHeightDest :指定目標矩形的高度,按邏輯單位表示高度。
hdcSrc :指向源設備環境的句柄。
nXOriginSrc :指向源矩形區域左上角的X軸坐標,按邏輯單位表示坐標。
nYOriginSrc :指向源矩形區域左上角的Y軸坐標,按邏輯單位表示坐標。
nWidthSrc :指定源矩形的寬度,按邏輯單位表示寬度。
nHeightSrc :指定源矩形的高度,按邏輯單位表示高度。
dwRop :指定要進行的光柵操作。光柵操作碼定義了系統如何在輸出操作中組合顏色,這些操作包括刷子、源位圖和目標位圖等對象。
我暫時只加載了png格式的圖片,至於其他格式的圖片的加載是否也能完全參照這個步驟來完成還有待考證,我看到網上說用這個方法gif不能動態的顯示,希望大家看到后找到解決方案的能多多指導我。在這里我先謝謝各位了。