ok.et内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形本文还介绍了图像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像处理,几乎都离不开 ScanLine 技术使用 ScanLine 技术,能够快速取得 bitmap 的每行的颜色值,而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值关键字:C++Builder、图形、图像、画布引言:自 Windows 诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制然 而 对 于 初 学 者 来 说 , 庞 大 复 杂 的 GDI 绘 图 系 统 是 一 个 难 以 跨 越 的 学 习 障 碍 所 幸 的 是 , 在C++Builder 绘图系统中,提供了一个简易可行的画布( Canvas),可以用非常直观的方式来实现Windows 下的绘图功能C++Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处理。
正文:1 在窗体上作图1.1 知识要点1. 画布( Canvas)在 C++Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含Canvas 属性Canvas 包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font 等,另外它还包含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等1)Canvas 类主要属性有:Font:画布绘制文本所用的字体Brush:用于填充背景的画笔刷Pen:用来画线和描述图形轮廓的画笔PenPos:当前绘图位置的坐标Pixels:画布像素数组2)Canvas 类主要方法有:Arc:用当前画笔在画布上画圆弧Chord:绘制由直线和椭圆相交而成的一个封闭形状CopyRect:将图形的一部分从另一个画布复制过来Ellipse:在给定的区域绘制椭圆FillRect:用当前画刷填充指定的矩形FloodFill:用当前画刷填充指定的区域3)LineTo 类主要方法有:MoveTo:连同 LineTo 绘制直线Polygon:绘出一系列的线,串起所传入的各个点,并从最后一点到第一点绘制一条线。
Polyline:绘出一系列的线,串起所传入的各个点Rectangle:绘制圆角矩形StretchDraw:在画布上给定的大小绘制图像TextOut:在画布上写出字符串TextRect:在限定的区域写出字符串,区域之外的字符串不会被显示出来2. 颜色常数在 C++Builder 中提供了许多颜色的预定常数,这些预设颜色都以 cl(cl 代表 color)为启始字※ 1 ※oC++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:淡绿青色clWhite:白色clBackground:Window 背景色。
clActiveCaption:活动视窗的标题色clInactiveCaption:非活动视窗的标题色clMenu:Menu 的颜色clWindow:Windows 的背景色clMenuText:Menu 文字的颜色clWindowText:Window 内文字的颜色clCaptionText:标题文字的颜色clActiveBorder:活动视窗的边界颜色clHighlight:高亮度 Windows 颜色clHightlightText:被选取文字的颜色clGrayText:灰色文字的颜色clBtnText:Button 内文字的颜色以下的程序表示将画布中(3,5)这一像素点的颜色设为蓝色:Canvas -> Pixels [3][5]=clBlue;另外,也可以利用以下的叙述来设定画笔的颜色为蓝色:Canvas->Pen->Color=RGB(0,0,255);3. RGB 函数任何一种颜色都是由红、绿、蓝三种基本色构成的RGB 函数是 Windows 系统用以表示颜色的方式,它们用三个字节型参数变量,分别代表红色(Red)、绿色(Green)及蓝色(Blue)的强度值(0~255 之间),组合起来表示颜色。
例如 RGB(255,0,0)代表红色(RGB(255,0,0)所代表的颜色和颜色常数 clRed 是相同的)如果 RGB 函数中的三个参数相同,即红、绿、蓝的强度值一样,则其代表的颜色是黑白的例如 RGB(255,255,255)代表白色,RGB(0,0,0)代表黑色4. Tcolor 类Tcolor 是表示颜色的类,其实例可以是 clRed、clBlue、clGreen 等刚才介绍到的颜色常数,例如:Tcolor color=clRed;也可以使用 RGB 函数来取值,例如:※ 2 ※ookcnTcolor color= RGB(4, 34, 253);5. Pen 和 BrushTpen 是在 Canvas 画线所使用的“笔”,因此所有和线条有关的绘图函数都会受 Tpen 影响,如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 属性用来设定画笔的颜色例如:Canvas->Pen->Color=clBlue;则表示将画笔的颜色设为蓝色Tbrush 可用来在 Canvas 的特定区域下着色和 Tpen 不同的是,Tbrush 可以用不同的颜色、样式及图案来填满 Canvas 的特定区域,而 Tpen 则是用来在 Canvas 上画线Tbrush 的 Style 属性有 bsHorizontal、bsVertical、bsFDiagonal、bsBDiagonal、bsCross、bsDiagCross几种,分别代表实心、透明、水平线、垂直线、左上到右下的斜线,左下到右上的斜线、垂直交叉线、对角交叉线这几种填充方案其中 bsClear 为默认值Tbrush 的 Color 属性设定与 Pen 的 Color 属性相一致6. 常用的绘图函数1)Canvas->MoveTo(int X, int Y);函数用法:MoveTo 是用以在使用 LineTo 之前设定画笔位置使用此函数和直接设定 Canvas 的 PenPos 属性的效果相同。
2)Canvas->LineTo(int X, int Y);函数用法:LineTo 函数用来从画笔位置画一条至(X,Y)点的直线,此直线不包含(X,Y)点,同时将画笔位置移至(X,Y)所画的直线形状与 Pen 的属性一致3)Canvas->Ellipse(int X1,int Y1,int X2,int Y2);函数用法:利用 Ellipse 可在 Canvas 上画出圆形或椭圆形其环绕矩形的左上角坐标为(X1,Y1)而右下角坐标为(X2,Y2)若该矩形为正方形,则所绘图形为圆形当此椭圆形绘制时,使用 Pen 的值画出其外框,而使用 Brush 值填满其内部4)Canvas->Rectangle(int X1, int Y1, int X2,int Y2);函数用法:在 Canvas 上画出一矩形其矩形的左上角坐标为(X1,Y1),而右下角坐标为(X2,Y2),矩形内部的填充效果根据画刷的类型确定5)Canvas->Refresh()函数用法:清除画布1.2 实例制作—— 用鼠标随意作图1. 程序设计思路所谓在窗体上任意作图,就是要用鼠标在窗体上弹起弹落来确定所要画图形的起始位置,并设定好 Pen 和 Brush 的各种属性,可在窗体上绘制直线、矩形、椭圆等图形。
2. 程序实现步骤(1)打开 C++Builder,生成一个新的应用程序,在工程中加入的组件如表 1 所示※ 3 ※owww.cn表 1ok工程中加入的组件及其属性ok.net.bow..nbo设置好的程序界面如图 1 所示w.c。