CBuilder_6图形、图像及实例_第1页
CBuilder_6图形、图像及实例_第2页
免费预览已结束,剩余51页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、okoket内容提要: 本文介绍了图形的绘制和图像处理, 其中详细介绍了画布(Canvas)的属性与使用方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。本文还介绍了图像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像处理, 几乎都离不开ScanLine技术。 使用ScanLine技术, 能够快速取得bitmap的每行的颜色值,而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值。关键字:C+Builder、图形、图像、画布引言:自 Windows 诞生以来,可以通过 GDI(Graphic

2、sDeviceInterface)来实现图形的绘制。然而对于初学者来说, 庞大复杂的 GDI 绘图系统是一个难以跨越的学习障碍。所幸的是,在C+Builder 绘图系统中,提供了一个简易可行的画布(Canvas),可以用非常直观的方式来实现Windows 下的绘图功能。C+Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处理。正文:1 在窗体上作图1.1 知识要点1. 画布(Canvas)在 C+Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含Canvas 属性。 Canvas 包含了许多和绘图有关的性质,

3、 如 Pen、 Brush、 Pixels、Font 等,另外它还包含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等。(1)Canvas 类主要属性有:Font:画布绘制文本所用的字体。Brush:用于填充背景的画笔刷。Pen:用来画线和描述图形轮廓的画笔。PenPos:当前绘图位置的坐标。Pixels:画布像素数组。2)Canvas 类主要方法有:Arc:用当前画笔在画布上画圆弧。Chord:绘制由直线和椭圆相交而成的一个封闭形状。CopyRect:将图形的一部分从另一个画布复制过来。Ellipse:在给定的区域绘制椭圆。FillRect:用当前画刷

4、填充指定的矩形。FloodFill:用当前画刷填充指定的区域。(3)LineTo 类主要方法有:MoveTo:连同 LineTo 绘制直线。Polygon:绘出一系列的线,串起所传入的各个点,并从最后一点到第一点绘制一条线。Polyline:绘出一系列的线,串起所传入的各个点。Rectangle:绘制圆角矩形。StretchDraw:在画布上给定的大小绘制图像。TextOut:在画布上写出字符串。TextRect:在限定的区域写出字符串,区域之外的字符串不会被显示出来。2. 颜色常数在 C+Builder 中提供了许多颜色的预定常数,这些预设颜色都以 cl(cl 代表color)为启始字1oC

5、+Builder 图形、图像及实例 wokcn符命名。例如 clRed 代表红色,clBlue 代表蓝色,clGreen 代表绿色等等。另外 C+Builder 也将 Windows的基本颜色以常数定义,如 clWindow 及 clMenu 分别代表 Window 及 Menu(菜单)的颜色。下面列出部分 C+Builder 定义的颜色常数:clBlack:黑色。clGreen:绿色。clOlive:橄榄绿。clNavy:海蓝色。clPurple:紫色。clTeal:青紫色。clGray:灰色。clSilver:银色。clRed:红色。clLime:灰绿色。clBlue:蓝色。clAqua:

6、淡绿青色。clWhite:白色。clBackground:Window 背景色。clActiveCaption:活动视窗的标题色。clInactiveCaption:非活动视窗的标题色。clMenu:Menu 的颜色。clWindow:Windows 的背景色。clMenuText: Menu 文字的颜色。clWindowText:Window 内文字的颜色。clCaptionText:标题文字的颜色。clActiveBorder:活动视窗的边界颜色。clHighlight:高亮度 Windows 颜色。clHightlightText:被选取文字的颜色。clGrayText:灰色文字的颜色。

7、clBtnText:Button 内文字的颜色。以下的程序表示将画布中(3,5)这一像素点的颜色设为蓝色:Canvas-Pixels35=clBlue;另外, 也可以利用以下的叙述来设定画笔的颜色为蓝色:Canvas-Pen-Color=RGB(0,0,255);3. RGB 函数任何一种颜色都是由红、绿、蓝三种基本色构成的。RGB 函数是 Windows 系统用以表示颜色的方式,它们用三个字节型参数变量,分别代表红色(Red)、绿色(Green)及蓝色(Blue)的强度值(0255 之间),组合起来表示颜色。例如 RGB(255,0,0)代表红色(RGB(255,0,0)所代表的颜色和颜色常

8、数 clRed 是相同的)。如果 RGB 函数中的三个参数相同,即红、绿、蓝的强度值一样,则其代表的颜色是黑白的。例如 RGB(255,255,255)代表白色,RGB(0,0,0)代表黑色。4. Tcolor 类Tcolor 是表示颜色的类,其实例可以是 clRed、clBlue、clGreen 等刚才介绍到的颜色常数,例如:Tcolorcolor=clRed;也可以使用 RGB 函数来取值,例如:2ookcnTcolorcolor=RGB(4,34,253);5. Pen 和 BrushTpen 是在 Canvas 画线所使用的“笔”,因此所有和线条有关的绘图函数都会受 Tpen 影响,如

9、LineTo、Ellipse、Polygon、PolyLine、Rectangle 等函数都使用“笔”来画线,可以利用 Canvas.Pen来存取 Pen,并且可以修改 Pen 的性质,这些性质包含 Color、Width、Style,以及 Mode 等。Style属性用来设置画笔样式:Pen-Style 二 psSolid,表示画笔是实心;二 psDash 表示破折线;二 psDot表示点线;=psDashDot表示破折线+点线;二 psClear 表示透明线。Width 属性用来设置画笔的宽度,Pen-Width=5 表示画笔的宽度为 5 个像素。Color 属性用来设定画笔的颜色。例如:

10、Canvas-Pen-Color 二 clBlue;则表示将画笔的颜色设为蓝色。Tbrush 可用来在 Canvas 的特定区域下着色。和 Tpen 不同的是,Tbrush可以用不同的颜色、样式及图案来填满 Canvas 的特定区域,而 Tpen 则是用来在 Canvas 上画线。Tbrush 的 Style 属性有 bsHorizontal、bsVertical、bsFDiagonal、bsBDiagonal、bsCross、bsDiagCross几种,分别代表实心、透明、水平线、垂直线、左上到右下的斜线,左下到右上的斜线、垂直交叉线、对角交叉线这几种填充方案。其中 bsClear 为默认值

11、。Tbrush 的 Color 属性设定与 Pen 的 Color 属性相一致。6. 常用的绘图函数1)Canvas-MoveTo(intX,intY);函数用法:MoveTo 是用以在使用 LineTo 之前设定画笔位置。使用此函数和直接设定Canvas 的 PenPos 属性的效果相同。2)Canvas-LineTo(intX,intY);函数用法:LineTo 函数用来从画笔位置画一条至(X,Y)点的直线,此直线不包含(X,Y)点,同时将画笔位置移至(X,Y)。所画的直线形状与 Pen 的属性一致。3)Canvas-Ellipse(intX1,intY1,intX2,intY2);函数用

12、法:利用 Ellipse 可在 Canvas 上画出圆形或椭圆形。其环绕矩形的左上角坐标为(XI,Y1)而右下角坐标为(X2,Y2)。若该矩形为正方形,则所绘图形为圆形。当此椭圆形绘制时,使用 Pen 的值画出其外框,而使用 Brush 值填满其内部。34) Canvas-Rectangle(intX1,intY1,intX2,intY2)函数用法:在 Canvas 上画出一矩形。其矩形的左上角坐标为(XI,Y1),而右下角坐标为(X2,Y2),矩形内部的填充效果根据画刷的类型确定。5)Canvas-Refresh()函数用法:清除画布。1.2 实例制作用鼠标随意作图1.程序设计思路所谓在窗体

13、上任意作图,就是要用鼠标在窗体上弹起弹落来确定所要画图形的起始位置,并设定好 Pen 和 Brush 的各种属性,可在窗体上绘制直线、矩形、椭圆等图形。2.程序实现步骤(1)打开 C+Builder,生成一个新的应用程序,在工程中加入的组件如表1 所示。ok工程中加入的组件及其属性bow.nbo设置好的程序界面如图 1 所示w.co图 1ok程序界面4eto.nwwetetokcnetok.cokcn(2)定义全局变量:intsort,ox,oy;/sort 代表要绘制图形的类别,ox、oy去时的坐标位置(3)在生成窗体事件中初始化 sort,编写代码如下:void_fastcallTForm

14、1:FormCreate(TObject*Sender)sort=0;/表示不绘制图形表示鼠标按下4)设定画笔的宽度、颜色、形状。编写代码如下:void_fastcallTForm1:Button6Click(TObject*Sender)if(ColorDialog1-Execute()TColorpencolor;Canvas-Pen-Color=ColorDialog1-Color;/设定画笔颜色void_fastcallTForm1:RadioButton1Click(TObject*Sender)Canvas-Pen-Style=psSolid;/设定画笔为实线void_fastca

15、llTForm1:RadioButton2Click(TObject*Sender)Canvas-Pen-Style=psDash/设定画笔为破折线void_fastcallTForm1:RadioButton3Click(TObject*Sender)Canvas-Pen-Style=psDot;/设定画笔为点线void_fastcallTForm1:RadioButton4Click(TObject*Sender)Canvas-Pen-Style=psDashDot;/设定画笔为点线+破void_fastcallTForm1:Edit1Change(TObject*Sender)Canva

16、s-Pen-Width=StrToInt(Edit1-Text);/设定线宽(5) 设定画刷的颜色、形状,编写代码如下:void_fastcallTForm1:Button7Click(TObject*Sender)if(ColorDialog1-Execute()折线TColorpencolor;Canvas-Brush-Color=ColorDialog1-Color;/设定画刷的颜色void_fastcallTForm1:RadioButton5Click(TObject*Sender)Canvas-Brush-Style=bsSolid;/设定画刷为实心5okcnvoid_fastca

17、llTForm1:RadioButton6Click(TObject*Sender)Canvas-Brush-Style=bsClear;void_fastcallTForm1:RadioButton7Click(TObject*Sender)/设定画刷为透明Canvas-Brush-Style=bsHorizontal;/设定画刷为水平填充void_fastcallTForm1:RadioButton8Click(TObject*Sender)Canvas-Brush-Style=bsVertical;/设定画刷为垂直填充(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)记录下鼠标在窗体上

19、按下的坐标,即确定所要画图形的起始位置,编写如下的代码:6void_fastcallTForm1:FormMouseDown(TObject*Sender,TMouseButtonButton,TShiftStateShift,intX,intY)ox=X;oy=Y;(8)编写鼠标在弹起时程序所要做的工作,编写如下的代码: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)程序编译运行,可在窗体上随意画出各种图形组合,如图 2 所示ww.nbo图 2 程序运行结果图3.程序分析与说明.n本例所画的图形在窗体重新调整大小时都自动消失,这是因为程序没有在FormPaint 事件中绘图。在 FormPaint 事件中绘制的图形不会在窗体调整时自动消失。2 彩色图变黑白图2.1 知识要点1. Image 组件Image 组件用来装载图像文件和在程序中显示图像Imag

21、e 组件位于Additional 组,该组件在模板中的位置如图 3 所示(图中提示信息上方的按钮)。图 3et 组件 okImage 的属性包括 Canvas(画布),用法如同 1 节知识要点所介绍。此外,它还有别的常用属性,如表 2 所示。表 2Image 组件的常用属性wwImage 的函数:ww.cImageokcnLoadFromFile(Stringfilename)函数用法:LoadFromFile 是将图形文件加载到 Image 组件中。例如要将C盘image文件夹中名为imagel.bmp的图形文件加入到Imagel组件,可在程序中加入如下代码:Imagel-Picture-L

22、oadFromFile(C:imageimagel.bmp);2. GetRValue、GetBValue 和 GetGValue这三个 API 函数是用来在颜色值中析取红、绿、蓝的强度值,分别返回一个0255 的亮度值。函数原型:BYTEGetRValue(TColorcolor);BYTEGetGValue(TColorcolor);BYTEGetBValue(TColorcolor);使用范例:BYTEnRed,nBlue,nGreen;TColorcolor=RGB(4,34,253);nRed=GetRValue(color);nGreen=GetGValue(color)nBlue

23、=GetBValue(color)结果说明:nRed=4;nBlue=34;nGreen=253;3. ScanLineC+Builder 提供了 ScanLine 处理技术读取整行的像素颜色值,提高了图像处理的速度。使用范例:Graphics:TBitmap*bitmap1;Byte*newscan;newscan=static_cast(bitmap1-ScanLine0);/newscan 指向位图 bitmapl 的第 1 行所有像素点的颜色值参数说明:Tbitmap 是位图类,封装了许多进行图像处理的属性和方法,其中包括了Canvas 属性和 ScanLine方法。2.2 实例制作逐

24、点实现彩色图变成黑白图1.程序设计思路8先用 Image 组件将图像装载进来。 从左到右, 从上到下, 使用 Image 的 Canvas的 Pixels 属性逐点取得每一个像素点的 color 值,然后使用 GetRValue、GetBValue 和GetGValue 函数析取红绿蓝的强度值,加以平均,即红、绿、蓝的强度值一样。将新的颜色值再赋给 Image的每一点的 Pixels 属性,即将彩色图变成黑白图。2.程序实现步骤(1)打开 C+Builder,生成一个新的应用程序。往窗体中加入的组件如表 3 所示。表 3 窗体中加入的组件及其属性okcn续表 3etetok设置好的程序界面如图

25、 4 所示。w.etetok图 4 设置好的程序界面(2)在 Unit7_1.cpp 开头部分定义全局变量:Graphics:TBitmap*bitmap1;Graphics:TBitmap*bitmap2;intx,y;/x 存放图像的宽度,y 存放图像的高度(3)编写单击 Button1 的 OnClick 事件,实现装载图片到 Image1 中(目前Image 装载的是 Bmp图片,4 节会介绍如何装载显示 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 事件,实现彩色图变成黑白图。编写如下代码: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)保存编译运行,2.3 节还会继续用到这个工程文件。3.程序分析与说明逐点实现彩色图变成黑白图,方法非常简单,易用,但是非常费时,所以程序运行时,尽量选取字节比较小的图片文件来进行处理。2.3 实例制作用 ScanLine 方法实现彩色图快速变黑白图1. 程序设计思路(1)将图像装载到 bitmap 位图

29、中,从上到下,使用 ScanLine 处理技术逐行读取像素颜色值。(2)使用 GetRValue、GetGValue 和 GetBValue 函数析取红绿蓝的强度值,加以平均。(3)使用 ScanLine 处理技术,逐行将新的颜色值赋给 bitmap 位图。2. 程序实现步骤(1)打开本文2.2 节中保存的工程文件, 编写单击Button3 的OnClick事件,实现彩色图快速变成黑白图。编写如下代码: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)编译运行程序,单击 Buttonl 选取一个 Bmp 图片,再单击 Button3,彩色图能够快速变成黑白图。3. 程序分析与说明要进行快速的图像处理,几乎都离不开 ScanLine 技术。而用 ScanLine 技术取得的 bitmap 每行的颜色,其存放顺序是

31、从左到右,每一点的蓝色、绿色、红色的亮度值,而不是红色、绿色、蓝色的次序,这一点要特别注意。10ookcn3 实现图像的特殊显示效果3.1 知识要点1.Sleep 函数Sleep 函数是系统的 API 函数库里提供的时间延迟函数。延迟在程序设计中非常有意义。现在的计算机系统,完成一个 for 循环:for(inti=0;i10000;i+)j=j+1;可能也只是在一瞬间就完成了。而在实现图像的特殊显示效果时,需要在一个过程的完成后,等待一定的时间,才运行程序下面的代码,这时就要使用到时间的延迟了。Sleep 函数只有一个整型参数 cMilliseconds,用来指定需要延迟的时间,它的单位是毫

32、秒。例如在程序中加入下面的代码:ShowMessage(现在开始计时);Sleep(3000);/延迟三秒ShowMessage(延迟了三秒!);程序运行时在弹出“现在开始计时”的对话框后, 程序在延迟了三秒钟的时间后,才弹出“延迟了三秒!”对话框。2.rand()、random()、Randomize()这三个随机函数是用来产生一个随机数。intrand()函数,它返回一个不大于 RAND_MAX 的随机数。RAND_MAX 是能够产生的最大随机数。intrandom(intnum);它返回一个不大于 num 的随机数。Randomize(intNumber);为产生一个随机数,应先执行 R

33、andomize 来初始化随机数生成器。其中 Number 参数是可选的,是变量或任何有效的数值表达式。Randomize 用Number 将 rand 函数的随机数生成器初始化。如果省略 Number,则用系统计时器返回的值作为新的种子值。如果没有使用 Randomize,则无参数的 Rand 函数将使用第一次调用 Rand 函数时的种子值。在使用随机函数时,必须加入stdlib.h和stdio.h两个头文件。比如有这么一段程序代码:intmax=RAND_MAX;Randomize();intx=255*rand()/max;inty=random(100);则 x 的取值介于 0255

34、之间,y 的取值介于 099 之间。3.2 实例制作图像淡入淡出效果1.程序设计思路图像淡入效果就是在一幅图像装载到 Image 组件后, 将图像各像素点的颜色值都置为黑色,再逐步均匀的增加图像各像素点的颜色值,直到恢复为原图。在这每一步中,都加入一定的时间延迟,以实现程序中图像淡入的效果。图像淡出效果则与之相反,即逐步均匀的减少图像各像素点的颜色值,直到图像各像素点的颜色值都变为黑色。2.程序实现步骤(1)打开 C+Builder,生成一个新的应用程序。往窗体中加入的组件如表4 所示。表 4 窗体中加入的组件及其属性bocnwwet设置好的程序界面如图 5 所示okcn.n.n 图 5 设置

35、好的程序界面 book续表 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、类的实例(4) 编写单击 Button1 的 OnClick 事件,实现利用对话框,将图形文件加载到 Image1 组件,12并取得 bitmap1 的长度和宽度。编写如下代码: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 保持不变,经过20 次均匀的变化,bitmap2里的值由 0 变为原始值。编写如下代码: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);/设置整幅图为黑色for(intl=0;l20;l+)/L 的取值代表着像素颜色变化的次数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 秒钟,以便观测到图像淡入的效果Image1-Picture-Bitmap-Assign(bitmap1);/恢复原图(6)编写单击的 Button3 的 OnClick 事件,使 bitmapl 保持不变,经过20 次均匀的变化,bitmap2里的值由原始值变为 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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论