Delphi7 图形图像编程

合集下载

delphi画图

delphi画图

TShape组件的属性,事件和方法TImage组件的属性,事件和方法Paintbox组件的属性,事件和方法使用鼠标事件的绘图第 9章图像图形应用编程9.1 图形应用编程本章主要是讲解图形图像对象的概念以及如何在程序运行时绘制图形图像等内容,主要是通过一些例子来讲解 Delphi 7.0 对图形图像强大的处理功能。

在 Delphi 7.0中,专门定义了一组对象和部件用以绘制图形,完成一些简单的图像功能。

利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,得到不同风格的图形。

另外,通过鼠标事件的定义,可以方便地设计图形绘制程序。

9.1.1 画布对象属性在图形应用编程中,最常用到的是 canvas类,就是常说的画布。

它可以将某些组件的表面作为一张画布,允许编程者利用有关的命令在其上任意地作图。

很多组件都支持画布这个属性,同时画布本身又是一个对象,它也有自己的属性,但是这些属性必须要在程序执行时才可以来进行设置。

常用的属性有以下几个。

( 1)图形像素数组( PixArray)属性PixArray属性确定用于像素颜色的读取和像素颜色的设置。

( 2)画笔( Pen)属性Pen属性确定画布用做画线及轮廓线的画笔。

9.1.1 画布对象属性 (1)( 3)画刷( Brush)属性Brush属性确定画布用于填充图像及背景色的颜色及图案。

( 4)字体( Font)属性Font属性确定画布的字体。

1,像素像素是构成图形的最基本的单位,画布上每一个点都有对应的像素,用来代表构成一个图形的某一点的颜色。

像素的处理一般包括像素颜色的读取和像素颜色的设置。

最常用的是利用画布的 Pixels属性,来绘制函数曲线。

【例 9-1】用 Pixels属性来画 Y=X的函数曲线。

运行后的界面如图 9-1所示。

图 9-1 用像素来画图主要的功能如下:单击显示按钮,在屏幕上就可以画出 Y=X的函数图。

主要的程序代码如下:图 9-1 用像素来画图9.1.1 画布对象属性 (2)procedure TForm1.Button1Click(Sender,TObject);VAR xt,yt,t:integer; //xt,yt是用来决定像素的位置,t用来控制循环次数。

Delphi中图形图像与多媒体技术

Delphi中图形图像与多媒体技术
例:卫星的制作及使用。
图象控件Image
例:编写Button的单击事件代码如下: begin Image1.picture.loadFromfile((‘图像文件路径')); end;
图象控件Image
也可使用打开图片对话框,在窗体中添加图片 对话框openpicturedialog控件,并将 button1的click事件代码改为如下所示,则可 实现交互式打开图片的方法:
myshape.Left :=280+15*i;
myshape.Width :=250-25*i;
myshape.Parent :=form1;
end;
第6章 图形图像与多媒体技术
6.1 几何图形控件Shape 6.2 图象控件Image 6.3 画布(Canvas)对象
像素操作 画笔操作 画刷操作 6.4 PaintBox画板控件 6.5 多媒体程序设计 卡通控件 媒体播放器
:='shape'+inttostr(i);
myshape.Shape :=stellipse;
myshape.Pen.Color :=clblue;
myshape.Brush .style:=bsbdiagonal;
myshape.Top:=96;
myshape.Height :=233;
lineto(x,y: Integer)。
(3) 画折线的方法,使用方法为Polyline(points:array of TPoint)。
2. 画矩形的方法
rectangle(x1,y1,x2,y2:integer);
3. 画圆或椭圆的方法
ellipse(x1,y1,x2,y2:integer);

Delphi中怎么编写图像解析组件

Delphi中怎么编写图像解析组件

Delphi中怎么编写图像解析组件Delphi中怎么编写图像解析组件Delphi作为一个强大的RAD研发工具,在应用软件的研发方面一直有着他的独特优势。

这种优势同样体目前图像相关软件的研发上。

如果你要在桌面上放置一张图像,只需要简单的在桌面上放置一个Image控件,然后就能通过其Image属性任意的加载BMP、WMF、EMF等格式的图像。

如果还想增加对JPEG的支持,只需要添加一个JPEG单元即可。

甚至在Image中加载一张JPEG后,Delphi会自动添加一个JPEG单元。

一切做起来就是这么的简单。

基本格式都已封装在了VCL中,那么Delphi对类似JPEG这样图像格式的支持是怎么实现的呢?其实从TPicture中非常容易看出其中的实现过程,他能理解为所有图像对象的容器。

如JPEG.pas中有如下两句代码:TPicture.RegisterFileFormat(jpeg, sJPEGImageFile, TJPEGImage);TPicture.RegisterFileFormat(jpg, sJPEGImageFile, TJPEGImage);(sJPEGImageFile = JPEG Image File,见JConsts.pas)什么意思呢?能理解为将TJPEGImage注册为jpeg、jpg两种后缀图像文件的类。

其实质就是将后缀,图像描述,具体图像解析类等信息保存到了FileFormats。

具体见如下代码:var FileFormats: TFileFormatsList = nil;class procedure TPicture.RegisterFileFormat(const AExtension,ADescription: string; AGraphicClass: TGraphicClass);beginGetFileFormats.Add(AExtension, ADescription, 0, AGraphicClass);end;function GetFileFormats: TFileFormatsList;beginif FileFormats = nil then FileFormats := TFileFormatsList.Create;Result := FileFormats;end;而TPicture默认支持四种图像格式是因为TFileFormatsList的构造函数中已进行了添加。

delphi7编程技巧与实例精解之图形图像(修正重绘变形)

delphi7编程技巧与实例精解之图形图像(修正重绘变形)

delphi7编程技巧与实例精解之图形图像(修正重绘变形)unit Unit1;interfaceusesWin do ws, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ComCtrls, ExtCtrls, StdCtrls;typeTForm1 = class(TForm)img1: TImage;btn1: TButton;btn2: TButton;tmr1: TTimer;tb1: TTrackBar;dlgOpen1: TOpenDialog;rg1: TRadioGroup;procedure FormCreate(Sender: TObject);procedure tb1Change(Sender: TObject);procedure btn1Click(Sender: TObject);procedure tmr1Timer(Sender: TObject);procedure btn2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;i: Integer;L,T,R,B: Integer;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); beginT:= Img1.Top;l:= img1.Left;b:= img1.Top+ img1.Height;r:= img1.Left+ img1.Width;end;procedure TForm1.tb1Change(Sender: TObject); begintmr1.Interval:= tb1.Position;end;procedure TForm1.btn1Click(Sender: TObject); vark: Integer;beginCanvas.Pen.Color:= Form1.Color;if rg1.ItemIndex<2 then beginfor k:= 0 to b do beginCanvas.MoveTo(0,k);Canvas.LineTo(r,k);end;end else if rg1.ItemIndex=2 then beginfor k:=0 to b+4 do beginCanvas.MoveTo(0,k);Canvas.LineTo(r,k);end;end;tmr1.Enabled:= True;i:= 0;end;procedure TForm1.tmr1Timer(Sender: TObject);varx,y: Integer;beginif rg1.ItemIndex=0 then beginSelf.Canvas.CopyRect(Rect(l,t+i,r,t+i+1),img1.Canvas,Rec t(0,0+i,img1.Width,0+i+1));Self.Canvas.CopyRect(Rect(l,b-i,r,b-i+1),img1.Canvas,Rect(0,img1.Height-i,img1.Width,img1.Height-i+1));i:= i+1;if i>b/2-1 then tmr1.Enabled:= False;end else if rg1.ItemIndex=1 then beginSelf.Canvas.CopyRect(Rect(l,t+i*4,r,t+i*4+2),img1.Canvas ,Rect(0,0+i*4,img1.Width,0+i*4+2));Self.Canvas.CopyRect(Rect(l,b-i*4-2,r,b-I*4),img1.Canvas,Rect(0,img1.Height-i*4-2,img1.Width,img1.Height-i*4));i:= i+1;if i>img1.Height/4 then tmr1.Enabled:= False;end else if rg1.ItemIndex=2 then beginfor x:= 0 to (img1.Width div 8 ) do beginfor y:= 0 to (img1.Height div 8 ) do begincase i of0:Self.Canvas.CopyRect(Rect(l+x*8,t+y*8,l+x*8+4,t+y*8+4),im g1.Canvas,Rect(0+x*8,0+y*8,0+x*8+4,0+y*8+4));1:Self.Canvas.CopyRect(Rect(l+x*8+4,t+y*8+4,l+x*8+8,t+y*8+ 8),img1.Canvas,Rect(0+x*8+4,0+y*8+4,0+x*8+8,0+y*8+8));2:Self.Canvas.CopyRect(Rect(L+x*8,t+y*8+4,l+x*8+4,t+y*8+8) ,img1.Canvas,Rect(0+x*8,0+y*8+4,0+x*8+4,0+y*8+8));3:Self.Canvas.CopyRect(Rect(l+x*8+4,t+y*8,l+x*8+8,t+y*8+4), img1.Canvas,Rect(0+x*8+4,0+y*8,0+x*8+8,0+y*8+4));end;end;end;i:= i+1;if i>3 then tmr1.Enabled:= False;end;end;procedure TForm1.btn2Click(Sender: TObject);beginif not dlgOpen1.Execute then Exit;img1.Picture.LoadFromFile(dlgOpen1.FileName);T:= Img1.Top;l:= img1.Left;b:= img1.Top+ img1.Height;r:= img1.Left+ img1.Width;end;end.。

Delphi基本图像处理方法.

Delphi基本图像处理方法.

本文实例汇总了Delphi基本图像处理方法。

分享给大家供大家参考。

具体分析如下: //浮雕 procedureEmboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer;overload; var i, j, Gray, Azimuthvalue, R, G, B: integer; SrcRGB, SrcRGB1, SrcRGB2, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLine[i]; DestRGB := DestBmp.ScanLine[i]; if (AzimuthChange >= -180 and (AzimuthChange < -135 then begin if i > 0 then SrcRGB1 := SrcBmp.ScanLine[i-1] else SrcRGB1 := SrcRGB; Inc(SrcRGB1; SrcRGB2 := SrcRGB; Inc(SrcRGB2; end else if (AzimuthChange >= -135 and (AzimuthChange < -90 then begin if i > 0 thenSrcRGB1 := SrcBmp.ScanLine[i-1] else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; Inc(SrcRGB2; end else if (AzimuthChange >= -90 and (AzimuthChange < -45 then begin if i > 0 then SrcRGB1 := SrcBmp.ScanLine[i-1] else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; end else if (AzimuthChange >= -45 and (AzimuthChange < 0 then begin SrcRGB1 := SrcRGB; if i > 0 then SrcRGB2 := SrcBmp.ScanLine[i-1] else SrcRGB2 := SrcRGB; end else if (AzimuthChange >= 0 and (AzimuthChange < 45 then begin SrcRGB2 := SrcRGB; if (i < SrcBmp.Height - 1 then SrcRGB1 := SrcBmp.ScanLine[i+1] else SrcRGB1 := SrcRGB; end else if (AzimuthChange >= 45 and (AzimuthChange < 90 then begin if (i < SrcBmp.Height - 1 then SrcRGB1 := SrcBmp.ScanLine[i+1] else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; end else if (AzimuthChange >= 90 and (AzimuthChange < 135 then begin if (i < SrcBmp.Height - 1 then SrcRGB1 := SrcBmp.ScanLine[i+1] else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; Inc(SrcRGB1; end else if (AzimuthChange >= 135 and (AzimuthChange <= 180 then begin if (i < SrcBmp.Height - 1 then SrcRGB2 := SrcBmp.ScanLine[i+1] else SrcRGB2 := SrcRGB; Inc(SrcRGB2; SrcRGB1 := SrcRGB; Inc(SrcRGB1; end; for j := 0 to SrcBmp.Width - 1 do begin if (AzimuthChange >= -180 and (AzimuthChange < -135 then begin Azimuthvalue := AzimuthChange + 180; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= -135 and (AzimuthChange < -90 then begin Azimuthvalue := AzimuthChange + 135; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= -90 and (AzimuthChange < -45 then begin if j=1 then Inc(SrcRGB1,-1; Azimuthvalue := AzimuthChange + 90;R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= -45 and (AzimuthChange < 0 then begin if j=1 then begin Inc(SrcRGB1,-1; Inc(SrcRGB2,-1; end; Azimuthvalue := AzimuthChange + 45; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= 0 and (AzimuthChange < 45 then begin if j=1 then begin Inc(SrcRGB1,-1; Inc(SrcRGB2,-1; end; Azimuthvalue := AzimuthChange; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= 45and (AzimuthChange < 90 then begin if j=1 then Inc(SrcRGB2,-1; Azimuthvalue := AzimuthChange - 45; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= 90 and (AzimuthChange < 135 then begin Azimuthvalue := AzimuthChange - 90;R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= 135 and (AzimuthChange <= 180 then begin Azimuthvalue := AzimuthChange - 135;R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed*Azimuthvalue div 45-((SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen*Azimuthvalue div 45-((SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue*Azimuthvalue div 45-((SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end; R:=Min(R,255; R:=Max(R,0; G:=Min(G,255; G:=Max(G,0; B:=Min(B,255; B:=Max(B,0; Gray := (R shr 2 + (R shr 4 + (G shr 1 + (G shr 4 + (B shr 3; DestRGB.rgbtRed:=Gray; DestRGB.rgbtGreen:=Gray; DestRGB.rgbtBlue:=Gray; if (j=-180 and (AzimuthChange<-135 or ((AzimuthChange>=90 and (AzimuthChange<=180 then begin Inc(SrcRGB1; end; if (j=135 and (AzimuthChange<180 or ((AzimuthChange>=-180 and (AzimuthChange<=-90 then begin Inc(SrcRGB2; end;Inc(SrcRGB; Inc(DestRGB; end; end; end; procedureEmboss(Bmp:TBitmap;AzimuthChange:integer;ElevationChange:integer;WeightChange: integer;overload; var DestBmp:TBitmap; begin DestBmp:=TBitmap.Create; DestBmp.Assign(Bmp;Emboss(Bmp,DestBmp,AzimuthChange,ElevationChange,WeightChange;Bmp.Assign(DestBmp; end; //反色 procedure Negative(Bmp:TBitmap; var i, j: Integer; PRGB: pRGBTriple; begin Bmp.PixelFormat:=pf24Bit; for i := 0 to Bmp.Height - 1 do begin PRGB := Bmp.ScanLine[i]; for j := 0 to Bmp.Width - 1 do beginPRGB^.rgbtRed :=not PRGB^.rgbtRed ; PRGB^.rgbtGreen :=not PRGB^.rgbtGreen; PRGB^.rgbtBlue :=not PRGB^.rgbtBlue; Inc(PRGB; end; end; end; //曝光 procedure Exposure(Bmp:TBitmap; var i, j: integer; PRGB: pRGBTriple; beginBmp.PixelFormat:=pf24Bit; for i := 0 to Bmp.Height - 1 do begin PRGB :=Bmp.ScanLine[i]; for j := 0 to Bmp.Width - 1 do begin if PRGB^.rgbtRed<128 then PRGB^.rgbtRed :=not PRGB^.rgbtRed ; if PRGB^.rgbtGreen<128 thenPRGB^.rgbtGreen :=not PRGB^.rgbtGreen; if PRGB^.rgbtBlue<128 thenPRGB^.rgbtBlue :=not PRGB^.rgbtBlue; Inc(PRGB; end; end; end; //模糊 procedure Blur(SrcBmp:TBitmap; var i, j:Integer; SrcRGB:pRGBTriple; SrcNextRGB:pRGBTriple; SrcPreRGB:pRGBTriple; Value:Integer; procedure IncRGB; begin Inc(SrcPreRGB;Inc(SrcRGB; Inc(SrcNextRGB; end; procedure DecRGB; begin Inc(SrcPreRGB,-1;Inc(SrcRGB,-1; Inc(SrcNextRGB,-1; end; begin SrcBmp.PixelFormat:=pf24Bit; for i := 0 to SrcBmp.Height - 1 do begin if i > 0 then SrcPreRGB:=SrcBmp.ScanLine[i-1] else SrcPreRGB := SrcBmp.ScanLine[i]; SrcRGB := SrcBmp.ScanLine[i]; if i <SrcBmp.Height - 1 then SrcNextRGB:=SrcBmp.ScanLine[i+1] elseSrcNextRGB:=SrcBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if j > 0 then DecRGB; Value:=SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed; if j > 0 then IncRGB;Value:=Value+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed; if j < SrcBmp.Width - 1 then IncRGB;Value:=(Value+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed div 9; DecRGB; SrcRGB.rgbtRed:=value;if j > 0 then DecRGB;Value:=SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen; if j > 0 thenIncRGB;Value:=Value+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen; if j < SrcBmp.Width - 1 then IncRGB;Value:=(Value+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen div 9; DecRGB; SrcRGB.rgbtGreen:=value; if j > 0 then DecRGB;Value:=SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue; if j > 0 then IncRGB; Value:=Value+SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue; if j < SrcBmp.Width - 1 then IncRGB;Value:=(Value+SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue div 9; DecRGB; SrcRGB.rgbtBlue:=value; IncRGB; end; end; end; //锐化 procedureSharpen(SrcBmp:TBitmap; var i, j: integer; SrcRGB: pRGBTriple; SrcPreRGB: pRGBTriple; Value: integer; begin SrcBmp.PixelFormat:=pf24Bit; for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLine[i]; if i > 0 then SrcPreRGB:=SrcBmp.ScanLine[i-1] else SrcPreRGB:=SrcBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if j = 1 then Dec(SrcPreRGB;Value:=SrcRGB.rgbtRed+(SrcRGB.rgbtRed-SrcPreRGB.rgbtRed div 2;Value:=Max(0,Value; Value:=Min(255,Value; SrcRGB.rgbtRed:=value;Value:=SrcRGB.rgbtGreen+(SrcRGB.rgbtGreen-SrcPreRGB.rgbtGreen div 2;Value:=Max(0,Value; Value:=Min(255,Value; SrcRGB.rgbtGreen:=value;Value:=SrcRGB.rgbtBlue+(SrcRGB.rgbtBlue-SrcPreRGB.rgbtBlue div 2;Value:=Max(0,Value; Value:=Min(255,Value; SrcRGB.rgbtBlue:=value; Inc(SrcRGB; Inc(SrcPreRGB; end; end; end; [图像的旋转和翻转] 以下代码用ScanLine配合指针移动实现,用于24位色! //旋转90度 procedure Rotate90(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap; Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Height; Bmp.Height := Bitmap.Width; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLine[j]; for i := 0 to Width do beginrowOut := Bmp.ScanLine[i]; Inc(rowOut,Height - j; rowOut^ := rowIn^; Inc(rowIn; end;end; Bitmap.Assign(Bmp; end; //旋转180度 procedure Rotate180(constBitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap;Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Width; Bmp.Height := Bitmap.Height; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLine[j]; for i := 0 to Width do begin rowOut := Bmp.ScanLine[Height - j]; Inc(rowOut,Width - i; rowOut^ := rowIn^; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; //旋转270度procedure Rotate270(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap; Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Height; Bmp.Height := Bitmap.Width; Bmp.PixelFormat :=pf24bit; Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLine[j]; for i := 0 to Width do begin rowOut :=Bmp.ScanLine[Width - i]; Inc(rowOut,j; rowOut^ := rowIn^; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; //任意角度 functionRotateBitmap(Bitmap:TBitmap;Angle:Integer;BackColor:TColor:TBitmap; vari,j,iOriginal,jOriginal,CosPoint,SinPoint : integer; RowOriginal,RowRotated : pRGBTriple; SinTheta,CosTheta : Extended; AngleAdd : integer; beginResult:=TBitmap.Create; Result.PixelFormat := pf24bit;Result.Canvas.Brush.Color:=BackColor; Angle:=Angle Mod 360; if Angle<0 then Angle:=360-Abs(Angle; if Angle=0 then Result.Assign(Bitmap else if Angle=90 then begin Result.Assign(Bitmap; Rotate90(Result;//如果是旋转90度,直接调用上面的代码 end else if (Angle>90 and (Angle<180 then begin AngleAdd:=90; Angle:=Angle-AngleAdd; end else if Angle=180 then begin Result.Assign(Bitmap; Rotate180(Result;//如果是旋转180度,直接调用上面的过程 end else if (Angle>180 and (Angle<270 then begin AngleAdd:=180; Angle:=Angle-AngleAdd; end else if Angle=270 then begin Result.Assign(Bitmap; Rotate270(Result;//如果是旋转270度,直接调用上面的过程end else if (Angle>270 and (Angle<360 then begin AngleAdd:=270; Angle:=Angle-AngleAdd; end else AngleAdd:=0; if (Angle>0 and (Angle<90 then begin SinCos((Angle+ AngleAdd * Pi / 180, SinTheta, CosTheta; if (SinTheta * CosTheta < 0 then begin Result.Width := Round(Abs(Bitmap.Width * CosTheta - Bitmap.Height * SinTheta; Result.Height := Round(Abs(Bitmap.Width * SinTheta - Bitmap.Height * CosTheta; end else begin Result.Width := Round(Abs(Bitmap.Width * CosTheta + Bitmap.Height * SinTheta; Result.Height := Round(Abs(Bitmap.Width * SinTheta + Bitmap.Height * CosTheta; end; CosTheta:=Abs(CosTheta; SinTheta:=Abs(SinTheta; if (AngleAdd=0 or (AngleAdd=180 then begin CosPoint:=Round(Bitmap.Height*CosTheta;SinPoint:=Round(Bitmap.Height*SinTheta; end else beginSinPoint:=Round(Bitmap.Width*CosTheta; CosPoint:=Round(Bitmap.Width*SinTheta; end; for j := 0 to Result.Height-1 do begin RowRotated := Result.Scanline[j]; for i := 0 to Result.Width-1 do begin Case AngleAdd of 0: begin jOriginal := Round((j+1*CosTheta-(i+1-SinPoint*SinTheta-1; iOriginal := Round((i+1*CosTheta-(CosPoint-j-1*SinTheta-1; end; 90: begin iOriginal := Round((j+1*SinTheta-(i+1-SinPoint*CosTheta-1; jOriginal := Bitmap.Height-Round((i+1*SinTheta-(CosPoint-j-1*CosTheta; end; 180: begin jOriginal := Bitmap.Height-Round((j+1*CosTheta-(i+1-SinPoint*SinTheta; iOriginal := Bitmap.Width-Round((i+1*CosTheta-(CosPoint-j-1*SinTheta; end; 270: begin iOriginal := Bitmap.Width-Round((j+1*SinTheta-(i+1-SinPoint*CosTheta; jOriginal := Round((i+1*SinTheta-(CosPoint-j-1*CosTheta-1; end; end; if (iOriginal >= 0 and (iOriginal <= Bitmap.Width-1and (jOriginal >= 0 and (jOriginal <=Bitmap.Height-1 then begin RowOriginal := Bitmap.Scanline[jOriginal];Inc(RowOriginal,iOriginal; RowRotated^ := RowOriginal^; Inc(RowRotated; end else begin Inc(RowRotated; end; end; end; end; end; //水平翻转 procedure FlipHorz(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap;Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Width; Bmp.Height := Bitmap.Height; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLine[j]; for i := 0 to Width do begin rowOut := Bmp.ScanLine[j]; Inc(rowOut,Width - i; rowOut^ := rowIn^; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; //垂直翻转 procedureFlipVert(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple;Bmp:TBitmap; Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Height; Bmp.Height := Bitmap.Width; Bmp.PixelFormat := pf24bit;Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do beginrowIn := Bitmap.ScanLine[j]; for i := 0 to Width do begin rowOut :=Bmp.ScanLine[Height - j]; Inc(rowOut,i; rowOut^ := rowIn^; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; [亮度、对比度、饱和度的调整] 以下代码用ScanLine配合指针移动实现! function Min(a, b: integer: integer; begin if a < b then result := a else result := b; end; function Max(a, b: integer: integer; begin if a > b then result := a else result := b; end; //亮度调整 procedure BrightnessChange(constSrcBmp,DestBmp:TBitmap;ValueChange:integer; var i, j: integer; SrcRGB, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB :=SrcBmp.ScanLine[i]; DestRGB := DestBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if ValueChange > 0 then begin DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange; DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange; DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange; end else begin DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + ValueChange; DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + ValueChange; DestRGB.rgbtBlue := Max(0,SrcRGB.rgbtBlue + ValueChange; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; //对比度调整 procedure ContrastChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var i, j: integer; SrcRGB, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLine[i]; DestRGB := DestBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if ValueChange>=0 then begin if SrcRGB.rgbtRed >= 128 then DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange else DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed - ValueChange; if SrcRGB.rgbtGreen >= 128 then DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen - ValueChange; ifSrcRGB.rgbtBlue >= 128 then DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue - ValueChange; end else begin if SrcRGB.rgbtRed >= 128 then DestRGB.rgbtRed := Max(128,SrcRGB.rgbtRed + ValueChange else DestRGB.rgbtRed := Min(128, SrcRGB.rgbtRed - ValueChange; if SrcRGB.rgbtGreen >= 128 then DestRGB.rgbtGreen := Max(128, SrcRGB.rgbtGreen + ValueChange else DestRGB.rgbtGreen := Min(128,SrcRGB.rgbtGreen - ValueChange; if SrcRGB.rgbtBlue >= 128 thenDestRGB.rgbtBlue := Max(128, SrcRGB.rgbtBlue + ValueChange elseDestRGB.rgbtBlue := Min(128, SrcRGB.rgbtBlue - ValueChange; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; //饱和度调整 procedure SaturationChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var Grays: array[0..767] of Integer; Alpha: array[0..255] of Word; Gray, x, y: Integer; SrcRGB,DestRGB: pRGBTriple; i: Byte; begin ValueChange:=ValueChange+255; for i := 0 to 255 do Alpha[i] := (i * ValueChange Shr 8; x := 0; for i := 0 to 255 do begin Gray := i - Alpha[i]; Grays[x] := Gray; Inc(x; Grays[x] := Gray; Inc(x; Grays[x] := Gray; Inc(x; end; for y := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLine[Y]; DestRGB := DestBmp.ScanLine[Y]; for x := 0 to SrcBmp.Width - 1 do begin Gray :=Grays[SrcRGB.rgbtRed + SrcRGB.rgbtGreen + SrcRGB.rgbtBlue]; if Gray +Alpha[SrcRGB.rgbtRed]>0 then DestRGB.rgbtRed := Min(255,Gray +Alpha[SrcRGB.rgbtRed] else DestRGB.rgbtRed := 0; if Gray +Alpha[SrcRGB.rgbtGreen]>0 then DestRGB.rgbtGreen := Min(255,Gray +Alpha[SrcRGB.rgbtGreen] else DestRGB.rgbtGreen := 0; if Gray +Alpha[SrcRGB.rgbtBlue]>0 then DestRGB.rgbtBlue := Min(255,Gray +Alpha[SrcRGB.rgbtBlue] else DestRGB.rgbtBlue := 0; Inc(SrcRGB; Inc(DestRGB; end; end; end; //RGB调整 procedureRGBChange(SrcBmp,DestBmp:TBitmap;RedChange,GreenChange,BlueChange:integer; var SrcRGB, DestRGB: pRGBTriple; i,j:integer; begin for i := 0 to SrcBmp.Height- 1 dobegin SrcRGB := SrcBmp.ScanLine[i]; DestRGB :=DestBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if RedChange> 0 then DestRGB.rgbtRed:= Min(255, SrcRGB.rgbtRed + RedChange else DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + RedChange; if GreenChange> 0 then DestRGB.rgbtGreen :=Min(255, SrcRGB.rgbtGreen + GreenChange else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + GreenChange; if BlueChange> 0 then DestRGB.rgbtBlue :=Min(255, SrcRGB.rgbtBlue + BlueChange else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue + BlueChange; Inc(SrcRGB; Inc(DestRGB; end; end; end; [颜色调整] //RGB<=>BGR procedure RGB2BGR(const Bitmap:TBitmap; var X: Integer; Y: Integer; PRGB: pRGBTriple; Color: Byte; begin for Y := 0 to (Bitmap.Height - 1 do begin forX := 0 to (Bitmap.Width - 1 do begin Color := PRGB^.rgbtRed; PRGB^.rgbtRed := PRGB^.rgbtBlue; PRGB^.rgbtBlue := Color; Inc(PRGB; end; end end; end; //灰度化(加权 procedure Grayscale(const Bitmap:TBitmap; var X: Integer; Y: Integer; PRGB: pRGBTriple; Gray: Byte; begin for Y := 0 to (Bitmap.Height - 1 do begin PRGB := Bitmap.ScanLine[Y]; for X := 0 to (Bitmap.Width - 1 do begin Gray := (77 * Red + 151 * Green + 28 * Blue shr 8; PRGB^.rgbtRed:=Gray; PRGB^.rgbtGreen:=Gray;PRGB^.rgbtBlue:=Gray; Inc(PRGB; end; end; end; 绘图区-即窗口显示图像的区域,亦可为全屏幕(在全屏幕下绘图的效果比一般窗口下好)中心点-即要绘图区显示的中心点在原始图像的坐标(声明:这个概念特别重要)先说说图像的放大,要放大一张图片,我们一般的做法是直接放大图像,但本文介绍的方法仅放大我们能够看到的部分,放大分两种情况,一种是放大后比绘图区还要小,这种情况没什么好说,当然是显示全部的图像;第二种是放大后的图像比绘图区大,这才是我们今天要讨论的重点话题,这种情况下我们先要确定图像放大后的大小,然后根据“中心点”计算在原始图像的位置和大小,最后把截取的图像放大到绘图区。

Delphi 7教程9

Delphi 7教程9

9.1.1 画布对象属性(7) 画布对象属性(
B. 画第二个方形 在没有图像交叉的部分与画第一个方形没什么两样,背景画图处 还是灰色的RGB(191,191,191),所以画出来的还是淡黑色的。 第二次按按钮 根据前面讲的外面黑色的部分被反成灰色,而中间的灰色被求了两次反 还是灰色。如图9-5所示。 简单地举以上几个例子,其他的属性值自己去尝试一下,你可以看到许 多意想不到的效果。 (4)宽度属性(Width) 表示画笔的粗细程度,单位是像素,默认值为1,表示为一个像素。设置方 式为: canvas.Pen.Width:=<整型>; 例如:canvas.Pen.Width:=5;就设置了画笔的宽度为5个像素。 3. 画刷(Brush) 画刷( ) 画刷(Brush)属性是用来设置图形内部区域的填充方式。 (1)颜色(Color)属性 颜色属性是来设置画刷的填充区域的颜色,默认情况下是白色。
9.1.1 画布对象属性(2) 画布对象属性(2)
procedure TForm1.Button1Click(Sender: TObject); VAR xt,yt,t:integer; //xt,yt是用来决定像素的位置,t用来控制循环次数。 x,y:real; //x,y是用来取得屏幕的中心 begin x:=form1.ClientWidth/2; // ClientWidth属性指的是不包括标题栏在内的宽度。 y:=form1.ClientHeight/2; // ClientHeight属性指的是不包括标题栏在内的高度。 for t:=-10000 to 10000 do begin xt:=round(t/100+x); {t之所以要除以100是因为要让像素的显示紧密点没有断断续续的感觉,加上x是 因为原来的中 心在(0,0)的地方,也就是画布的左上角,而现在是要移到(x,y)的地方, 将坐标原点进行了 移动。} yt:=round(-t/100+y); canvas.Pixels[xt,yt]:=clblue;//画布的像素颜色为蓝色。 end; end;

delphi画图、多媒体、数据库

delphi画图、多媒体、数据库
(3)Arc 方法 [格式]:
procedure Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer);
第 12 章 图形图像编程
247
[功能]:用于画一段椭圆弧。其中,椭圆是由点(X1,Y1)的点(X2,Y2)所确定的矩形 所决定,弧的起点是椭圆中心和点(X3,Y3)的连线与椭圆的交点,弧的终点是椭圆中心和点 (X4,Y4)的连线与椭圆的交点,并以逆时针方向画弧。
clYellow
clBackground
clActiveCaption clInactiveCaption
表示的颜色 浅绿色 黑色 蓝色 深灰(灰黑色) 紫红色 灰色 绿色 橙色 浅灰色 枣栗色 深蓝色 橄榄绿 紫色 红色 银灰色 Teal 青凫色(一种蓝) 白色
黄色
当前桌面的背景色
当前窗体的标题栏色 当前不被激活的标题栏的颜色
(6)CopyMode 属性 该属性用于设置从其他画布拷贝图像的方式,其取值及含义如表 12-4 所示,该属性的默 认值为 cmSrcCopy(表示拷贝的像素将覆盖画布上原有的像素)。
246
Delphi 7 应用教程
CopyMode 属性的取值 cmSrcCopy cmBlackness cmDsInvert cmMergeCopy cmMergePaint cmNotSrcCopy cmNotSrcErase cmPatCopy cmPatlnvert cmPatPaint cmSrcAnd cmSrcCopy cmSrcErase cmSrclnvert cmSrcPaint cmWhiteness
244
Delphi 7 应用教程
线 条样式 PsClear PsSolid PsDash PsDot PsDashDot PsDashDotDot

openGL教程delphi版(7)

openGL教程delphi版(7)

{这一课我会教您如何使用三种不同的纹理滤波方式。

教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。

这一课包含了很多内容,如果您对前面的课程有疑问的话,先回头复习一下。

进入后面的代码之前,很好的理解基础知识十分重要。

我们还是在第一课的代码上加以修改。

跟以前不一样的是,只要有任何大的改动,我都会写出整段代码。

首先我们还要加进SysUtils单元和Glaux单元。

}UsesSysUtils,opengl,windows,Messages,Glaux In '..\..\GLAUX\Glaux.pas';//下面几行是增加新的变量。

//我们增加三个布尔变量。

// light 变量跟踪光照是否打开。

//变量lp和fp用来存储'L' 和'F'键是否按下的状态。

//后面我会解释这些变量的重要性。

现在,先放在一边吧。

light : Boolean; // 光源的开/关lp : Boolean; // L键按下了么?fp : Boolean; // F键按下了么?//现在设置5个变量来控制绕x轴和y轴旋转角度的步长,//以及绕x轴和y轴的旋转速度。

//另外还创建了一个z变量来控制进入屏幕深处的距离。

xrot : GLfloat; // X 旋转yrot : GLfloat; // Y 旋转xspeed : GLfloat; // X 旋转速度yspeed : GLfloat; // Y 旋转速度z : GLfloat = -5.0 f; // 深入屏幕的距离//接着设置用来创建光源的数组。

//我们将使用两种不同的光。

//第一种称为环境光。

环境光来自于四面八方。

//所有场景中的对象都处于环境光的照射中。

//第二种类型的光源叫做漫射光。

//漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。

//处于漫射光直接照射下的任何对象表面都变得很亮,//而几乎未被照射到的区域就显得要暗一些。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2)Brush属性
①Color属性 用来设置填充色,取值及含义与Pen的Color属性一样。 ②Style属性 该属性用来设置填充样式。图12-1是Brush颜色值为 clBlack时的Style属性值及其代表的样式。
图12-1 Brush对象的Style属性值及其代表的填充样式
(3)Pixels属性
图12-7 程序设计界面
图12-8 程序运行界面(一)
图12-9 程序运行界面(二)
12.2.2 典型实例二:照片自动展示程序
【实例题目】 制作一个照片自动展示程序,程序启动后将循环 显示照片,每张照片在屏幕上停留0.5秒。当用户单击 图片时将显示一个提示框,询问用户是否停止展示, 如果用户回答【是】将停止展示,回答【否】将接着 展示。程序的设计界面如图12-10所示,程序的运行 界面如图12-11所示。程序的运行界面如图12-11所示。 运行时如果单击照片,将会出现如图12-12所示的退 出提示框,在该提示框窗口上选中【Yes】按钮将退 出图片展示程序,单击【No】将继续展示。
图12-4 程序设计界面
图12-5 程序运行界面
2.TImage组件
TImage组件主要用于显示和处理图像,能够显示 BMP、JPEG、ICO、WMF、EMF等多种格式的图片。 它的主要属性如下: (1)Canvas属性 (2)Picture属性 例如,有下列语句: Image1.Picture.LoadFromFile('D:\A1.JPG'); 该语句的作用是把“D:\A1.JPG”图像文件显示在 TImage组件中。
该属性的声明如下: property C1ipRect:TRect;
(6)CopyMode属性
该属性用于设置从其他画布拷贝图像的方式
(7)Handle属性
该属性用来返回画布对象的句柄。
(8)PenPos属性
该属性的类型是Tpoint型,其功能是用来设置 或返回当前画笔位置所在的点。
2.TCanvas对象的方法
图12-3 程序运行界面
12.1.4 TBitmap对象的使用
1.TBitmap对象的属性
(1)Handle属性 (2)IgnorePalette属性 (3)Monochrome属性 (4)Palette属性
2.TBitmap对象的方法
主 要 方 法 有 LoadFromFile 、 SaveToFile 、 Releasehandle等。
1.TPicture对象的属性
(1)Bitmap属性 (2)Icon属性 (3)Metafile属性 (4)Graphic属性
2.TPicture对象的方法
主要方法有LoadFromFile和SaveToFile,这两个方 法的格式和功能与TGraphic对象的同名方法完全一致。
【例12-2】 编写一个绘制位图的程序,程序的运 行界面如图12-3所示。程序执行时单击【绘制位图】 按钮,将从窗体的左上角开始原样绘制一幅图片,然 后再把该图片缩小在一个矩形框内绘制。如图12-3所 示。
(4)Ellipse方法
[格式]:procedure Ellipse(Xl,Y1,X2,Y2:Integer);
(5)Rectangle方法 [格式]:procedure Rectangle(X1,Y1,X2,Y2:Integer); (6)RoundRect方法 [ 格 式 ] : procedure RoundRect(X1,Y1,X2,Y2,X3,Y3 : Integer); (7)Pie方法 [ 格 式 ] : Procedure Pie(X1,Y1,X2,Y2,X3,Y3,X4,Y4 : Longint); (8)Draw方法 [格式]:procedure Draw(X,YInteger;Graphic:Tgraphic); (9)CopyRect方法 [格式]: procedureCopyRect(Dest:TRect;Canvas:Tcanvas;Sour ce:TRect);
(1)MoveTo方法
[格式]:procedure MoveTo(X,Y Integer);
(2)LineTo方法
[格式]:procedure LineTo(X,Y Integer);
(3)Arc方法
[格式]:procedure Arc(Xl,Y1,X2,Y2,X3,Y3,X4,Y4: Integer);
①Color属性 使用Delphi提供的系统颜色常量 如语句: Form1.Canvas.Pen.Color:=clBlue 使用RGB函数 RGB函数的一般格式为: RGB(R,G,B)
直接以数字表示颜色 例如有如下语句: Form1.Canvas.Pen.Color:=$00FF00FF; 该语句与下面的语句作用是相同的: Form1.Canvas.Pen.Color:=RGB(255,0,255); ③Width属性 该属性用于设置线条的粗细宽度,单位是像素,其 最小值为1。下面的代码会将线条的粗细宽度设置为 10个像素。 Form1.Canvas.Pen.Width:= 10; ④Mode属性 Form1.Canvas.Pen.Mode:= pmXor; 其作用是画线时把画笔的颜色与屏幕的颜色异或。
图12-10 程序设计界面
图12-11 程序运行界面
图12-12 “退出展示”提示框
12.3 上机练习重应用
【练习题目】 程序运行时将出现一个钟表的轮廓和一个 秒针,如图12-13所示。秒针以每秒12度的速 度移动,图12-14是某个时刻的程序运行情况。
图12-13 程序设计界面
图12-14 程是一个Boolean型属性,其值为True时,表 示将自动对图像进行拉伸或缩小操作,调整图像的尺 寸以填满整个TImage组件;当其值为False时,若图像 比TImage组件大,多余的部分将显示不出来 。
图12-6 TImage组件的Stretch属性取值及图像显示情况
12.1.5 Delphi中的图形图像组件
1.TShape组件
属 性 值
stCircle
stRectangle

圆 矩形

属 性 值
stEllipse stRoundRect
stRoundSquare

椭圆

圆角矩形
圆角正方形
stSquare
正方形
【例12-3】 编写一个Shape形状演示程序, 程序的设计界面如图12-4所示。程序运行时单 击【随机画图】按钮后,TShape组件的形状 将依次在6种图形之间转换,同时在Label组件 中显示图形的名称,TShape组件的填充风格 也自动在8种填充风格之间转换,并且填充的 色彩随机产生。每种图形的转换时间为200毫 秒。程序的运行界面如图12-5所示。
x a sin(t ) y a cos(t )
其中a是圆的半径,t参数(单位为度)。则x2和y2的值 可用下式来计算: x:=Floor(65*sin(t*3.1415926/180)); x2:=x1+x; y:=Floor((-1)*65*cos(t*3.1415926/180)); y2:=y1+y; 其中t为指针的当前度数。
【例12-1】 编写一个程序,用来绘制一个椭圆和 几个圆角矩形。程序执行时,单击【画图】按钮,运 行界面如图12-2所示。
图12-2 程序运行界面
12.1.2 TGraphic对象的使用
1.TGraphic对象的属性
TGraphic对象有Height、Width、Empty等属性。
2.TGraphic对象的方法
图12-15 程序设计界面
图12-16 程序运行界面
(1)LoadFromFile方法 [格式]:procedure LoadFromFile(const FileName:String) (2)SaveToFile方法 [格式]:procedure SaveToFile(const FileName:String);
12.1.3 TPicture对象的使用
12.2 典型实例练能力
12.2.1 典型实例一:背景填充程序
【实例题目】 编写一个以位图填充窗体背景的应用程序,程序 的设计界面如图12-7所示。程序运行时,单击【选择 图片】按钮,将弹出【打开】对话框供用户选择一幅 作为背景填充的图片,并根据单选钮的状态进行“平 铺”或“拉伸”填充。单击【平铺】单选钮,图片将 以“平铺”方式填充整个窗体,如图12-8所示。单击 【拉伸】单选钮,图片将以“拉伸”方式填充整个窗 体,如图12-9所示。
该属性是一个二维数组属性,其声明如下: property Pixels[X,Y:Integer]:TColor;
(4)Font属性
该属性用来设置在画布对象上输出文字的字体格 式,它也有自己的子属性,通过设置它的子属性,可 以决定在画布上输出文字的字体、大小、颜色以及字 体风格等。
(5)ClipRect属性
第12章 图形图像编程
本章要点: TCanvas对象的常用属性、方法及其使用 TGraphic对象的常用属性、方法及其使用 TBitmap对象的常用属性、方法及其使用 Picture对象的常用属性、方法及其使用 Delphi中的图形图像组件及其使用
12.1 循序渐进学理论
12.1.1 TCanvas对象的使用 1.TCanvas对象的属性 (1)Pen属性
(4)Center属性
该属性是一个Boolean型属性,用于确定图像是否 居中显示在TImage组件中。若Center设置为True,则 表示图像将居中显示;否则,图像将从TImage组件的 左上角开始显示。
3.TPaintBox组件
TPaintBox组件主要提供一个可以用来绘制几何图 形的矩形区域,它有一个Canvas属性,可以使用它的 绘图方法来绘制图形。
相关文档
最新文档