標籤:
原地址: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)在工程視圖檔案的Ondraw函數中添加一下代碼:
CImage img; HRESULT ret = img.Load(_T("res/wuziqi.png")); //wuziqi.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,800,590,&memdc,0,0,800,590,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 :指定要進行的光柵操作。光柵作業碼定義了系統如何在輸出操作中組合顏色,這些操作包括刷子、源位元影像和目標位元影像等對象。
因為我的目標視窗寬為800,高為590,並且我的圖片大小也是800*590的,我要讓整張圖片填充整個視窗,所以參數就是pDC->StretchBlt(0,0,800,590,&memdc,0,0,800,590,SRCCOPY);
我暫時只載入了png格式的圖片,至於其他格式的圖片的載入是否也能完全參照這個步驟來完成還有待考證,我看到網上說用這個方法gif不能動態顯示,希望大家看到後找到解決方案的能多多指導我。在這裡我先謝謝各位了。
【轉】MFC中png格式圖片貼圖的實現