【Visual C 】游戲開(kāi)發(fā)筆記十四 游戲畫(huà)面繪圖(四) 華麗的CImage類_第1頁(yè)
【Visual C 】游戲開(kāi)發(fā)筆記十四 游戲畫(huà)面繪圖(四) 華麗的CImage類_第2頁(yè)
【Visual C 】游戲開(kāi)發(fā)筆記十四 游戲畫(huà)面繪圖(四) 華麗的CImage類_第3頁(yè)
【Visual C 】游戲開(kāi)發(fā)筆記十四 游戲畫(huà)面繪圖(四) 華麗的CImage類_第4頁(yè)
【Visual C 】游戲開(kāi)發(fā)筆記十四 游戲畫(huà)面繪圖(四) 華麗的CImage類_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 HYPERLINK /zhmxy555/article/details/7422922 【Visual C+】游戲開(kāi)發(fā)筆記十四 游戲畫(huà)面繪圖(四) 華麗的CImage類本系列文章由zhmxy555編寫(xiě),轉(zhuǎn)載請(qǐng)注明出處。 HYPERLINK /zhmxy555/article/details/7422922 /zhmxy555/article/details/7422922作者:毛星云郵箱: HYPERLINK mailto:happylifemxy happylifemxy歡迎郵件交流編程心得我們知道,VisualC+中的CBitmap類的功能簡(jiǎn)直太弱小了,這曾經(jīng)讓Visual C+在圖像處

2、理方面的功能比較尷尬。之前筆記里面,我們采用的CBitmap配合GDI進(jìn)行透明圖像的處理有些晦澀繁瑣,而且受到圖像素材的限制,可以說(shuō)是有些落后,不是太實(shí)用。為了解決這個(gè)問(wèn)題,這節(jié)筆記我們將系統(tǒng)的學(xué)習(xí)MFC和ATL中新增一個(gè)圖像處理的類,它就是華麗而強(qiáng)大的CImage類。由于本節(jié)筆記是對(duì)CImage類的一個(gè)非常系統(tǒng)近乎完全的介紹,我盡量讓它涵蓋到了CImage類的所有的屬性和類成員,所以篇幅也許比以往的筆記內(nèi)容都長(zhǎng),里面的不少內(nèi)容是用到的時(shí)候才需要掌握或者查閱的,并不用強(qiáng)行記憶。一,概念講解部分1.CImage類的定位和概述首先,我們簡(jiǎn)單介紹一下CImage類的定位。CImage是MFC和ATL

3、共享的新類,它提供了增強(qiáng)的位圖支持,包括加載、保存和轉(zhuǎn)換JPEG,BMP,GIF,PNG圖像格式的能力??梢哉f(shuō)是微軟意識(shí)到了CBitmap的不足,然后推出了一個(gè)CBitmap的增強(qiáng)版。使用CImage類,需在代碼頭部加入包含atlimage.h文件,即添加代碼#includeatlimage.h。由于CImage擁有功能強(qiáng)大的類成員函數(shù)的支持,它便具有了下列四個(gè)比較出彩的特性:1、AlphaBlend支持像素級(jí)的顏色混合,從而實(shí)現(xiàn)透明和半透明的效果。2、PlgBlt能使一個(gè)矩形區(qū)域的位圖映射到一個(gè)平行四邊形區(qū)域中,而且還可能使用位屏蔽操作。3、TransparentBlt在目標(biāo)區(qū)域中產(chǎn)生透明圖

4、像4、MaskBlt在目標(biāo)區(qū)域中產(chǎn)生源位圖與屏蔽位圖合成的效果。2.以CImage類做媒,讓CBitmap類也能處理豐富的圖片格式解決的思路比較明朗,我們采用CImage類的Load函數(shù)加載圖片,之后用Detch取得HBITMAP的句柄,然后再將此句柄附加給CBitmap的對(duì)象就行了。這樣就實(shí)現(xiàn)了讓CBitmap類也可以操作JPG/JPEG/GIF/PNG格式的圖片。具體代碼如下:cpp HYPERLINK /zhmxy555/article/details/7422922 o view plain view plain HYPERLINK /zhmxy555/article/details/

5、7422922 o copy copy HYPERLINK /zhmxy555/article/details/7422922 o print print HYPERLINK /zhmxy555/article/details/7422922 o ? ?#includeatlimage.hCImageimage;/定義一個(gè)CBitmap類image.Load(“filename”);/filename為要加載的文件地址HBITMAPhBitmap=image.Detach();/返回被分離的圖片的句柄CBitmapbmp;/定義一個(gè)bitmapbmp.Attach(hBitmap);/進(jìn)行句柄

6、的附加然后就可以用CBitmap進(jìn)行余下的操作了。3.CImage額外的一些性質(zhì)CImage類對(duì)于DIB(device-independentbitmap)設(shè)備無(wú)關(guān)位圖文件和非DIB都可以處理。我們可以通過(guò)Create函數(shù)或者CImage:Load來(lái)處理DIB部分,用Attach函數(shù)來(lái)將非DIB部分附加到一個(gè)CImage對(duì)象上。對(duì)于以下函數(shù),只支持DIB部分的位圖文件,他們是:GetBitsGetColorTable,GetMaxColorTableEntries,GetPitch,GetPixelAddress,IsIndexed,SetColorTable。我們可以通過(guò)CImage類中的I

7、sDIBSection()函數(shù)來(lái)幫助我們判斷一個(gè)位圖文件是否為DIB部分,其定義如下:cpp HYPERLINK /zhmxy555/article/details/7422922 o view plain view plain HYPERLINK /zhmxy555/article/details/7422922 o copy copy HYPERLINK /zhmxy555/article/details/7422922 o print print HYPERLINK /zhmxy555/article/details/7422922 o ? ?boolIsDIBSection()cons

8、tthrow();/如果返回值為true,則該文件為DIB;返回flase則不是DIB文件我們需要注意的是,CImage不能被選到一個(gè)新的CDC(classofdevice-context設(shè)備描述表的類),CImage會(huì)為圖像創(chuàng)建自己的HDC(設(shè)備描述表DC的句柄)。因?yàn)橐粋€(gè)HBITMAP只能被選入到一個(gè)HDC中一次,也就是說(shuō)這個(gè)與CImage相關(guān)的HBITMAP不能被選到一個(gè)其他的HDC中。如果需要一個(gè)CDC,我們可以從CImage中獲取HDC,然后使用CDC::FromHandle函數(shù)。4.CImage兼容性的說(shuō)明在CImage中,有如下兼容性的要求:只支持WindowsNT4.0以上系統(tǒng)

9、的成員函數(shù):PlgBlt,MaskBlt,AlphaBlend。只支持Windows2000,98以上系統(tǒng)的成員函數(shù):TransparentBlt,Draw其實(shí)由于目前都是WindowsXP以上的操作系統(tǒng),這個(gè)知識(shí)點(diǎn)了解一下就行。5.CImage類用于貼圖的一般的使用方法使用方法不唯一,最常用的方法如下,該方法大致分為三部分:在源文件中添加CImage類的包含文件:#includeatlimage.h定義一個(gè)CImage類對(duì)象,然后調(diào)用CImage:Load方法裝載一個(gè)外部圖像文件。Load方法有如下兩種重載:cpp HYPERLINK /zhmxy555/article/details/74

10、22922 o view plain view plain HYPERLINK /zhmxy555/article/details/7422922 o copy copy HYPERLINK /zhmxy555/article/details/7422922 o print print HYPERLINK /zhmxy555/article/details/7422922 o ? ?HRESULTLoad(LPCTSTRpszFileName/包含加載文件名的字符串指針)throw();HRESULTLoad(IStream*pStream/指向包含加載文件名的流的指針)throw();調(diào)用C

11、Image:Draw方法繪制圖像。下面重點(diǎn)介紹一下Draw方法。CImage:Draw將一個(gè)位圖文件從源設(shè)備描述表復(fù)制到當(dāng)前設(shè)備描述表該函數(shù)有如下六種重載:cpp HYPERLINK /zhmxy555/article/details/7422922 o view plain view plain HYPERLINK /zhmxy555/article/details/7422922 o copy copy HYPERLINK /zhmxy555/article/details/7422922 o print print HYPERLINK /zhmxy555/article/details/

12、7422922 o ? ?BOOLDraw(HDChDestDC,/目標(biāo)設(shè)備環(huán)境DC的句柄intxDest,/目的矩形的左上角X坐標(biāo)(邏輯單位)intyDest,/目的矩形的左上角Y坐標(biāo)(邏輯單位)intnDestWidth,/目標(biāo)矩形的寬度(就是設(shè)定貼過(guò)去的圖片的寬度)intnDestHeight,/目標(biāo)矩形的高度(就是設(shè)定鐵鍋的圖片的高度)intxSrc,/源矩形的左上角X坐標(biāo)intySrc,/源矩形的左上角Y坐標(biāo)intnSrcWidth,/源矩形的寬度intnSrcHeight/源矩形的高度)constthrow();BOOLDraw(HDChDestDC,/目標(biāo)環(huán)境DC的句柄const

13、RECT&rectDest,/一個(gè)RECT結(jié)構(gòu)的引用,用來(lái)確定目標(biāo)圖像。constRECT&rectSrc/一個(gè)RECT結(jié)構(gòu)體的引用,用來(lái)確定源圖像)constthrow();BOOLDraw(HDChDestDC,/目標(biāo)環(huán)境DC的句柄intxDest,/目標(biāo)矩形的左上角X坐標(biāo)intyDest/目標(biāo)矩形的左上角Y坐標(biāo))constthrow();/BOOLDraw(HDChDestDC,/目標(biāo)環(huán)境DC的句柄constPOINT&pointDest/一個(gè)POINT結(jié)構(gòu)體,用來(lái)確定目的矩形的左上角坐標(biāo))constthrow();BOOLDraw(HDChDestDC,/目標(biāo)環(huán)境DC的句柄intxDe

14、st,/目標(biāo)矩形的左上角X坐標(biāo)intyDest,/目標(biāo)矩形的左上角Y坐標(biāo)intnDestWidth,/目標(biāo)矩形的寬度intnDestHeight/目標(biāo)矩形的寬度)constthrow();BOOLDraw(HDChDestDC,/目標(biāo)環(huán)境DC的句柄constRECT&rectDest/一個(gè)RECT結(jié)構(gòu)的引用,用來(lái)確定目標(biāo)圖像。)constthrow();在上面的Draw函數(shù)的各種重載中,對(duì)于沒(méi)有指定源矩形的版本,則整個(gè)源圖像就是默認(rèn)的源矩形。對(duì)于沒(méi)有指定目的矩形尺寸的,則源圖片的尺寸就是默認(rèn)的目的矩形尺寸。需要注意的是,Draw方法綜合了StretchBlt、TransparentBlt和Al

15、phaBlend函數(shù)的功能。通常情況下,Draw()函數(shù)作用和StretchBlt()函數(shù)一致。但是當(dāng)我們的圖像中存在透明的顏色和alpha通道的時(shí)候,Draw()函數(shù)作用和TransparentBlt()或者AlphaBlend()函數(shù)一致。所以,在一般情況下,我們都盡量調(diào)用Draw方法來(lái)繪制圖像。6.對(duì)CImage所有類成員的介紹我將CImage類的所有類函數(shù)按功能分為了四大類,可以更方面的了解各函數(shù)的定位和作用,也方便大家查閱:功能為創(chuàng)建與連接,釋放的函數(shù)Attach附加一個(gè)HBITMAP到CImage對(duì)象,位圖類型DIB與否都可以Create創(chuàng)建一個(gè)DIB部分的位圖,并將其附加到之前創(chuàng)

16、建的CImage對(duì)象CreateEX創(chuàng)建一個(gè)DIB部分的位圖(擁有額外的參數(shù)),并將其附加到之前 創(chuàng)建的CImage對(duì)象Destroy從CImage類上分離該位圖并進(jìn)行刪除Detach從CImage類里分離該位圖ReleaseDC 釋放設(shè)備描述表中的數(shù)據(jù)ReleaseGDIPlus釋放GDI+使用的源功能為輸入與輸出的函數(shù)GetExporterFilterString返回系統(tǒng)支持的輸入文件格式類型及其描述GetImporterFilterString返回系統(tǒng)支持的輸出文件格式類型及其描述LoadFromResource從指定的源處加載一個(gè)圖像資源Load從指定文件處加載一個(gè)圖像資源IsInde

17、xed判斷一個(gè)位圖顏色映射到了一個(gè)索引調(diào)色盤(pán)IsNull判斷一個(gè)源位圖是否被當(dāng)前載入Save以指定的類型來(lái)保存圖像關(guān)于位圖類型與參數(shù)的函數(shù)GetBits返回一個(gè)指向該位圖實(shí)際像素值指針GetBPP返回該位圖每個(gè)像素的位GetColorTable返回顏色表中RGB值的范圍條目GetDC返回目前被選擇的設(shè)備描述表GetExporterFilterString返回系統(tǒng)支持的輸入文件格式類型及其描述GetImporterFilterString返回系統(tǒng)支持的輸出文件格式類型及其描述GetHeight返回當(dāng)前圖像的像素高度GetMaxColorTableEntries返回顏色表?xiàng)l目中的最大值GetPit

18、ch返回當(dāng)前圖片的間距(單位為字節(jié)),用來(lái)決定像素格式的GetTransparentColor返回顏色表中透明色的位置GetWidth返回當(dāng)前圖片的寬度(單位為像素)功能為圖形繪制與位圖塊傳輸相關(guān)的函數(shù)AlphaBlend顯示一個(gè)半透明或者透明像素的位圖BitBlt從源設(shè)備描述表復(fù)制一個(gè)位圖文件到當(dāng)前設(shè)備描述表Draw從源矩形復(fù)制一個(gè)位圖到目的矩形,該函數(shù)伸縮或者拉伸位圖來(lái)適應(yīng)目標(biāo)矩 形的尺寸,如果有必要,會(huì)處理Alpha值和透明顏色。MaskBlt用指定的掩碼和光柵操作來(lái)結(jié)合顏色數(shù)據(jù)和目的位圖PlgBlt執(zhí)行一個(gè)從源設(shè)備描述表的矩形到目標(biāo)設(shè)備描述表的平行 四邊形的塊狀位圖轉(zhuǎn)換SetColor

19、Tabel在DIB的顏色表中設(shè)定一系列條目的RGB顏色的值SetPixelIndexed設(shè)置在指定坐標(biāo)處的像素(使用索調(diào)色板的索引值)。SetPixelRGB設(shè)置在指定坐標(biāo)處的像素(使用RGB值)SetPixel在指定坐標(biāo)處設(shè)置像素的顏色SetTransparentColor設(shè)置將被視為透明色的顏色的索引值(只能選取調(diào)色板中的 一種顏色)StretchBlt從源矩形復(fù)制一個(gè)位圖到目的矩形,如果有必要,該函數(shù)會(huì) 伸縮或者拉伸位圖來(lái)適應(yīng)目標(biāo)矩形的尺寸,TransparentBlt從源設(shè)備描述表中復(fù)制一個(gè)帶有透明色的位圖到當(dāng)前設(shè)備 描述表二,實(shí)例運(yùn)用部分運(yùn)用CImage完成透明貼圖的一個(gè)完整實(shí)例介紹

20、了這么多了,下面我們依然用一個(gè)實(shí)例來(lái)鞏固本節(jié)筆記的知識(shí)。我們知道,CImage支持透明PNG的貼圖,下面我們就運(yùn)用透明PNG的貼圖,來(lái)代替之前的掩碼操作貼圖。準(zhǔn)備兩張素材圖,一張背景圖,一張需要進(jìn)行透明操作的人物圖。這次的選材就很廣了,沒(méi)有之前透明操作需要自己一定的美工功底或者美工童鞋支持的諸多限制了。我選的兩張圖片素材如下:背景圖bg.bmp640 x444人物圖onion.bmp130 x130(呵呵,可愛(ài)的洋蔥頭)將人物圖onion.bmp用photoshop等圖像處理軟件進(jìn)行摳圖操作,除去紅黃相間的背景圖,并將背景圖用透明圖層代替,再將圖片大小調(diào)節(jié)成85x113,用png格式輸出,效果

21、如下:處理好的人物圖onion.png85x113將bg.bmp以及onion.png放到工程目錄下,并在源文件寫(xiě)入代碼并運(yùn)行。該代碼和筆記六中代碼的思路基本相同,只不過(guò),將筆記六中使用掩碼操作進(jìn)行透明化處理的方式換成了png透明貼圖的方式,更加的直觀和易懂易用。詳細(xì)注釋的源代碼如下cpp HYPERLINK /zhmxy555/article/details/7422922 o view plain view plain HYPERLINK /zhmxy555/article/details/7422922 o copy copy HYPERLINK /zhmxy555/article/de

22、tails/7422922 o print print HYPERLINK /zhmxy555/article/details/7422922 o ? ?#includestdafx.h#includeatlimage.h/全局變量聲明HINSTANCEhInst;HBITMAPbg;/聲明一個(gè)位圖對(duì)象,用于存儲(chǔ)背景圖HDCmdc;/聲明一個(gè)內(nèi)存DCmdc,用來(lái)暫存位圖/全局函數(shù)聲明ATOMMyRegisterClass(HINSTANCEhInstance);BOOLInitInstance(HINSTANCE,int);LRESULTCALLBACKWndProc(HWND,UINT,WP

23、ARAM,LPARAM);voidMyPaint(HDChdc);/*Winmain函數(shù),程序入口點(diǎn)函數(shù)*intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)MSGmsg;MyRegisterClass(hInstance);if(!InitInstance(hInstance,nCmdShow)returnFALSE;/消息循環(huán)while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&m

24、sg);returnmsg.wParam;/*設(shè)計(jì)一個(gè)窗口類,類似填空題,使用窗口結(jié)構(gòu)體*ATOMMyRegisterClass(HINSTANCEhInstance)WNDCLASSEXwcex;wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=(WNDPROC)WndProc;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);

25、wcex.hCursor=NULL;wcex.hCursor=LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName=NULL;wcex.lpszClassName=canvas;wcex.hIconSm=NULL;returnRegisterClassEx(&wcex);/*初始化函數(shù)*/1.建立與窗口DC兼容的內(nèi)存DC/2.從文件加載背景圖及透明的洋蔥頭BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)HWNDhWnd;HD

26、Chdc;hInst=hInstance;hWnd=CreateWindow(canvas,淺墨的繪圖窗口,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);if(!hWnd)returnFALSE;MoveWindow(hWnd,10,10,600,444,true);ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);hdc=GetDC(hWnd);/獲得窗口DCmdc=CreateCompatibleDC(hdc);/創(chuàng)建與窗口兼容的內(nèi)存DC(m

27、dc)bg=(HBITMAP)LoadImage(NULL,bg.bmp,IMAGE_BITMAP,600,444,LR_LOADFROMFILE);MyPaint(hdc);ReleaseDC(hWnd,hdc);returnTRUE;/*自定義繪圖函數(shù)*/透明貼圖voidMyPaint(HDChdc)SelectObject(mdc,bg);BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);/先將背景圖貼到顯示窗口中CImageimage;/定義一個(gè)CImage對(duì)象,用于透明貼圖CStringstr;/定義一個(gè)CString對(duì)象,用于存放文件名字符串str=onion.png;/將字符串賦值為文件名image.Load(str);/在image中載入圖像文件image.Draw(hdc,120,180,85,113,0,0,85,113);/調(diào)用D

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論