版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 HYPERLINK /zhmxy555/article/details/7422922 【Visual C+】游戲開發(fā)筆記十四 游戲畫面繪圖(四) 華麗的CImage類本系列文章由zhmxy555編寫,轉(zhuǎn)載請注明出處。 HYPERLINK /zhmxy555/article/details/7422922 /zhmxy555/article/details/7422922作者:毛星云郵箱: HYPERLINK mailto:happylifemxy happylifemxy歡迎郵件交流編程心得我們知道,VisualC+中的CBitmap類的功能簡直太弱小了,這曾經(jīng)讓Visual C+在圖像處
2、理方面的功能比較尷尬。之前筆記里面,我們采用的CBitmap配合GDI進行透明圖像的處理有些晦澀繁瑣,而且受到圖像素材的限制,可以說是有些落后,不是太實用。為了解決這個問題,這節(jié)筆記我們將系統(tǒng)的學(xué)習(xí)MFC和ATL中新增一個圖像處理的類,它就是華麗而強大的CImage類。由于本節(jié)筆記是對CImage類的一個非常系統(tǒng)近乎完全的介紹,我盡量讓它涵蓋到了CImage類的所有的屬性和類成員,所以篇幅也許比以往的筆記內(nèi)容都長,里面的不少內(nèi)容是用到的時候才需要掌握或者查閱的,并不用強行記憶。一,概念講解部分1.CImage類的定位和概述首先,我們簡單介紹一下CImage類的定位。CImage是MFC和ATL
3、共享的新類,它提供了增強的位圖支持,包括加載、保存和轉(zhuǎn)換JPEG,BMP,GIF,PNG圖像格式的能力。可以說是微軟意識到了CBitmap的不足,然后推出了一個CBitmap的增強版。使用CImage類,需在代碼頭部加入包含atlimage.h文件,即添加代碼#includeatlimage.h。由于CImage擁有功能強大的類成員函數(shù)的支持,它便具有了下列四個比較出彩的特性:1、AlphaBlend支持像素級的顏色混合,從而實現(xiàn)透明和半透明的效果。2、PlgBlt能使一個矩形區(qū)域的位圖映射到一個平行四邊形區(qū)域中,而且還可能使用位屏蔽操作。3、TransparentBlt在目標區(qū)域中產(chǎn)生透明圖
4、像4、MaskBlt在目標區(qū)域中產(chǎn)生源位圖與屏蔽位圖合成的效果。2.以CImage類做媒,讓CBitmap類也能處理豐富的圖片格式解決的思路比較明朗,我們采用CImage類的Load函數(shù)加載圖片,之后用Detch取得HBITMAP的句柄,然后再將此句柄附加給CBitmap的對象就行了。這樣就實現(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;/定義一個CBitmap類image.Load(“filename”);/filename為要加載的文件地址HBITMAPhBitmap=image.Detach();/返回被分離的圖片的句柄CBitmapbmp;/定義一個bitmapbmp.Attach(hBitmap);/進行句柄
6、的附加然后就可以用CBitmap進行余下的操作了。3.CImage額外的一些性質(zhì)CImage類對于DIB(device-independentbitmap)設(shè)備無關(guān)位圖文件和非DIB都可以處理。我們可以通過Create函數(shù)或者CImage:Load來處理DIB部分,用Attach函數(shù)來將非DIB部分附加到一個CImage對象上。對于以下函數(shù),只支持DIB部分的位圖文件,他們是:GetBitsGetColorTable,GetMaxColorTableEntries,GetPitch,GetPixelAddress,IsIndexed,SetColorTable。我們可以通過CImage類中的I
7、sDIBSection()函數(shù)來幫助我們判斷一個位圖文件是否為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不能被選到一個新的CDC(classofdevice-context設(shè)備描述表的類),CImage會為圖像創(chuàng)建自己的HDC(設(shè)備描述表DC的句柄)。因為一個HBITMAP只能被選入到一個HDC中一次,也就是說這個與CImage相關(guān)的HBITMAP不能被選到一個其他的HDC中。如果需要一個CDC,我們可以從CImage中獲取HDC,然后使用CDC::FromHandle函數(shù)。4.CImage兼容性的說明在CImage中,有如下兼容性的要求:只支持WindowsNT4.0以上系統(tǒng)
9、的成員函數(shù):PlgBlt,MaskBlt,AlphaBlend。只支持Windows2000,98以上系統(tǒng)的成員函數(shù):TransparentBlt,Draw其實由于目前都是WindowsXP以上的操作系統(tǒng),這個知識點了解一下就行。5.CImage類用于貼圖的一般的使用方法使用方法不唯一,最常用的方法如下,該方法大致分為三部分:在源文件中添加CImage類的包含文件:#includeatlimage.h定義一個CImage類對象,然后調(diào)用CImage:Load方法裝載一個外部圖像文件。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方法繪制圖像。下面重點介紹一下Draw方法。CImage:Draw將一個位圖文件從源設(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,/目標設(shè)備環(huán)境DC的句柄intxDest,/目的矩形的左上角X坐標(邏輯單位)intyDest,/目的矩形的左上角Y坐標(邏輯單位)intnDestWidth,/目標矩形的寬度(就是設(shè)定貼過去的圖片的寬度)intnDestHeight,/目標矩形的高度(就是設(shè)定鐵鍋的圖片的高度)intxSrc,/源矩形的左上角X坐標intySrc,/源矩形的左上角Y坐標intnSrcWidth,/源矩形的寬度intnSrcHeight/源矩形的高度)constthrow();BOOLDraw(HDChDestDC,/目標環(huán)境DC的句柄const
13、RECT&rectDest,/一個RECT結(jié)構(gòu)的引用,用來確定目標圖像。constRECT&rectSrc/一個RECT結(jié)構(gòu)體的引用,用來確定源圖像)constthrow();BOOLDraw(HDChDestDC,/目標環(huán)境DC的句柄intxDest,/目標矩形的左上角X坐標intyDest/目標矩形的左上角Y坐標)constthrow();/BOOLDraw(HDChDestDC,/目標環(huán)境DC的句柄constPOINT&pointDest/一個POINT結(jié)構(gòu)體,用來確定目的矩形的左上角坐標)constthrow();BOOLDraw(HDChDestDC,/目標環(huán)境DC的句柄intxDe
14、st,/目標矩形的左上角X坐標intyDest,/目標矩形的左上角Y坐標intnDestWidth,/目標矩形的寬度intnDestHeight/目標矩形的寬度)constthrow();BOOLDraw(HDChDestDC,/目標環(huán)境DC的句柄constRECT&rectDest/一個RECT結(jié)構(gòu)的引用,用來確定目標圖像。)constthrow();在上面的Draw函數(shù)的各種重載中,對于沒有指定源矩形的版本,則整個源圖像就是默認的源矩形。對于沒有指定目的矩形尺寸的,則源圖片的尺寸就是默認的目的矩形尺寸。需要注意的是,Draw方法綜合了StretchBlt、TransparentBlt和Al
15、phaBlend函數(shù)的功能。通常情況下,Draw()函數(shù)作用和StretchBlt()函數(shù)一致。但是當(dāng)我們的圖像中存在透明的顏色和alpha通道的時候,Draw()函數(shù)作用和TransparentBlt()或者AlphaBlend()函數(shù)一致。所以,在一般情況下,我們都盡量調(diào)用Draw方法來繪制圖像。6.對CImage所有類成員的介紹我將CImage類的所有類函數(shù)按功能分為了四大類,可以更方面的了解各函數(shù)的定位和作用,也方便大家查閱:功能為創(chuàng)建與連接,釋放的函數(shù)Attach附加一個HBITMAP到CImage對象,位圖類型DIB與否都可以Create創(chuàng)建一個DIB部分的位圖,并將其附加到之前創(chuàng)
16、建的CImage對象CreateEX創(chuàng)建一個DIB部分的位圖(擁有額外的參數(shù)),并將其附加到之前 創(chuàng)建的CImage對象Destroy從CImage類上分離該位圖并進行刪除Detach從CImage類里分離該位圖ReleaseDC 釋放設(shè)備描述表中的數(shù)據(jù)ReleaseGDIPlus釋放GDI+使用的源功能為輸入與輸出的函數(shù)GetExporterFilterString返回系統(tǒng)支持的輸入文件格式類型及其描述GetImporterFilterString返回系統(tǒng)支持的輸出文件格式類型及其描述LoadFromResource從指定的源處加載一個圖像資源Load從指定文件處加載一個圖像資源IsInde
17、xed判斷一個位圖顏色映射到了一個索引調(diào)色盤IsNull判斷一個源位圖是否被當(dāng)前載入Save以指定的類型來保存圖像關(guān)于位圖類型與參數(shù)的函數(shù)GetBits返回一個指向該位圖實際像素值指針GetBPP返回該位圖每個像素的位GetColorTable返回顏色表中RGB值的范圍條目GetDC返回目前被選擇的設(shè)備描述表GetExporterFilterString返回系統(tǒng)支持的輸入文件格式類型及其描述GetImporterFilterString返回系統(tǒng)支持的輸出文件格式類型及其描述GetHeight返回當(dāng)前圖像的像素高度GetMaxColorTableEntries返回顏色表條目中的最大值GetPit
18、ch返回當(dāng)前圖片的間距(單位為字節(jié)),用來決定像素格式的GetTransparentColor返回顏色表中透明色的位置GetWidth返回當(dāng)前圖片的寬度(單位為像素)功能為圖形繪制與位圖塊傳輸相關(guān)的函數(shù)AlphaBlend顯示一個半透明或者透明像素的位圖BitBlt從源設(shè)備描述表復(fù)制一個位圖文件到當(dāng)前設(shè)備描述表Draw從源矩形復(fù)制一個位圖到目的矩形,該函數(shù)伸縮或者拉伸位圖來適應(yīng)目標矩 形的尺寸,如果有必要,會處理Alpha值和透明顏色。MaskBlt用指定的掩碼和光柵操作來結(jié)合顏色數(shù)據(jù)和目的位圖PlgBlt執(zhí)行一個從源設(shè)備描述表的矩形到目標設(shè)備描述表的平行 四邊形的塊狀位圖轉(zhuǎn)換SetColor
19、Tabel在DIB的顏色表中設(shè)定一系列條目的RGB顏色的值SetPixelIndexed設(shè)置在指定坐標處的像素(使用索調(diào)色板的索引值)。SetPixelRGB設(shè)置在指定坐標處的像素(使用RGB值)SetPixel在指定坐標處設(shè)置像素的顏色SetTransparentColor設(shè)置將被視為透明色的顏色的索引值(只能選取調(diào)色板中的 一種顏色)StretchBlt從源矩形復(fù)制一個位圖到目的矩形,如果有必要,該函數(shù)會 伸縮或者拉伸位圖來適應(yīng)目標矩形的尺寸,TransparentBlt從源設(shè)備描述表中復(fù)制一個帶有透明色的位圖到當(dāng)前設(shè)備 描述表二,實例運用部分運用CImage完成透明貼圖的一個完整實例介紹
20、了這么多了,下面我們依然用一個實例來鞏固本節(jié)筆記的知識。我們知道,CImage支持透明PNG的貼圖,下面我們就運用透明PNG的貼圖,來代替之前的掩碼操作貼圖。準備兩張素材圖,一張背景圖,一張需要進行透明操作的人物圖。這次的選材就很廣了,沒有之前透明操作需要自己一定的美工功底或者美工童鞋支持的諸多限制了。我選的兩張圖片素材如下:背景圖bg.bmp640 x444人物圖onion.bmp130 x130(呵呵,可愛的洋蔥頭)將人物圖onion.bmp用photoshop等圖像處理軟件進行摳圖操作,除去紅黃相間的背景圖,并將背景圖用透明圖層代替,再將圖片大小調(diào)節(jié)成85x113,用png格式輸出,效果
21、如下:處理好的人物圖onion.png85x113將bg.bmp以及onion.png放到工程目錄下,并在源文件寫入代碼并運行。該代碼和筆記六中代碼的思路基本相同,只不過,將筆記六中使用掩碼操作進行透明化處理的方式換成了png透明貼圖的方式,更加的直觀和易懂易用。詳細注釋的源代碼如下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;/聲明一個位圖對象,用于存儲背景圖HDCmdc;/聲明一個內(nèi)存DCmdc,用來暫存位圖/全局函數(shù)聲明ATOMMyRegisterClass(HINSTANCEhInstance);BOOLInitInstance(HINSTANCE,int);LRESULTCALLBACKWndProc(HWND,UINT,WP
23、ARAM,LPARAM);voidMyPaint(HDChdc);/*Winmain函數(shù),程序入口點函數(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è)計一個窗口類,類似填空題,使用窗口結(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;/定義一個CImage對象,用于透明貼圖CStringstr;/定義一個CString對象,用于存放文件名字符串str=onion.png;/將字符串賦值為文件名image.Load(str);/在image中載入圖像文件image.Draw(hdc,120,180,85,113,0,0,85,113);/調(diào)用D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新版通 用規(guī)范對設(shè)計影響交流分享
- 2025年撫順師范高等??茖W(xué)校高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 山西省孝義市高三上學(xué)期入學(xué)摸底考試語文試題(含答案)
- 滬教版(上海)七年級地理第一學(xué)期中國區(qū)域篇(上)1.2《臺灣省》聽課評課記錄
- 中班幼兒系列活動策劃方案五篇
- 2025年科學(xué)儀器行業(yè)技術(shù)革新與發(fā)展前景
- 鋼材購銷合同范文年
- 代償協(xié)議與擔(dān)保合同
- 跨境貿(mào)易線上支付服務(wù)合同
- 投資公司借款的合同樣本
- 醫(yī)保政策與健康管理培訓(xùn)計劃
- 無人化農(nóng)場項目可行性研究報告
- 2024屆上海市金山區(qū)高三下學(xué)期二模英語試題(原卷版)
- 學(xué)生春節(jié)安全教育
- 2024年重慶市中考數(shù)學(xué)試卷(AB合卷)【附答案】
- DB43-T 2142-2021學(xué)校食堂建設(shè)與食品安全管理規(guī)范
- 宏觀利率篇:債券市場研究分析框架
- 六年級語文(上冊)選擇題集錦
- 《游戲界面設(shè)計專題實踐》課件-知識點5:圖標繪制準備與繪制步驟
- MOOC 材料科學(xué)基礎(chǔ)-西安交通大學(xué) 中國大學(xué)慕課答案
- 復(fù)產(chǎn)復(fù)工試題含答案
評論
0/150
提交評論