第九章:图像管理
deplhi提供了一个tcanvas(画布)类来供用户解决图形的处理问题.而在vcl内就有许多可视化组件都包含canvas属性.也就是说,你可以在包含有canvas属性的可视化组件上面绘制图形如:tform,tlistbox,timage等组件,其实我们要这样想,本来要某个组件上画图是非常复杂的,你必须去调用windows 关于图像的api函数去达到目的,但是delphi把这些复杂的操作都封装在tcanvas类中去了,只留下一些接口(也就是用户使用的绘图函数) 与用户交互。这就是面向对像中的封装性的体现
delphi提供了许多绘图组件,它们分别是:tcanvas,tpen,tbrush,tcolor,tpicture,timage,tbitmap类等以下我们就针对这些组件来说明其用法,有趣的在delphi的组件面板中,我们根本就看不到这些对应的组件,我们必须在程序中动态的创建这些类的实例。如此一来,才能够使用类中的方法:
tcanvas组件的用法
tcanvas组件是一个用于绘图的画布,在这块画布区域内,你可以利用此组件所提供的方法来实现各种绘图功能很多vcl的可视化组件如:tform,tmemo等)的canvas属性就是tcanvas组件.在组件是绘图就等于在组件的画布上绘制。tcanvas的brush,pen,fon属于则分别是tbursh,tpen,tfont组件。它们用来定义绘制图形的笔刷画笔,字体等数据。在画布上绘图必须知道画笔的所在位置,这个位置数值是定义在penpos属性中的,而如果想移动画笔所在的位置,可用moveto方法。若是想要在画布上输入文字,则可用textout方法.基本上tcanvas有很多方法 如下:
copyrect:把某个画布组件上的某部分图片复制到当前的画布上。比如:
re:=rect(10,10,100,100);
bi:=tbitmap.Create;
bi.LoadFromFile('c:\test\sn.bmp');
form1.Canvas.CopyRect(re,bi.Canvas,re);
draw(x,y:integer;graphic:tgraphic):把某个画布组件上的全部图形画到画布上
ellips(rect):
lineto(x,y:integer):从当前画笔所在位置开始画一条线到(x,y)所指定的位置,并把画笔移动到(x,y)
moveto(x,y:integer):将画笔移动到(x,y)位置。画笔当前位置在存放到penpos属性中,是只读属性
Rectangle(rect):画一个矩形
RoundRect(x1,y1,x2,y2,x3,y3):画一个圆角矩形
polygon(p):画一个多边形:
其中p为坐标结构数组:
如下:
var p:array[0..2] of tpoint;
form1.Canvas.Rectangle(0,0,form1.ClientWidth div 2,form1.ClientHeight div 2);
form1.Canvas.RoundRect(0,0,form1.ClientWidth div 2 ,form1.ClientHeight div 2,10,10);
form1.Canvas.Ellipse(0,0,form1.ClientWidth div 2,form1.ClientHeight div 2);
p[0].X:=0;p[0].Y:=0;
p[1].X:=50;p[1].Y:=0;
p[2].X:=75;p[2].Y:=50;
p[3].X :=25;p[3].Y:=50;
p[4].X:=0;p[4].Y:=0;
form1.Canvas.Polygon(p);
举列:
tpen:
tpen组件是用来定义在画布上绘制各种线条的画笔数据,画笔的颜色在属性color中定义。线条的宽度在属性width中定义,style属性定义了线条的各种类型。
tbrush:
tbrush:刷组件是用来填充图形区域.style属性则定义了笔刷填充图形的形式,bitmap则决定要填充的图片数据。可以用位图,位图大小为8*8,color则决定的要填充的颜色
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('c:\a.bmp');
Form1.Canvas.Brush.Bitmap := Bitmap;
Form1.Canvas.Rectangle(rect(10,10,100,100)); [填充方形]
bitmap.Free;
tpicture:
tpicture组件可以保存位图,图标等格式的图片数据。graphic属性中包括了图片的格式,图片的高度和宽度分别保存在height,width中。loadfromfile方法则是用来加载图形文件.savetofile方法可以保存图形。
要把图片复制到剪切板上可以用tclipboard组件的assign方法,可以使用下面的方法把剪切板上的图形粘贴到image1上
A:把图形复制到剪贴板:
clipboard.Assign(form1.Image2.Picture);
B:把剪贴板上的图形粘贴
if clipboard.HasFormat(cf_bitmap) then
form1.Image1.Picture.Assign(clipboard);