CBuilder_6圖形、圖像及實(shí)例_第1頁(yè)
CBuilder_6圖形、圖像及實(shí)例_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余51頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、okoket內(nèi)容提要: 本文介紹了圖形的繪制和圖像處理, 其中詳細(xì)介紹了畫布(Canvas)的屬性與使用方法,利用它們,可以非常直觀方便地繪制直線、曲線、矩形、橢圓等各種圖形。本文還介紹了圖像處理的方法,其中包括 Image 組件、TBitmap 類和 TJPEGImage 類的使用,而要進(jìn)行快速的圖像處理, 幾乎都離不開ScanLine技術(shù)。 使用ScanLine技術(shù), 能夠快速取得bitmap的每行的顏色值,而無(wú)需使用 Canvas 的 Pixels 屬性逐點(diǎn)獲取像素點(diǎn)的顏色值。關(guān)鍵字:C+Builder、圖形、圖像、畫布引言:自 Windows 誕生以來(lái),可以通過(guò) GDI(Graphic

2、sDeviceInterface)來(lái)實(shí)現(xiàn)圖形的繪制。然而對(duì)于初學(xué)者來(lái)說(shuō), 龐大復(fù)雜的 GDI 繪圖系統(tǒng)是一個(gè)難以跨越的學(xué)習(xí)障礙。所幸的是,在C+Builder 繪圖系統(tǒng)中,提供了一個(gè)簡(jiǎn)易可行的畫布(Canvas),可以用非常直觀的方式來(lái)實(shí)現(xiàn)Windows 下的繪圖功能。C+Builder 提供了 Image 組件,可以很方便地裝載圖像,以及進(jìn)行圖像處理。正文:1 在窗體上作圖1.1 知識(shí)要點(diǎn)1. 畫布(Canvas)在 C+Builder 中,幾乎所有的可視化組件(包括:Form、Image、Bitmap、PaintBox)都包含Canvas 屬性。 Canvas 包含了許多和繪圖有關(guān)的性質(zhì),

3、 如 Pen、 Brush、 Pixels、Font 等,另外它還包含了各種繪圖的函數(shù),如 LineTo、Rectangle、MoveTo、Polygon 等。(1)Canvas 類主要屬性有:Font:畫布繪制文本所用的字體。Brush:用于填充背景的畫筆刷。Pen:用來(lái)畫線和描述圖形輪廓的畫筆。PenPos:當(dāng)前繪圖位置的坐標(biāo)。Pixels:畫布像素?cái)?shù)組。2)Canvas 類主要方法有:Arc:用當(dāng)前畫筆在畫布上畫圓弧。Chord:繪制由直線和橢圓相交而成的一個(gè)封閉形狀。CopyRect:將圖形的一部分從另一個(gè)畫布復(fù)制過(guò)來(lái)。Ellipse:在給定的區(qū)域繪制橢圓。FillRect:用當(dāng)前畫刷

4、填充指定的矩形。FloodFill:用當(dāng)前畫刷填充指定的區(qū)域。(3)LineTo 類主要方法有:MoveTo:連同 LineTo 繪制直線。Polygon:繪出一系列的線,串起所傳入的各個(gè)點(diǎn),并從最后一點(diǎn)到第一點(diǎn)繪制一條線。Polyline:繪出一系列的線,串起所傳入的各個(gè)點(diǎn)。Rectangle:繪制圓角矩形。StretchDraw:在畫布上給定的大小繪制圖像。TextOut:在畫布上寫出字符串。TextRect:在限定的區(qū)域?qū)懗鲎址瑓^(qū)域之外的字符串不會(huì)被顯示出來(lái)。2. 顏色常數(shù)在 C+Builder 中提供了許多顏色的預(yù)定常數(shù),這些預(yù)設(shè)顏色都以 cl(cl 代表color)為啟始字1oC

5、+Builder 圖形、圖像及實(shí)例 wokcn符命名。例如 clRed 代表紅色,clBlue 代表藍(lán)色,clGreen 代表綠色等等。另外 C+Builder 也將 Windows的基本顏色以常數(shù)定義,如 clWindow 及 clMenu 分別代表 Window 及 Menu(菜單)的顏色。下面列出部分 C+Builder 定義的顏色常數(shù):clBlack:黑色。clGreen:綠色。clOlive:橄欖綠。clNavy:海藍(lán)色。clPurple:紫色。clTeal:青紫色。clGray:灰色。clSilver:銀色。clRed:紅色。clLime:灰綠色。clBlue:藍(lán)色。clAqua:

6、淡綠青色。clWhite:白色。clBackground:Window 背景色。clActiveCaption:活動(dòng)視窗的標(biāo)題色。clInactiveCaption:非活動(dòng)視窗的標(biāo)題色。clMenu:Menu 的顏色。clWindow:Windows 的背景色。clMenuText: Menu 文字的顏色。clWindowText:Window 內(nèi)文字的顏色。clCaptionText:標(biāo)題文字的顏色。clActiveBorder:活動(dòng)視窗的邊界顏色。clHighlight:高亮度 Windows 顏色。clHightlightText:被選取文字的顏色。clGrayText:灰色文字的顏色。

7、clBtnText:Button 內(nèi)文字的顏色。以下的程序表示將畫布中(3,5)這一像素點(diǎn)的顏色設(shè)為藍(lán)色:Canvas-Pixels35=clBlue;另外, 也可以利用以下的敘述來(lái)設(shè)定畫筆的顏色為藍(lán)色:Canvas-Pen-Color=RGB(0,0,255);3. RGB 函數(shù)任何一種顏色都是由紅、綠、藍(lán)三種基本色構(gòu)成的。RGB 函數(shù)是 Windows 系統(tǒng)用以表示顏色的方式,它們用三個(gè)字節(jié)型參數(shù)變量,分別代表紅色(Red)、綠色(Green)及藍(lán)色(Blue)的強(qiáng)度值(0255 之間),組合起來(lái)表示顏色。例如 RGB(255,0,0)代表紅色(RGB(255,0,0)所代表的顏色和顏色常

8、數(shù) clRed 是相同的)。如果 RGB 函數(shù)中的三個(gè)參數(shù)相同,即紅、綠、藍(lán)的強(qiáng)度值一樣,則其代表的顏色是黑白的。例如 RGB(255,255,255)代表白色,RGB(0,0,0)代表黑色。4. Tcolor 類Tcolor 是表示顏色的類,其實(shí)例可以是 clRed、clBlue、clGreen 等剛才介紹到的顏色常數(shù),例如:Tcolorcolor=clRed;也可以使用 RGB 函數(shù)來(lái)取值,例如:2ookcnTcolorcolor=RGB(4,34,253);5. Pen 和 BrushTpen 是在 Canvas 畫線所使用的“筆”,因此所有和線條有關(guān)的繪圖函數(shù)都會(huì)受 Tpen 影響,如

9、LineTo、Ellipse、Polygon、PolyLine、Rectangle 等函數(shù)都使用“筆”來(lái)畫線,可以利用 Canvas.Pen來(lái)存取 Pen,并且可以修改 Pen 的性質(zhì),這些性質(zhì)包含 Color、Width、Style,以及 Mode 等。Style屬性用來(lái)設(shè)置畫筆樣式:Pen-Style 二 psSolid,表示畫筆是實(shí)心;二 psDash 表示破折線;二 psDot表示點(diǎn)線;=psDashDot表示破折線+點(diǎn)線;二 psClear 表示透明線。Width 屬性用來(lái)設(shè)置畫筆的寬度,Pen-Width=5 表示畫筆的寬度為 5 個(gè)像素。Color 屬性用來(lái)設(shè)定畫筆的顏色。例如:

10、Canvas-Pen-Color 二 clBlue;則表示將畫筆的顏色設(shè)為藍(lán)色。Tbrush 可用來(lái)在 Canvas 的特定區(qū)域下著色。和 Tpen 不同的是,Tbrush可以用不同的顏色、樣式及圖案來(lái)填滿 Canvas 的特定區(qū)域,而 Tpen 則是用來(lái)在 Canvas 上畫線。Tbrush 的 Style 屬性有 bsHorizontal、bsVertical、bsFDiagonal、bsBDiagonal、bsCross、bsDiagCross幾種,分別代表實(shí)心、透明、水平線、垂直線、左上到右下的斜線,左下到右上的斜線、垂直交叉線、對(duì)角交叉線這幾種填充方案。其中 bsClear 為默認(rèn)值

11、。Tbrush 的 Color 屬性設(shè)定與 Pen 的 Color 屬性相一致。6. 常用的繪圖函數(shù)1)Canvas-MoveTo(intX,intY);函數(shù)用法:MoveTo 是用以在使用 LineTo 之前設(shè)定畫筆位置。使用此函數(shù)和直接設(shè)定Canvas 的 PenPos 屬性的效果相同。2)Canvas-LineTo(intX,intY);函數(shù)用法:LineTo 函數(shù)用來(lái)從畫筆位置畫一條至(X,Y)點(diǎn)的直線,此直線不包含(X,Y)點(diǎn),同時(shí)將畫筆位置移至(X,Y)。所畫的直線形狀與 Pen 的屬性一致。3)Canvas-Ellipse(intX1,intY1,intX2,intY2);函數(shù)用

12、法:利用 Ellipse 可在 Canvas 上畫出圓形或橢圓形。其環(huán)繞矩形的左上角坐標(biāo)為(XI,Y1)而右下角坐標(biāo)為(X2,Y2)。若該矩形為正方形,則所繪圖形為圓形。當(dāng)此橢圓形繪制時(shí),使用 Pen 的值畫出其外框,而使用 Brush 值填滿其內(nèi)部。34) Canvas-Rectangle(intX1,intY1,intX2,intY2)函數(shù)用法:在 Canvas 上畫出一矩形。其矩形的左上角坐標(biāo)為(XI,Y1),而右下角坐標(biāo)為(X2,Y2),矩形內(nèi)部的填充效果根據(jù)畫刷的類型確定。5)Canvas-Refresh()函數(shù)用法:清除畫布。1.2 實(shí)例制作用鼠標(biāo)隨意作圖1.程序設(shè)計(jì)思路所謂在窗體

13、上任意作圖,就是要用鼠標(biāo)在窗體上彈起彈落來(lái)確定所要畫圖形的起始位置,并設(shè)定好 Pen 和 Brush 的各種屬性,可在窗體上繪制直線、矩形、橢圓等圖形。2.程序?qū)崿F(xiàn)步驟(1)打開 C+Builder,生成一個(gè)新的應(yīng)用程序,在工程中加入的組件如表1 所示。ok工程中加入的組件及其屬性bow.nbo設(shè)置好的程序界面如圖 1 所示w.co圖 1ok程序界面4eto.nwwetetokcnetok.cokcn(2)定義全局變量:intsort,ox,oy;/sort 代表要繪制圖形的類別,ox、oy去時(shí)的坐標(biāo)位置(3)在生成窗體事件中初始化 sort,編寫代碼如下:void_fastcallTForm

14、1:FormCreate(TObject*Sender)sort=0;/表示不繪制圖形表示鼠標(biāo)按下4)設(shè)定畫筆的寬度、顏色、形狀。編寫代碼如下:void_fastcallTForm1:Button6Click(TObject*Sender)if(ColorDialog1-Execute()TColorpencolor;Canvas-Pen-Color=ColorDialog1-Color;/設(shè)定畫筆顏色void_fastcallTForm1:RadioButton1Click(TObject*Sender)Canvas-Pen-Style=psSolid;/設(shè)定畫筆為實(shí)線void_fastca

15、llTForm1:RadioButton2Click(TObject*Sender)Canvas-Pen-Style=psDash/設(shè)定畫筆為破折線void_fastcallTForm1:RadioButton3Click(TObject*Sender)Canvas-Pen-Style=psDot;/設(shè)定畫筆為點(diǎn)線void_fastcallTForm1:RadioButton4Click(TObject*Sender)Canvas-Pen-Style=psDashDot;/設(shè)定畫筆為點(diǎn)線+破void_fastcallTForm1:Edit1Change(TObject*Sender)Canva

16、s-Pen-Width=StrToInt(Edit1-Text);/設(shè)定線寬(5) 設(shè)定畫刷的顏色、形狀,編寫代碼如下:void_fastcallTForm1:Button7Click(TObject*Sender)if(ColorDialog1-Execute()折線TColorpencolor;Canvas-Brush-Color=ColorDialog1-Color;/設(shè)定畫刷的顏色void_fastcallTForm1:RadioButton5Click(TObject*Sender)Canvas-Brush-Style=bsSolid;/設(shè)定畫刷為實(shí)心5okcnvoid_fastca

17、llTForm1:RadioButton6Click(TObject*Sender)Canvas-Brush-Style=bsClear;void_fastcallTForm1:RadioButton7Click(TObject*Sender)/設(shè)定畫刷為透明Canvas-Brush-Style=bsHorizontal;/設(shè)定畫刷為水平填充void_fastcallTForm1:RadioButton8Click(TObject*Sender)Canvas-Brush-Style=bsVertical;/設(shè)定畫刷為垂直填充(6)確定下一步是畫橢圓、畫直線、畫矩形、清屏還是終止繪圖,編寫如下的

18、代碼:void_fastcallTForm1:Button1Click(TObject*Sender)sort=0;void_fastcallTForm1:Button2Click(TObject*Sender)sort=1;void_fastcallTForm1:Button4Click(TObject*Sender)sort=2;void_fastcallTForm1:Button3Click(TObject*Sender)sort=3;void_fastcallTForm1:Button5Click(TObject*Sender)Canvas-Refresh();(7)記錄下鼠標(biāo)在窗體上

19、按下的坐標(biāo),即確定所要畫圖形的起始位置,編寫如下的代碼:6void_fastcallTForm1:FormMouseDown(TObject*Sender,TMouseButtonButton,TShiftStateShift,intX,intY)ox=X;oy=Y;(8)編寫鼠標(biāo)在彈起時(shí)程序所要做的工作,編寫如下的代碼:void_fastcallTForm1:FormMouseUp(TObject*Sender,TMouseButtonButton,TShiftStateShift,intX,intY)switch(sort)case1:Canvas-MoveTo(ox,oy);Canvas

20、-LineTo(X,Y);okcnbreak;case2:Canvas-Rectangle(ox,oy,X,Y);break;case3:Canvas-Ellipse(ox,oy,X,Y);break;(9)程序編譯運(yùn)行,可在窗體上隨意畫出各種圖形組合,如圖 2 所示ww.nbo圖 2 程序運(yùn)行結(jié)果圖3.程序分析與說(shuō)明.n本例所畫的圖形在窗體重新調(diào)整大小時(shí)都自動(dòng)消失,這是因?yàn)槌绦驔](méi)有在FormPaint 事件中繪圖。在 FormPaint 事件中繪制的圖形不會(huì)在窗體調(diào)整時(shí)自動(dòng)消失。2 彩色圖變黑白圖2.1 知識(shí)要點(diǎn)1. Image 組件Image 組件用來(lái)裝載圖像文件和在程序中顯示圖像Imag

21、e 組件位于Additional 組,該組件在模板中的位置如圖 3 所示(圖中提示信息上方的按鈕)。圖 3et 組件 okImage 的屬性包括 Canvas(畫布),用法如同 1 節(jié)知識(shí)要點(diǎn)所介紹。此外,它還有別的常用屬性,如表 2 所示。表 2Image 組件的常用屬性wwImage 的函數(shù):ww.cImageokcnLoadFromFile(Stringfilename)函數(shù)用法:LoadFromFile 是將圖形文件加載到 Image 組件中。例如要將C盤image文件夾中名為imagel.bmp的圖形文件加入到Imagel組件,可在程序中加入如下代碼:Imagel-Picture-L

22、oadFromFile(C:imageimagel.bmp);2. GetRValue、GetBValue 和 GetGValue這三個(gè) API 函數(shù)是用來(lái)在顏色值中析取紅、綠、藍(lán)的強(qiáng)度值,分別返回一個(gè)0255 的亮度值。函數(shù)原型:BYTEGetRValue(TColorcolor);BYTEGetGValue(TColorcolor);BYTEGetBValue(TColorcolor);使用范例:BYTEnRed,nBlue,nGreen;TColorcolor=RGB(4,34,253);nRed=GetRValue(color);nGreen=GetGValue(color)nBlue

23、=GetBValue(color)結(jié)果說(shuō)明:nRed=4;nBlue=34;nGreen=253;3. ScanLineC+Builder 提供了 ScanLine 處理技術(shù)讀取整行的像素顏色值,提高了圖像處理的速度。使用范例:Graphics:TBitmap*bitmap1;Byte*newscan;newscan=static_cast(bitmap1-ScanLine0);/newscan 指向位圖 bitmapl 的第 1 行所有像素點(diǎn)的顏色值參數(shù)說(shuō)明:Tbitmap 是位圖類,封裝了許多進(jìn)行圖像處理的屬性和方法,其中包括了Canvas 屬性和 ScanLine方法。2.2 實(shí)例制作逐

24、點(diǎn)實(shí)現(xiàn)彩色圖變成黑白圖1.程序設(shè)計(jì)思路8先用 Image 組件將圖像裝載進(jìn)來(lái)。 從左到右, 從上到下, 使用 Image 的 Canvas的 Pixels 屬性逐點(diǎn)取得每一個(gè)像素點(diǎn)的 color 值,然后使用 GetRValue、GetBValue 和GetGValue 函數(shù)析取紅綠藍(lán)的強(qiáng)度值,加以平均,即紅、綠、藍(lán)的強(qiáng)度值一樣。將新的顏色值再賦給 Image的每一點(diǎn)的 Pixels 屬性,即將彩色圖變成黑白圖。2.程序?qū)崿F(xiàn)步驟(1)打開 C+Builder,生成一個(gè)新的應(yīng)用程序。往窗體中加入的組件如表 3 所示。表 3 窗體中加入的組件及其屬性okcn續(xù)表 3etetok設(shè)置好的程序界面如圖

25、 4 所示。w.etetok圖 4 設(shè)置好的程序界面(2)在 Unit7_1.cpp 開頭部分定義全局變量:Graphics:TBitmap*bitmap1;Graphics:TBitmap*bitmap2;intx,y;/x 存放圖像的寬度,y 存放圖像的高度(3)編寫單擊 Button1 的 OnClick 事件,實(shí)現(xiàn)裝載圖片到 Image1 中(目前Image 裝載的是 Bmp圖片,4 節(jié)會(huì)介紹如何裝載顯示 jpeg 圖片)。編寫如下代碼:void_fastcallTForm1:Button1Click(TObject*Sender)bitmap1=newGraphics:Tbitmap

26、;bitmap2=newGraphics:Tbitmap;Stringopenname,extension;if(OpenPictureDialog1-Execute()openname=OpenPictureDialog1-FileName;extension=openname.SubString(openname.Length()-2,3);Image1-Picture-LoadFromFile(openname);if(LowerCase(extension)=bmp)/如果是 Bmp 圖片bitmap1-LoadFromFile(openname);bitmap2-LoadFromFi

27、le(openname);x=bitmap1-Width;y=bitmap1-Height;bitmap1-PixelFormat=pf24bit;bitmap2-PixelFormat=pf24bit;Image1-Picture-Bitmap-Assign(bitmap1);(4)編寫單擊 Button2 的 OnClick 事件,實(shí)現(xiàn)彩色圖變成黑白圖。編寫如下代碼:void_fastcallTForm1:Button2Click(TObject*Sender)intrgb,i,j,r,g,b;TColorcolor;for(i=0;iWidth;i+)for(j=0;jHeight;j+

28、)9ookcncolor=Image1-Canvas-Pixelsij;r=GetRValue(color)g=GetGValue(color)b=GetBValue(color);rgb=(r+g+b)/3;Image1-Canvas-Pixelsij=RGB(rgb,rgb,rgb);(5)保存編譯運(yùn)行,2.3 節(jié)還會(huì)繼續(xù)用到這個(gè)工程文件。3.程序分析與說(shuō)明逐點(diǎn)實(shí)現(xiàn)彩色圖變成黑白圖,方法非常簡(jiǎn)單,易用,但是非常費(fèi)時(shí),所以程序運(yùn)行時(shí),盡量選取字節(jié)比較小的圖片文件來(lái)進(jìn)行處理。2.3 實(shí)例制作用 ScanLine 方法實(shí)現(xiàn)彩色圖快速變黑白圖1. 程序設(shè)計(jì)思路(1)將圖像裝載到 bitmap 位圖

29、中,從上到下,使用 ScanLine 處理技術(shù)逐行讀取像素顏色值。(2)使用 GetRValue、GetGValue 和 GetBValue 函數(shù)析取紅綠藍(lán)的強(qiáng)度值,加以平均。(3)使用 ScanLine 處理技術(shù),逐行將新的顏色值賦給 bitmap 位圖。2. 程序?qū)崿F(xiàn)步驟(1)打開本文2.2 節(jié)中保存的工程文件, 編寫單擊Button3 的OnClick事件,實(shí)現(xiàn)彩色圖快速變成黑白圖。編寫如下代碼:void_fastcallTForm1:Button3Click(TObject*Sender)Byte*ptr,*newscan;Byter,g,b,bgr;bitmap1-Assign(Im

30、age1-Picture-Graphic);for(inti=0;iy;i+)/y 為位圖的高度ptr=static_cast(bitmap1-ScanLinei);newscan=static_cast(bitmap2-ScanLinei);for(intj=0;jPicture-Bitmap-Assign(bitmap2);(2)編譯運(yùn)行程序,單擊 Buttonl 選取一個(gè) Bmp 圖片,再單擊 Button3,彩色圖能夠快速變成黑白圖。3. 程序分析與說(shuō)明要進(jìn)行快速的圖像處理,幾乎都離不開 ScanLine 技術(shù)。而用 ScanLine 技術(shù)取得的 bitmap 每行的顏色,其存放順序是

31、從左到右,每一點(diǎn)的藍(lán)色、綠色、紅色的亮度值,而不是紅色、綠色、藍(lán)色的次序,這一點(diǎn)要特別注意。10ookcn3 實(shí)現(xiàn)圖像的特殊顯示效果3.1 知識(shí)要點(diǎn)1.Sleep 函數(shù)Sleep 函數(shù)是系統(tǒng)的 API 函數(shù)庫(kù)里提供的時(shí)間延遲函數(shù)。延遲在程序設(shè)計(jì)中非常有意義。現(xiàn)在的計(jì)算機(jī)系統(tǒng),完成一個(gè) for 循環(huán):for(inti=0;i10000;i+)j=j+1;可能也只是在一瞬間就完成了。而在實(shí)現(xiàn)圖像的特殊顯示效果時(shí),需要在一個(gè)過(guò)程的完成后,等待一定的時(shí)間,才運(yùn)行程序下面的代碼,這時(shí)就要使用到時(shí)間的延遲了。Sleep 函數(shù)只有一個(gè)整型參數(shù) cMilliseconds,用來(lái)指定需要延遲的時(shí)間,它的單位是毫

32、秒。例如在程序中加入下面的代碼:ShowMessage(現(xiàn)在開始計(jì)時(shí));Sleep(3000);/延遲三秒ShowMessage(延遲了三秒!);程序運(yùn)行時(shí)在彈出“現(xiàn)在開始計(jì)時(shí)”的對(duì)話框后, 程序在延遲了三秒鐘的時(shí)間后,才彈出“延遲了三秒!”對(duì)話框。2.rand()、random()、Randomize()這三個(gè)隨機(jī)函數(shù)是用來(lái)產(chǎn)生一個(gè)隨機(jī)數(shù)。intrand()函數(shù),它返回一個(gè)不大于 RAND_MAX 的隨機(jī)數(shù)。RAND_MAX 是能夠產(chǎn)生的最大隨機(jī)數(shù)。intrandom(intnum);它返回一個(gè)不大于 num 的隨機(jī)數(shù)。Randomize(intNumber);為產(chǎn)生一個(gè)隨機(jī)數(shù),應(yīng)先執(zhí)行 R

33、andomize 來(lái)初始化隨機(jī)數(shù)生成器。其中 Number 參數(shù)是可選的,是變量或任何有效的數(shù)值表達(dá)式。Randomize 用Number 將 rand 函數(shù)的隨機(jī)數(shù)生成器初始化。如果省略 Number,則用系統(tǒng)計(jì)時(shí)器返回的值作為新的種子值。如果沒(méi)有使用 Randomize,則無(wú)參數(shù)的 Rand 函數(shù)將使用第一次調(diào)用 Rand 函數(shù)時(shí)的種子值。在使用隨機(jī)函數(shù)時(shí),必須加入stdlib.h和stdio.h兩個(gè)頭文件。比如有這么一段程序代碼:intmax=RAND_MAX;Randomize();intx=255*rand()/max;inty=random(100);則 x 的取值介于 0255

34、之間,y 的取值介于 099 之間。3.2 實(shí)例制作圖像淡入淡出效果1.程序設(shè)計(jì)思路圖像淡入效果就是在一幅圖像裝載到 Image 組件后, 將圖像各像素點(diǎn)的顏色值都置為黑色,再逐步均勻的增加圖像各像素點(diǎn)的顏色值,直到恢復(fù)為原圖。在這每一步中,都加入一定的時(shí)間延遲,以實(shí)現(xiàn)程序中圖像淡入的效果。圖像淡出效果則與之相反,即逐步均勻的減少圖像各像素點(diǎn)的顏色值,直到圖像各像素點(diǎn)的顏色值都變?yōu)楹谏?.程序?qū)崿F(xiàn)步驟(1)打開 C+Builder,生成一個(gè)新的應(yīng)用程序。往窗體中加入的組件如表4 所示。表 4 窗體中加入的組件及其屬性bocnwwet設(shè)置好的程序界面如圖 5 所示okcn.n.n 圖 5 設(shè)置

35、好的程序界面 book續(xù)表 ok(2) 在 Unit7_2.cpp 開頭部分,加入頭文件和定義全局變量:#include#includeGraphics:TBitmap*bitmap1;Graphics:TBitmap*bitmap2;Byte*ptr,*newscan;intx,y;(3) 在生成窗體事件中初始化 bitmapl、bitmap2,編寫如下代碼:void_fastcallTForm1:FormCreate(TObject*Sender)bitmap1=newGraphics:TBitmap();bitmap2=newGraphics:TBitmap();/生成 Tbitmap

36、類的實(shí)例(4) 編寫單擊 Button1 的 OnClick 事件,實(shí)現(xiàn)利用對(duì)話框,將圖形文件加載到 Image1 組件,12并取得 bitmap1 的長(zhǎng)度和寬度。編寫如下代碼:void_fastcallTForm1:Button1Click(TObject*Sender)Stringopenname;if(OpenPictureDialog1-Execute()openname=OpenPictureDialog1-FileName;Image1-Picture-LoadFromFile(openname);bitmap1-LoadFromFile(openname);bitmap2-Loa

37、dFromFile(openname);bitmap1-PixelFormat=pf24bit;bitmap2-PixelFormat=pf24bit;x=bitmap1-Width;okcny=bitmap1-Height;(5)編寫單擊 Button2 的 OnClick 事件,使得 bitmapl 保持不變,經(jīng)過(guò)20 次均勻的變化,bitmap2里的值由 0 變?yōu)樵贾?。編寫如下代碼:void_fastcallTForm1:Button2Click(TObject*Sender)bitmap2-Assign(Image1-Picture-Graphic);bitmap1-Assign(I

38、mage1-Picture-Graphic);Byter,g,b,bgr;for(inti=0;iy;i+)newscan=static_cast(bitmap2-ScanLinei)for(intj=0;jPicture-Bitmap-Assign(bitmap2);/設(shè)置整幅圖為黑色for(intl=0;l20;l+)/L 的取值代表著像素顏色變化的次數(shù)for(inti=0;iy;i+)ptr=static_cast(bitmap1-ScanLinei);/bitmap1 保持不變newscan=static_cast(bitmap2-ScanLinei);for(intj=0;jPict

39、ure-Bitmap-Assign(bitmap2);Form1-Refresh();/窗體重畫Sleep(1000);/Imagel 每一次變化后程序停頓 1 秒鐘,以便觀測(cè)到圖像淡入的效果Image1-Picture-Bitmap-Assign(bitmap1);/恢復(fù)原圖(6)編寫單擊的 Button3 的 OnClick 事件,使 bitmapl 保持不變,經(jīng)過(guò)20 次均勻的變化,bitmap2里的值由原始值變?yōu)?0。編寫如下代碼:void_fastcallTForm1:Button3Click(TObject*Sender)bitmap2-Assign(Image1-Picture-Graphic);bitmap1-Assign(Image1-Picture-Graphic);Byter,g,b;for(intl=0;l20;l+)for(inti=0;iy;i+)13ookcnptr=static_cast(bitmap1-ScanLinei);newscan=static_cast(bitmap2-ScanLinei);f

溫馨提示

  • 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)論