第二章 圖形圖像處理基礎(chǔ)_第1頁
第二章 圖形圖像處理基礎(chǔ)_第2頁
第二章 圖形圖像處理基礎(chǔ)_第3頁
第二章 圖形圖像處理基礎(chǔ)_第4頁
第二章 圖形圖像處理基礎(chǔ)_第5頁
已閱讀5頁,還剩127頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第二章圖形圖像處理基礎(chǔ)圖象處理的研究需要了解人類視覺機(jī)理:人們能夠區(qū)分的光強(qiáng)度差別有多大?我們眼睛的空間清晰度是多少?對(duì)運(yùn)動(dòng)的感覺如何?我們估計(jì)和比較距離和面積的精度是多少?人類特性視覺的光譜是如何樣的?人的視覺中彩色起什麼作用?人類是如何獲得視覺感知,如何認(rèn)知周圍事物的?人們對(duì)于自己視覺機(jī)構(gòu)的生物、生理物理過程的了解,以及神經(jīng)、精神方面的了解還處于低級(jí)階段,認(rèn)識(shí)還很不完善和有局限性。人類視覺感知能力的特點(diǎn)人類視覺系統(tǒng)在對(duì)物體的識(shí)別上有特殊強(qiáng)大的功能;但在對(duì)灰度、距離和面積的絕對(duì)估計(jì)上卻有某些欠缺;以傳感器單元的數(shù)目比較:視網(wǎng)膜包含接近1億3000萬至1億5000萬個(gè)光接收器,這遠(yuǎn)遠(yuǎn)大于一般數(shù)字成像系統(tǒng)CCD片上的傳感器單元數(shù);和它每次執(zhí)行運(yùn)算的數(shù)目比較:和計(jì)算機(jī)的時(shí)鐘頻率相比,神經(jīng)處理單元的開關(guān)時(shí)間將比之大約慢104倍;總體而言,人類的視覺系統(tǒng)還是比計(jì)算機(jī)視覺系統(tǒng)要強(qiáng)大得多。它能實(shí)時(shí)分析復(fù)雜的景物以使我們能即時(shí)的反應(yīng)。視覺低級(jí)感知層次視覺系統(tǒng)從外界獲取圖象,就是在眼睛視網(wǎng)膜上獲得周圍世界的光學(xué)成象,然后由視覺接收器(桿狀體和錐狀體在視網(wǎng)膜上作為視覺接收器),將光圖象信息轉(zhuǎn)化為視網(wǎng)膜的神經(jīng)活動(dòng)電信息,最后通過視神經(jīng)纖維,把這些圖象信息傳送入大腦,由大腦獲得圖象感知。100m15m2.55mm17mm中心凹(成像區(qū))彩色視覺彩色的利用不僅令人愉悅,且可獲得更多的信息。實(shí)驗(yàn)表明:視覺僅能感知十余級(jí)灰階,

彩色感知但卻能區(qū)分上千種彩色;彩色視覺特性是亮度(Brightness)、色調(diào)(Hue)和飽和度(Saturation)的函數(shù):

亮度表示感受到的光強(qiáng)度(白色越多,強(qiáng)度越高);

色調(diào)表示顏色(各光譜的混合程度);

飽和度是彩色中包含白光的多少(白色越多飽和度越低,純光譜色是完全飽和的)。1、彩色的描述電磁波波長(zhǎng)范圍很大,使人產(chǎn)生視覺,感到明亮和顏色的電磁波叫可見光。

可視光區(qū)的波長(zhǎng)在400nm~700nm,當(dāng)光譜采樣限制到三個(gè)人類視覺系統(tǒng)敏感的紅、綠、藍(lán)光波段時(shí),對(duì)這三個(gè)光譜帶的光能量進(jìn)行采樣,就可以得到一幅彩色圖像。400nm700nm紫外光紅外光可見光區(qū)546.1nm435.8nm780nm視網(wǎng)膜中叁種視錐體對(duì)彩色的吸收曲線彩色的表示彩色的表示是基于TomasYoung提出的三基色原理:“任何彩色可以用合適的三種基本色混合而再生”。生理學(xué)已證明,視網(wǎng)膜中有叁種視錐體,具有不同的吸收光譜,SR(λ),SG(λ),SB(λ)其中:λMIN≤λ≤λMAX

、λMIN≈400nm、λmax≈780nm吸收光譜響應(yīng)的峰值分別在光譜的紅、綠、蘭區(qū)域。而且,吸收曲線有相當(dāng)多的部分是相互重疊的。這是三基色原理的生理基礎(chǔ)。三基色相加混色:紅、綠、蘭三基色(RGB)

;

三基色相減混色:黃、青、品紅(CMY)。設(shè)組成某種顏色C所需的三個(gè)刺激量分別用R、G、B表示每種刺激量的比例系數(shù)為r、g、b,有1931年CIE根據(jù)此原則制定了一個(gè)色度圖:舌型圖(P18)。3、研究結(jié)果:1)每一點(diǎn)對(duì)應(yīng)一種顏色2)邊界點(diǎn)代表純顏色3)任意兩點(diǎn)連線表示線上的顏色可由兩點(diǎn)顏色混合形成4)任意三點(diǎn)形成的三角形內(nèi)的顏色可由三點(diǎn)顏色混合形成彩色模型三原色:1931年,國(guó)際照明委員會(huì)(CIE)規(guī)定用波長(zhǎng)為700nm、546.1nm和435.8nm的單色光作為紅(R)、綠(G)、藍(lán)(B)三原色。任意彩色的顏色方程為:

C=rR+gG+bBr、g、b≥0r、g、b是紅、綠、藍(lán)三色的混合比例,一般稱為三色系數(shù)。所謂顏色模型指的是某個(gè)三維顏色空間中的一個(gè)可見光子集。它包含某個(gè)色彩域的所有色彩。任何一個(gè)色彩域都只是可見光的子集,任何一個(gè)三原色顏色模型都無法包含所有的可見光。這一點(diǎn)可從舌型圖看出。

NTSC制和PAL制的彩色區(qū)別1、RGB彩色模型RGB顏色模型是三維直角坐標(biāo)顏色系統(tǒng)中的一個(gè)單位正方體,在正方體的主對(duì)角線上,各原色的量相等,產(chǎn)生由暗到亮的白色,即灰度。(0,0,0)為黑,(1,1,1)為白,正方體的其他6個(gè)角點(diǎn)分別為紅、黃、綠、青、藍(lán)和品紅。RGB顏色模型構(gòu)成的顏色空間是CIE原色空間的一個(gè)真子集。RGB顏色模型通常用于彩色陰極射線管和彩色光柵圖形顯示器。RGB三原色是加性原色。黃(1,1,0)黑(0,0,0)綠(0,1,0)青(0,1,1)藍(lán)(0,0,1)品紅(1,0,1)白(1,1,1)紅(1,0,0)CMY彩色模型

CMY顏色模型是以紅、綠、藍(lán)三色的補(bǔ)色青(Cyan)(白-紅)、品紅(Magenta)(白-綠)、黃(Yellow)(白-藍(lán))為原色構(gòu)成的顏色模型。CMY顏色模型常用于從白光中濾去某種顏色,故稱為減色原色空間。

CMY顏色模型對(duì)應(yīng)的直角坐標(biāo)系的子空間與RGB顏色模型對(duì)應(yīng)的子空間完全相同。

RGB調(diào)色板CMY調(diào)色板2、HSI彩色模型——雙三棱錐模型形(74年)這種彩色系統(tǒng)格式的設(shè)計(jì)反映了人類觀察彩色的方式。如:紅色又分為淺紅和深紅色等等。

I:雙三棱錐中心線;表示光照強(qiáng)度或稱為亮度,它確定了像素的整體亮度,而不管其顏色是什么。

H:表示色度,由角度表示。反映了該顏色最接近什么樣的光譜波長(zhǎng)。0o為紅色,120o為綠色,240o為藍(lán)色。0o到240o覆蓋了700nm~435.8nm的可見光譜顏色,240o到360o是400nm~435.8nm的可見光譜顏色。

S:飽和度,飽和度參數(shù)是沿雙棱錐中心線垂直方向到彩色點(diǎn)的長(zhǎng)度。在雙棱錐的外表面是純的或稱飽和的顏色,其飽和度值為1。在中心是中性(灰色)影調(diào),即飽和度為0。各種亮度下的R、G、B顏色圖各圖的色調(diào)(各光譜的混合程度)是一樣的,由于亮度的不一樣使飽和度不一樣,導(dǎo)致我們對(duì)顏色的感覺是不一樣的。HSI彩色系統(tǒng)的模形描述黃(1,1,0)黑(0,0,0)綠(0,1,0)青(0,1,1)藍(lán)(0,0,1)品紅(1,0,1)白(1,1,1)紅(1,0,0)BRGC=B+G=W-RY=R+G=W-BM=R+B=W-GSHI黑色白色H黑(0,0,0)綠(0,1,0)藍(lán)(0,0,1)紅(1,0,0)(1/3,1/3,1/3)設(shè)P點(diǎn)的坐標(biāo)為(r,g,b);令從原點(diǎn)(RGB坐標(biāo)的原點(diǎn))指向O、P、R的矢量分別為o、p、r。有:QBRGSOPr-op-oTY色調(diào)H是RO、PO的夾角,即:飽和度S應(yīng)是PO和QO的比值(達(dá)到純飽和的多少)恰好是藍(lán)色成分的系數(shù)在三角形ORG中的任意一點(diǎn)都有b≤r、b≤g??紤]到在三角形OGB和OBR的情況,有對(duì)應(yīng)坐標(biāo)乘積之和b=1純飽和六、彩色模型的相互轉(zhuǎn)換

1、

RGB到HSI的轉(zhuǎn)換:2、HSI到RGB的轉(zhuǎn)換當(dāng)0o≤H<

120o時(shí):當(dāng)120o≤H<240o時(shí):當(dāng)240o≤H<360o時(shí):MFC上機(jī)操作步驟關(guān)于工具VisualC++6.0是目前使用極為廣泛的可視化編程平臺(tái)。使用VC++語言開發(fā)的圖形,與使用TurboC語言開發(fā)的圖形相比,不僅可以顯示真彩色,而且可以實(shí)現(xiàn)交互式繪圖。MicrosoftFoundationClassLibrary微軟基類庫MFC是以C++形式封裝的WindowsAPI(ApplicationProgramInterface),包含了一百多個(gè)已經(jīng)定義好的常用類。

MFC的上機(jī)操作過程啟動(dòng)MicrosoftVisualC++6.0從【File】菜單中選擇【New】命令,彈出【New】對(duì)話框,切換到【Projects】選項(xiàng)卡。在左邊窗口中選擇MFCAppWizard(exe),在右邊的Projectsname文本框中鍵入應(yīng)用程序名,這里輸入Test,在Location文本框中出現(xiàn)用于存放應(yīng)用程序的根目錄,這里設(shè)置為D:\Test。其余保持默認(rèn)值。如圖所示。單擊【OK】按鈕。在對(duì)話框【MFCAppWizard-Step1】中,選中SingleDocument單選按鈕,其余保持默認(rèn)值,如圖所示。單擊【Finish】按鈕結(jié)束。完成上述步驟后,應(yīng)用程序Test的框架即被生成,出現(xiàn)程序工作區(qū)。如圖所示。在工作區(qū)的【ClassView】面板中顯示所創(chuàng)建的類和成員函數(shù)

在【ResourceView】面板中顯示所創(chuàng)建的資源

在【FileView】面板中顯示源程序文件,主要包括程序源文件(*.CPP)、頭文件(*.h)和資源文件(*.ico、*.bmp等)

從【ClassView】面板可以看出CTestApp是應(yīng)用的主函數(shù)類,用來處理消息。MFC中的數(shù)據(jù)是存儲(chǔ)在CTestDoc類文檔中結(jié)果的顯示是在CTestView類中文檔類負(fù)責(zé)管理和維護(hù)數(shù)據(jù)本身視圖類負(fù)責(zé)處理用戶鼠標(biāo)和鍵盤的操作全部展開FileView面板后,顯示如圖的界面內(nèi)容后續(xù)的編程過程中一般使用的是CTestView類的TestView.h頭文件和TestView.cpp源文件。OnDraw(CDC*pDC)函數(shù)voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);}pDC定義為CDC類的指針。pDoc通過GetDocument()函數(shù)得到了指向文檔類CTestDoc的指針。OnDraw(CDC*pDC)函數(shù)voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);}ASSERT_VALID(pDoc)函數(shù)使pDoc指針有效。使用pDC指針,可以對(duì)CDC類的成員函數(shù)進(jìn)行操作。注意:OnDraw函數(shù)是由系統(tǒng)框架直接調(diào)用的,程序一運(yùn)行就會(huì)自動(dòng)執(zhí)行。!按鈕點(diǎn)擊工具條上的“!”按鈕,就可以直接編譯、運(yùn)行程序盡管未編寫一句代碼,但Test程序已經(jīng)形成一個(gè)可執(zhí)行程序框架返回2.2基本繪圖函數(shù)在Windows平臺(tái)上,應(yīng)用程序的圖形設(shè)備接口(GraphicsDeviceInterface,GDI)被抽象化為設(shè)備上下文(DeviceContent,DC)

在微軟基類庫MFC中,CDC類是定義設(shè)備上下文對(duì)象的基類,所有繪圖函數(shù)都在CDC基類中定義。2.2節(jié)內(nèi)容2.2.1CDC類結(jié)構(gòu)和GDI對(duì)象2.2.2映射模式2.2.3CDC類的主要繪圖成員函數(shù)2.2.4設(shè)備上下文的調(diào)用和釋放2.2.5VC++繪制圖形的幾種方法2.2.1CDC類結(jié)構(gòu)和GDI對(duì)象1.CDC類CDC類有4個(gè)派生類CClientDC類顯示器客戶區(qū)設(shè)備上下文類CClientDC只能在窗口的客戶區(qū)(不包括邊框、標(biāo)題欄、菜單欄以及狀態(tài)欄的空白區(qū)域)進(jìn)行繪圖點(diǎn)(0,0)是客戶區(qū)的左上角其構(gòu)造函數(shù)調(diào)用GetDC函數(shù)其析構(gòu)函數(shù)調(diào)用ReleaseDC函數(shù)CMetaFileDC類Windows圖元文件設(shè)備上下文類CMetaFileDC封裝了在一個(gè)Windows圖元文件中繪圖的方法圖元文件是一系列與設(shè)備無關(guān)的圖片的集合,由于它對(duì)圖像的保存比像素更精確,因而往往在要求較高的場(chǎng)合下使用例如,AutoCAD中的圖像保存等。CPaintDC類是成員函數(shù)OnPaint中使用的顯示器上下文類CPaintDC只在處理WM_PAINT消息中使用,用戶一旦獲得相關(guān)的CDC指針,就可以將它當(dāng)做任何設(shè)備環(huán)境(包括屏幕、打印機(jī))的指針來使用CPaintDC類的構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用CWnd::BeginPaintCPaintDC類的析構(gòu)函數(shù)則會(huì)自動(dòng)調(diào)用CWnd::EndPaint

CWindowDC類整個(gè)窗口區(qū)域的顯示器設(shè)備上下文類,包括客戶區(qū)和非客戶區(qū)CWindowDC允許在窗口的任意位置中進(jìn)行繪圖,點(diǎn)(0,0)指整個(gè)窗口的左上角其構(gòu)造函數(shù)調(diào)用GetWindowDC其析構(gòu)函數(shù)調(diào)用ReleaseDC2.常用繪圖類常用繪圖類常用繪圖類CPoint類:存放點(diǎn)坐標(biāo)(x,y)。CRect類:存放矩形左上角頂點(diǎn)和右下角頂點(diǎn)的坐標(biāo)(top,left,right,bottom)Csize類:存放矩形的寬度和高度的坐標(biāo)(cx,cy),其中cx為矩形的寬度,cy為矩形的高度。3.繪圖工具類繪圖工具類繪圖工具類CGdiObject類:GDI繪圖工具的基類,一般不能直接使用。CBitmap:封裝了一個(gè)GDI位圖,提供位圖操作的接口。CBrush類:封裝了GDI畫刷,可以選作設(shè)備上下文的當(dāng)前畫刷。畫刷用于填充圖形內(nèi)部。繪圖工具類CFont:封裝了GDI字體,可以選作設(shè)備上下文中的當(dāng)前字體。CPallette:封裝了GDI調(diào)色板,提供應(yīng)用程序和顯示器之間的顏色接口。CPen:封裝了GDI畫筆,可以選作設(shè)備上下文的當(dāng)前畫筆。畫筆是用于繪制圖形邊界線。2.2.2映射模式把圖形顯示在屏幕坐標(biāo)系中的過程稱為映射根據(jù)映射模式的不同可以分為邏輯坐標(biāo)設(shè)備坐標(biāo)邏輯坐標(biāo)的單位是米制尺度或其它與字體相關(guān)的尺度設(shè)備坐標(biāo)的單位是像素映射模式(表2-1)模式代碼坐標(biāo)單位坐標(biāo)系特征MM_TEXT一個(gè)像素設(shè)備坐標(biāo)。屏幕左上角為坐標(biāo)原點(diǎn),X軸向右,Y軸向下。MM_LOMETRIC0.1mm邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸向右,Y軸向上。MM_HIMETRIC0.01mm邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸向右,Y軸向上。MM_LOENGLISH0.01inch邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸向右,Y軸向上。MM_HIENGLISH0.001inch邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸向右,Y軸向上。映射模式模式代碼坐標(biāo)單位坐標(biāo)系特征MM_TWIPS1/440inch或1/20點(diǎn)邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸向右,Y軸向上。MM_ISOTROPIC用戶自定義,X軸和Y軸比例相等邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸和Y軸方向自定義。MM_ANSIOTROPIC用戶自定義,X軸和Y軸比例獨(dú)立設(shè)置邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,X軸和Y軸方向自定義。映射模式在缺省情況下,一般使用的是設(shè)備坐標(biāo)系MM_TEXT,坐標(biāo)原點(diǎn)位于客戶區(qū)的左上角,X軸水平向右,Y軸垂直向下,坐標(biāo)基本單位為一個(gè)像素。

1.設(shè)置映射模式函數(shù)類屬:CDC::SetMapMode原型:virtualint

SetMapMode(int

nMapMode);返回值:原映射模式。參數(shù)說明:nMapMode是表2-1的模式代碼。2.設(shè)置窗口范圍函數(shù)類屬:CDC::SetWindowExt

原型:virtualCSize

SetWindowExt(int

cx,intcy);返回值:原窗口范圍的CSize對(duì)象。參數(shù)說明:cx窗口x范圍的邏輯坐標(biāo),cy窗口y范圍的邏輯坐標(biāo)。3.設(shè)置視區(qū)范圍函數(shù)類屬:CDC::SetViewportExt

原型:virtualCSize

SetViewportExt(int

cx,intcy);返回值:原視區(qū)范圍的CSize對(duì)象。參數(shù)說明:cx視區(qū)x范圍的邏輯坐標(biāo),cy視區(qū)y范圍的邏輯坐標(biāo)。4.設(shè)置視區(qū)坐標(biāo)原點(diǎn)函數(shù)類屬:CDC::SetViewportOrg

原型:virtualCPoint

SetViewportOrg(intx,inty);返回值:原視區(qū)原點(diǎn)的CPoint對(duì)象。參數(shù)說明:參數(shù)x,y是視區(qū)的新原點(diǎn)坐標(biāo)。

2.2.3CDC類的主要繪圖成員函數(shù)1.繪制像素函數(shù)類屬:CDC::SetPixel

原型:COLORREFSetPixel(int

x,int

y,COLORREF

crColor);設(shè)置某像素點(diǎn)的RGB值1.繪制像素函數(shù)參數(shù)說明:SetPixel

函數(shù)中,COLORREF是32位顏色數(shù)據(jù)類型;第一和第二個(gè)參數(shù)x,y是像素點(diǎn)位置的邏輯坐標(biāo)值,第三個(gè)參數(shù)crColor是像素點(diǎn)的顏色值,COLORREF型變量可以利用RGB(bRed,bGreen,bBlue)來指定相應(yīng)的顏色值,每種顏色用一個(gè)字節(jié)表示,可以被設(shè)定為0~255之間的任意值,0代表無色,255代表全色。

2.獲取像素顏色函數(shù)類屬:CDC::GetPixel

原型:COLORREFGetPixel(intx,inty)const;返回值:指定像素的RGB值。參數(shù)說明:得到指定像素的RGB顏色值例4在屏幕的(20,20)坐標(biāo)位置處繪制一個(gè)紅色像素點(diǎn)。然后取出該像素點(diǎn)的顏色,在屏幕的(60,20)坐標(biāo)處繪制一個(gè)相同顏色的像素點(diǎn)。

voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); COLORREFc;

pDC->SetPixel(20,20,RGB(255,0,0)); c=pDC->GetPixel(20,20);

pDC->SetPixel(60,20,c);}語句:COLORREFc;注釋:變量c用于存放像素點(diǎn)的顏色值語句:pDC->SetPixel(20,20,RGB(255,0,0));注釋:在屏幕的(20,20)坐標(biāo)位置處,繪制一個(gè)紅色的像素點(diǎn)語句:c=pDC->GetPixel(20,20);注釋:c保存該像素點(diǎn)的顏色語句:pDC->SetPixel(60,20,c);注釋:在像素點(diǎn)(60,20)處以顏色值c繪制一個(gè)像素點(diǎn)。3.畫筆函數(shù)畫筆是用來繪制直線、曲線或圖形的邊界線,是繪圖工具類之一畫筆通常具有線型、寬度和顏色三種屬性畫筆的線型通常有實(shí)線、虛線、點(diǎn)線、點(diǎn)劃線、雙點(diǎn)劃線、不可見線和內(nèi)框架線7種,這些線型都是以PS_為前綴的預(yù)定義標(biāo)識(shí)符3.畫筆函數(shù)默認(rèn)的畫筆是一個(gè)像素單位的黑色實(shí)線要想更換畫筆,可以在創(chuàng)建新畫筆對(duì)象后,將其選入設(shè)備上下文,就可使用新畫筆進(jìn)行繪圖。畫筆的風(fēng)格

風(fēng)格代碼線型寬度顏色PS_SOLID實(shí)線任意指定純色PS_DASH虛線1(不可任意指定)純色PS_DOT點(diǎn)線1(不可任意指定)純色PS_DASHDOT點(diǎn)劃線1(不可任意指定)純色PS_DASHDOTDOT雙點(diǎn)畫線1(不可任意指定)純色PS_NULL不可見線1(不可任意指定)純色PS_INSIDEFRAME內(nèi)框架線任意指定純色(1)創(chuàng)建畫筆函數(shù)類屬:CPen::CreatPen

原型:BOOLCreatePen(int

nPenStyle,int

nWidth,COLORREFcrColor);返回值:非零。參數(shù)說明:第一個(gè)參數(shù)nPenStyle是畫筆的風(fēng)格代碼第二個(gè)參數(shù)nWidth是畫筆的寬度第三個(gè)參數(shù)crColor是畫筆的顏色。(2)選擇畫筆函數(shù)類屬:CPen::SelectObject

原型:Cpen*SelectObject(Cpen*pPen);返回值:被替代畫筆的指針。參數(shù)說明:參數(shù)pPen是Cpen類的被選中的新畫筆對(duì)象指針。本函數(shù)把原畫筆換成新畫筆,同時(shí)返回指向原畫筆的指針。(3)刪除畫筆函數(shù)類屬:CGdiObject::DeleteObject

原型:BOOLDeleteObject();返回值:非零。參數(shù)說明:畫筆使用完畢,把已成自由狀態(tài)的畫筆從系統(tǒng)內(nèi)存中清除。(4)選擇一支庫畫筆函數(shù)類屬:CDC::SelectStockObject

原型:virtualCGdiObject*SelectStockObject(int

nIndex);返回值:被替代的CGdiObject類對(duì)象的指針。

(4)選擇一支庫畫筆函數(shù)參數(shù)說明:參數(shù)nIndex是庫筆代碼Windows系統(tǒng)中準(zhǔn)備了一些使用頻率較高的畫筆,不需要?jiǎng)?chuàng)建,可以直接選用。同樣,使用完庫畫筆時(shí)也不需要調(diào)用DeleteObject()函數(shù)從內(nèi)存中刪除已使用過的畫筆。三種常用庫筆

庫筆代碼含義BLACK_PEN寬度為1的黑筆實(shí)線筆WHITE_PEN寬度為1的白筆實(shí)線筆NULL_PEN

透明筆4.畫刷函數(shù)VC++中的畫刷用于對(duì)圖形內(nèi)部進(jìn)行填充,也是繪圖工具類之一在使用VC++的畫刷之前必須先創(chuàng)建或選擇畫刷對(duì)象。畫刷函數(shù)創(chuàng)建實(shí)體畫刷函數(shù)BOOLCreateSolidBrush(COLORREF

crColor);選擇畫刷函數(shù)CBrush*SelectObject(CBrush*pBrush);刪除畫刷函數(shù)BOOLDeleteObject();創(chuàng)建陰影畫刷函數(shù)BOOLCreateHatchBrush(int

nIndex,COLORREF

crColor);第一個(gè)參數(shù)nIndex是陰影樣式代碼第二個(gè)參數(shù)crColor是陰影線的顏色選擇一只庫畫刷函數(shù)virtualCGdiObject*SelectStockObject(int

nIndex);5.繪制直線函數(shù)⑴設(shè)置直線的起點(diǎn)位置CPoint

MoveTo(intx,inty);⑵設(shè)置直線的終點(diǎn)位置BOOLLineTo(intx,inty);參數(shù)說明:采用起點(diǎn)閉區(qū)間,終點(diǎn)開區(qū)間的處理方法繪制直線的函數(shù)不指定直線的顏色,直線顏色可以通過畫筆函數(shù)來指定。例5從屏幕的(20,30)到(200,300)畫一條一像素寬的藍(lán)色直線。voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);

CPen

MyPen,*OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));

OldPen=pDC->SelectObject(&MyPen);

pDC->MoveTo(20,30);

pDC->LineTo(200,300);

pDC->SelectObject(OldPen);//加色

MyPen.DeleteObject();}pDC->MoveTo(20,30);移動(dòng)畫筆到(20,30)pDC->LineTo(200,300);從(20,30)畫線到(200,300)pDC->SelectObject(OldPen);將線畫成藍(lán)色6.繪制矩形函數(shù)類屬:CDC::Rectangle

原型:BOOLRectangle(intx1,inty1,intx2,inty2);返回值:非零。參數(shù)說明:該函數(shù)使用當(dāng)前畫刷填充矩形內(nèi)部,并用當(dāng)前畫筆繪制矩形邊界線。例6繪制左上角點(diǎn)為(100,100),右下角點(diǎn)為(600,300)的矩形。矩形邊框?yàn)橐幌袼貙挼乃{(lán)色邊界線,內(nèi)部填充紅色

voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);

CPen

MyPen,*OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));

OldPen=pDC->SelectObject(&MyPen);

CBrush

MyBrush,*OldBrush; MyBrush.CreateSolidBrush(RGB(255,0,0));

OldBrush=pDC->SelectObject(&MyBrush);

pDC->Rectangle(100,100,600,300);//畫矩形

pDC->SelectObject(OldPen);//畫框線為藍(lán)色

MyPen.DeleteObject();

pDC->SelectObject(OldBrush);//填充為紅色

MyBrush.DeleteObject();}7.繪制橢圓函數(shù)類屬:CDC::Ellipse

原型:BOOLEllipse(intx1,inty1,intx2,inty2);返回值:非零。參數(shù)說明:Ellipse函數(shù)中,參數(shù)x1,y1是限定橢圓范圍的外接矩形左上角點(diǎn)的坐標(biāo);參數(shù)x2,y2是限定橢圓范圍的外接矩形右下角點(diǎn)的坐標(biāo)注意VC++中沒有專門的畫圓函數(shù),只是把圓繪制為長(zhǎng)半軸和短半軸相等的橢圓。Ellipse函數(shù)使用當(dāng)前畫刷填充橢圓內(nèi)部,并用當(dāng)前畫筆繪制橢圓邊界線。例7將一個(gè)圓繪制在視區(qū)中央,圓的形狀依據(jù)視區(qū)形狀而定。當(dāng)窗口的形狀發(fā)生改變時(shí),圓的形狀也隨之改變。坐標(biāo)系的中點(diǎn)位于屏幕中心,X軸向右,Y軸向上。圓的邊界為一像素寬的藍(lán)色邊界線,內(nèi)部填充為紅色。voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);

CRect

Rect;//定義矩形對(duì)象

GetClientRect(&Rect);//獲得當(dāng)前窗口的客戶區(qū)大小

pDC->SetMapMode(MM_ANISOTROPIC);//設(shè)置MM_ANISOTROPIC映射模式

pDC->SetWindowExt(Rect.Width(),-Rect.Height());//設(shè)置窗口范圍

pDC->SetViewportExt(Rect.right,-Rect.bottom);//設(shè)置視區(qū)范圍

pDC->SetViewportOrg(Rect.right/2,Rect.bottom/2);//設(shè)置視口原點(diǎn)

CPen

MyPen,*OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));

OldPen=pDC->SelectObject(&MyPen);

CBrush

MyBrush,*OldBrush; MyBrush.CreateSolidBrush(RGB(255,0,0));

OldBrush=pDC->SelectObject(&MyBrush);

pDC->Ellipse(-Rect.right/2,-Rect.bottom/2,Rect.right/2,Rect.bottom/2);

pDC->SelectObject(OldPen);//藍(lán)邊

MyPen.DeleteObject();

pDC->SelectObject(OldBrush);//填充紅色

MyBrush.DeleteObject();}8.繪制圓弧函數(shù)BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);參數(shù)說明:Arc函數(shù)中參數(shù)x1,y1是限定圓弧范圍的外接矩形左上角點(diǎn)坐標(biāo)參數(shù)x2,y2是限定圓弧范圍的外接矩形右下角點(diǎn)坐標(biāo)參數(shù)x3,y3為圓弧起點(diǎn)坐標(biāo),該參數(shù)不一定嚴(yán)格位于圓弧上參數(shù)x4,y4為圓弧終點(diǎn)坐標(biāo),該參數(shù)也不一定嚴(yán)格位于圓弧上圓弧按逆時(shí)針方向繪制的。該函數(shù)使用當(dāng)前畫筆繪制圓弧邊界線。由于圓弧可能不封閉,所以圓弧不進(jìn)行填充。例8繪制第一象限內(nèi)的橢圓弧voidCTestView::OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);

CPen

MyPen,*OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));

OldPen=pDC->SelectObject(&MyPen);

pDC->Arc(100,100,600,300,100,200,350,600);

pDC->SelectObject(OldPen);

MyPen.DeleteObject();}9.繪制多邊形函數(shù)BOOLPolygon(LPPOINT

lpPoints,int

nCount);參數(shù)說明:第一個(gè)參數(shù)lpPoints指定多邊形頂點(diǎn)數(shù)組中每一個(gè)頂點(diǎn)是一個(gè)POINT結(jié)構(gòu)或CPoint對(duì)象第二個(gè)參數(shù)nCount指定多邊形數(shù)組中的頂點(diǎn)個(gè)數(shù)該函數(shù)用當(dāng)前畫筆繪制多邊形邊界線,用當(dāng)前畫刷填充多邊形內(nèi)部。例9繪制四個(gè)頂點(diǎn)分別位于視區(qū)上部中點(diǎn)、右部中點(diǎn)、下部中點(diǎn)和左部中點(diǎn)的菱形。邊界線為藍(lán)色,內(nèi)部用紅色填充voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

CRect

Rect;

GetClientRect(&Rect);//獲得客戶區(qū)

CPen

PenBlue(PS_SOLID,5,RGB(0,0,255));//定義粗藍(lán)色畫筆,繪制邊界線

CPen*OldPen=pDC->SelectObject(&PenBlue);//選取畫筆

CBrushBrushRed(RGB(255,0,0));//定義紅色畫刷,填充多邊形內(nèi)部

CBrush*OldBrush=pDC->SelectObject(&BrushRed);//選取畫刷

CPointp[4];//定義多邊形頂點(diǎn)數(shù)組

p[0].x=Rect.left+Rect.Width()/2;p[0].y=Rect.top;//計(jì)算頂部中點(diǎn)

p[1].x=Rect.right;p[1].y=Rect.top+Rect.Height()/2;//計(jì)算右部中點(diǎn)

p[2].x=p[0].x;p[2].y=Rect.bottom;//計(jì)算下部中點(diǎn)

p[3].x=Rect.left;p[3].y=p[1].y;//計(jì)算左部中點(diǎn)

pDC->Polygon(p,4);//繪制多邊形

pDC->SelectObject(OldPen);//畫筆勾邊

pDC->SelectObject(OldBrush);//畫刷填充}10.填充函數(shù)voidFillRect(LPCRECT

lpRect,CBrush*pBrush);參數(shù)說明:第一個(gè)參數(shù)lpRect指定矩形,是一個(gè)Rect結(jié)構(gòu)或CRect對(duì)象第二個(gè)參數(shù)pBrush指定畫刷對(duì)象指針。該函數(shù)將用當(dāng)前畫刷填充矩形內(nèi)部,但不畫邊界線。例10繪制(100,100)和(400,200)確定的紅色矩形。voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);

CRect

Rect;

CBrushpBrush(RGB(255,0,0));

CBrush*OldBrush=pDC->SelectObject(&pBrush);//定義紅色畫刷

Rect.left=100;Rect.top=100;

Rect.right=400;Rect.bottom=200;

pDC->FillRect(Rect,&pBrush);//選擇填充矩形內(nèi)部

pDC->SelectObject(OldBrush);//開始填充}11.路徑函數(shù)⑴打開路徑BOOLBeginPath();⑵關(guān)閉路徑圖BOOLEndPath();⑶填充路徑BOOLFillPath();例11繪制兩個(gè)多邊形,一個(gè)使用路徑填充,另一個(gè)不使用路徑填充,試觀察結(jié)果的異同。voidCTestView::OnDraw(CDC*pDC){

CTestDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc); //繪制第一個(gè)多邊形,用路徑填充圖

CPointp[7];//定義頂點(diǎn)數(shù)組p[0]=CPoint(340,240);p[1]=CPoint(260,160);p[2]=CPoint(220,260);p[3]=CPoint(260,370);p[4]=CPoint(320,300);p[5]=CPoint(360,380);p[6]=CPoint(440,220);

CBrush

MyBrush;

MyBrush.CreateSolidBrush(RGB(255,0,0));

CBrush*OldBrush=pDC->

SelectObject(&MyBrush);

pDC->BeginPath();

pDC->MoveTo(p[0]);//繪制多邊形

for(inti=1;i<7;i++)

pDC->LineTo(p[i]);

pDC->LineTo(p[0]);

pDC->EndPath();

pDC->FillPath();

pDC->SelectObject(OldBrush);

MyBrush.DeleteObject();

//繪制第二個(gè)多邊形,用畫刷填充p[0]=CPoint(740,240);p[1]=CPoint(660,160);p[2]=CPoint(620,260);p[3]=CPoint(660,370);p[4]=CPoint(720,300);p[5]=CPoint(760,380);p[6]=CPoint(840,220);

MyBrush.CreateSolidBrush(RGB(255,0,0));

OldBrush=pDC->SelectObject(&MyBrush);

pDC->Polygon(p,7);

pDC->SelectObject(OldBrush);

MyBrush.DeleteObject();}12.位圖函數(shù)⑴導(dǎo)入位圖BOOLLoadBitmap(UINT

nIDResource);參數(shù)nIDResource是資源的ID編號(hào)⑵建立與位圖相應(yīng)的內(nèi)存設(shè)備上下文virtualBOOLCreateCompatibleDC(CDC*pDC);參數(shù)pDC是設(shè)備上下文的指針,用于在向屏幕輸出圖形前作準(zhǔn)備。位圖函數(shù)⑶選擇位圖函數(shù)CBitmap*SelectObject(CBitmap*pBitmap);參數(shù)pBitmap是CBitmap類的被選中的新位圖指針對(duì)象。把原位圖換成新位圖,同時(shí)返回指向原位圖的指針。位圖函數(shù)⑷傳送位圖函數(shù)BOOLBitBlt(intx,inty,int

nWidth,int

nHeight,CDC*pSrcDC,int

xSrc,int

ySrc,DWORDdwRop);參數(shù)x,y是目標(biāo)區(qū)域的左上角點(diǎn)坐標(biāo)參數(shù)nWidth和nHeight是目標(biāo)區(qū)域的寬度和高度參數(shù)pSrcDC是源設(shè)備上下文的指針參數(shù)xSrc和ySrc是源位圖的左上角點(diǎn)坐標(biāo)參數(shù)dwRop是光柵操作碼例如dwRop=SRCCOPY,表示將原位圖直接拷貝到目標(biāo)位圖。例12在屏幕上顯示一幅位圖。原始位圖例12效果圖voidCTestView::OnDraw(CDC*pDC){ CTestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);

CRect

Rect;//定義客戶區(qū)

GetClientRect(&Rect);//獲得客戶區(qū)的大小

CDCMemDC;//定義一個(gè)內(nèi)存設(shè)備上下文對(duì)象

CBitmapBitmap,*OldBitmap;//定義一個(gè)CBitmap對(duì)象和一個(gè)CBitmap對(duì)象指針

Bitmap.LoadBitmap(IDB_BITMAP1);//從資源中導(dǎo)入圖片

MemDC.CreateCompatibleDC(pDC);//建立與位圖相應(yīng)的內(nèi)存設(shè)備上下文

OldBitmap=MemDC.SelectObject(&Bitmap);//在內(nèi)存設(shè)備上下文選用位圖圖像

pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);//將位圖數(shù)據(jù)傳送到屏幕

MemDC.SelectObject(OldBitmap);//將位圖圖像保存到內(nèi)存中}13.圖形文本函數(shù)⑴文本顏色設(shè)置函數(shù)類屬:CDC::SetTextColor原型:virtualCOLORREFSetTextColor(COLORREFcrColor);返回值:原文本顏色的RGB值。參數(shù)說明:指定文本顏色。圖形文本函數(shù)⑵文本背景顏色設(shè)置函數(shù)類屬:CDC::SetBkColor原型:virtualCOLORREFSetBkColor(COLORREFcrColor);返回值:原文本背景色的RGB值。參數(shù)說明:指定文本背景顏色。圖形文本函數(shù)(3)文本輸出函數(shù)類屬:CDC::TextOut原型:BOOLTextOut(

intx,inty,constCString&str);返回值:非零。參數(shù)說明:參數(shù)x,y是文本的起點(diǎn)坐標(biāo),參數(shù)str是CString對(duì)象。圖形文本函數(shù)⑷文本格式函數(shù)類屬:CString::Format原型:voidFormat(LPCTSTRlpszFormat,...);返回值:無。參數(shù)說明:參數(shù)lpszFormat是格式控制字符串,如%d、%f、%c等。本格式常用于輸出數(shù)值型數(shù)據(jù)。

例13在點(diǎn)(100,100)處輸出黃底紅字“ComputeGraphicsBasedonVC++!”;在(300,100)輸出“BoChuangResearchInstitute”;在(100,130)整數(shù)(5,8);在(130,130)處輸出小數(shù)(5.0,8.0)。voidCTestView::OnDraw(CDC*pDC){

CTestDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

inta1=5,b1=8;doublea2=5.2,b2=8.3;

CString

data,c="BoChuangResearchInstitute";

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkColor(RGB(255,255,0));pDC->TextOut(100,100,"ComputeGraphicsBasedonVC++!");//輸出文本1data.Format("%s",c);//輸出文本2pDC->TextOut(330,100,data);data.Format("%d,%d",a1,b1);//輸出整數(shù)pDC->TextOut(100,130,data);data.Format("%f,%f",a2,b2);//輸出小數(shù)pDC->TextOut(130,130,data);}例14使用雙緩沖機(jī)制在博創(chuàng)研究所位圖上輸出“博創(chuàng)研究所”文字。voidCTestView::OnDraw(CDC*pDC){

CTestDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

CRect

Rect;//定義客戶區(qū)

GetClientRect(&Rect);//獲得客戶區(qū)的大小

CDCMemDC;//定義內(nèi)存設(shè)備上下文

CDCPicture;//定義圖片;

CBitmapBitmap,*OldBitmap;//定義一個(gè)CBitmap對(duì)象和一個(gè)CBitmap對(duì)象指針

CBitmapBitmap;//定義一個(gè)CBitmap對(duì)象

CBitmap*OldBitmap;//定義一個(gè)CBitmap對(duì)象指針

Bitmap.LoadBitmap(IDB_BITMAP1);//從資源中導(dǎo)入位圖

MemDC.CreateComp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論