图形图像专题

画布的专题

画布类(TCanvas)

 

1:画直线

  procedure MoveTo(X, Y: Integer);

procedure LineTo(X, Y: Integer);

MoveTo 把光标移到直线的起点,

LineTo  把光标移到直线的终点

 

2:绘制矩形

Rectangle 方法可以绘制矩形,它使用的语法为:

procedure Rectangle(X1, Y1, X2, Y2: Integer);

procedure Rectangle(const Rect: TRect);

(X1,Y1)确定矩形的左上角坐标,(X2,Y2)确定矩形的右下角坐标

 

3:绘制弧线

Arc 方法可以绘制弧线,它的语法为:

procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

因为弧线是椭圆的一部分,(X1,Y1)是椭圆矩形区的左上角坐标,(X2,Y2)是椭圆矩形区的右下

角坐标,弧线依照逆时针的方向说明起点和终点,起点是椭圆与直线的交点,该直线是椭圆中心与点

(X3,Y3)的连线,终点在椭圆中心与点(X4,Y4)的连线上,是该线与椭圆的交点。

 

4:绘制椭圆

使用Ellipse 方法可以绘制椭圆(圆),使用的语法为:

procedure Ellipse(X1, Y1, X2, Y2: Integer);

procedure Ellipse(const Rect: TRect);

其中,(X1,Y1)是椭圆(圆)的矩形边界上的左上角坐标,(X2,Y2)是椭圆(圆)的矩形边界上

的右下角坐标,如果X2-X1 不等于Y2-Y1 则绘制椭圆,如果两者相等,则绘制圆。

 

5:绘制多边形

 Polygon 方法可以绘制多边形,使用语法为:

procedure Polygon(Points: array ofTPoint);

其中,Points 是一个TPoint 型的数组。下面的语句可在窗体上绘制一个四边形:

procedure TForm1.FormPaint(Sender: TObject);

begin

Canvas.Polygon([Point(100, 10),Point(200,10),

Point(300,60),Point(150,120)]);

end;

 

6:绘制文字

TextOut 方法可以在画布上输出文本,使用语法为:

procedure TextOut(X, Y: Integer; const Text: string);

其中,(X,Y)为字符插入点,Text 为被插入的字符

 

7:插入图像

用户有时需要在已绘制图形的画布上再插入另外的图像,这一功能可以使用TCanvas 对象的Draw

方法实现。使用语法为:

procedure Draw(X, Y: Integer; Graphic: TGraphic);

其中,(X,Y)为插入点的坐标,Graphic 是一个图形对象。下面的语句可在窗体上插入一幅图像。

 

 

画笔类(TPen)

 

属性值:

1:color  画笔颜色

2:Style   画笔样式

Pslold 画固定线段

PsDash 画下划线组成的线段

PsDot 画由点组成的线段

PsDashDot 画点划线

PsDashDotDot 画双点划线

PsClear 画看不见的线段

PsInsideFrame 画边界的矩形线框

3:Width 画笔的宽度

4:Mode 属性

Mode 属性可以定义线段的颜色。可结合当前的颜色、屏幕颜色或它们反转值,对线段的颜色重

新定义,但不改变Color 属性,

pmBlack 黑色

pmWhite 白色

pmNop 不改变画布颜色

pmCopy 使用Color 属性中的颜色

pmNotCopy 笔颜色的反转值

pmMergePenNot 笔的颜色与屏幕颜色反转值的结合

pmMaskNotPen 屏幕颜色与笔颜色

pmMergeNotPen 屏幕颜色与笔颜色反转值的结合

pmMerge 画笔颜色与画布背景颜色的结合

pmNotMerge PmMerge 的反转值

pmMask 画笔的颜色与画布背景颜色的共用颜色的结合

pmNotMask PmMask 的反转值

pmXor 画笔的颜色与画布背景颜色的非共用颜色的结合

pmNotXor pmXor 的反转值

pmMaskPenNot 画笔的颜色与画布背景颜色反转值的共用颜色的结合

pmNot 画布背景颜色的反转值

 

画刷类(TBrush)
1:Color属性

用于定义画刷的填充颜色。

2:Bitmap 属性

画刷可使用Bitmap 属性填充图形以产生特殊效果。位图大小为8 个像素点,但为配合高8 个像素

点还有一个宽画刷类。

3: Style 属性

Style 属性定义了画刷填充图形的风格。Style 属性为枚举类型,画刷中有七种填充模式,共有十

五种取值,分别代表不同的填充风格,供用户任意选择。

 

 

颜色类(TColor)

只需要参照颜色色系

 

 

坐标系统和映射模式

1:在使用大多数GDI 函数时,需要指定坐标集,用来确定绘图的位置。这些坐标基于一个度量单元,

诸如像素。通常,GDI 以垂直方向和水平方向上的两个轴来定位,也就是说,通过增减xy 坐标值来

移动绘图位置。Win32 主要依赖两个因素来执行绘图函数:坐标系统和映射模式。

Win32 坐标系统与任何其他坐标系统没有什么区别。指定了一个点的xy 坐标,Win32 就在绘图

表面定位这个点。Win32 使用3 种坐标系统,分别是设备、逻辑和通用坐标系。Windows 95 不支持通

用坐标系(位图旋转、裁剪、扭曲等)

 

设备坐标系

设备坐标系是指运行于Win32 的设备。它以像素为单位进行度量,定位方向是水平轴从左到右、

垂直轴从上到下。例如如果在640×480 的显示器上运行Windows,设备左上角坐标为(0,0),而右下

角坐标为(639,479)。

 

逻辑坐标系
在Win32 中,有设备环境(或称DC)的区域通常使用逻辑坐标系。本节首先介绍屏幕、窗体、

窗体的客户区

 

屏幕坐标系

屏幕坐标系是指显示设备,它是以像素为度量单位的坐标系,如在640×480 的显示器上,

Screen.Width 和Screen.Hight 分别为640 和480 像素。要获取屏幕的设备环境,可以使用Win32 API

中的GetDC()函数。注意,当使用GetDC()函数后,必须调用RaleaseDC()函数来释放所获取的设备环

var

ScreenDC: HDC;

begin

ScreenDC := GetDC (0); //0 代码显示器

Try

...

finally

ReleaseDC(0,ScreenDC);

end;

end;

窗体坐标系

  窗体坐标系也叫窗口坐标系,指整个窗体或窗口,包括标题栏和边框。Delphi 7 没有直接提供访

问绘图区域DC 的属性,但可以通过使用Win32 API 中的GetWindowsDC()函数来获得DC。例如:

MyDC:=GetWindowDC(Form1.Handle);

这个函数返回指定窗口的设备环境。

需要注意的是可以通过TCanvas 对象来操纵由GetDC()和GetWindow()所获得的设备环境,进而

通过设备环境来调用TCanvas 的方法。只要创建一个TCanvas 实例,然后把GetDC()或GetWindowsDC()

的结果赋给TCanvas.Handle 属性。由于TCanvas 拥有句柄,当画布对象释放时将自动释放该设备环境。

 

var

C: TCanvas;

begin

C:= TCanvas.Create;

C.Pen.Width :=5;

C.Font.Size:=30;

C.Font.Color:=clRed;

Try

C.Handle := GetDC (0);

C.TextOut(20,20,’Hello World’);

Finally

C.Free;

end;

end;

 

 

坐标映射

为什么在调用GDI 程序时不能使用设备坐标系代替逻辑坐标系呢?请首先运行下面代码:

Form1.Canvas.TextOut(0,0,’UpperLaftCornerofForm’);

上面的代码把字符串显示在窗体的左上角。逻辑坐标系的(0,0)位置对应于窗体设备环境的(0,0)

位置。但是,窗体的左上角(0,0)不同于设备坐标系的(0,0)。如果窗体是在屏幕的左上角出现,窗

体坐标系的(0,0)可以实际对应设备坐标系的(0,0)。将窗体移动到另一个坐标系时,窗体坐标系的

(0,0)将对应设备上完全不同的位置。

表11-12 Win32 映射模式

映射模式 逻辑单位长度 方向( X / Y )

MM_ANISOTROPIC    arbitrary(x<>y)or(x=y) 可定义/可定义

MM_HIENGLISH      0.001inch 右/上

MM_HIMETRIC       0.01mm 右/上

MM_ISOTROPIC      arbitrary(x=y) 可定义/可定义

MM_LOENGLISH     0.01inch 右/上

MM_LOMETRIC      0.1mm 右/上

MM_TEXT1          pixel 右/下

MM_TWIPS          1/440inch 右/上

Win32 定义了一些函数用于改变或者获取给定设备环境的映射模式。下面列出了这些函数。

• SetMapMode()为给定设备环境设置映射模式。

• GetMapMode()获取给定设备环境的映射模式。

• SetWindowOrgEx()设置给定设备环境的窗口原点(0,0)。

 

 

 

图像格式处理

一:简介

多媒体系统中最重要的信息就是图像,在Delphi 中提供了一个名为TImage 的组件,使用该组件,

可以很方便地调入一幅图像。TImage 组件支持.jpeg、.bmp、.ico、.emf 和.wmf 等格式的文件。

其中.jpeg 和.bmp 是最常用的两种文件,在某些场合下,需要实现两者之间的互相转换,Delphi

中提供一个TJPEGImage 对象,可以实现相互转换操作。

JPEG(Joint Photographic Experts Group)文件格式最初由c-cube microsystems 推出,是为了提供

一种存储深度位像素的有效方法,例如对照片扫描,颜色很多而且差别细微。JPEG 和这里讨论的其

他格式的最大区别是JPEG 使用一种有损压缩算法。无损压缩算法能在解压后准确再现压缩前的图像,

而有损压缩则牺牲了一部分的图像数据来达到较高的压缩率,但是这种损失很小,以至于人们很难察

觉。

JPEG 图像压缩是一个复杂的过程,经常需要专门的硬件支持。首先图像以像素为单位分成8×8

的块。然后,每个块分3 个步骤被压缩。第1 步使用dct(discrete cosine transform)离散余弦变换把8

×8 的像素矩阵变成8×8 的频率(也就是颜色改变的速度)矩阵。第2 步对频率矩阵中的值用量化矩

阵进行量化,滤掉那些总体上对图像不重要的部分。第3 步,对量化后的频率矩阵进行无损压缩。

因为被量化后的频率矩阵缺少了许多高频信息,通常能被压缩到一半甚至更少。无损压缩一般不

能压缩真正的照片图像,所以50%的压缩率已经相当不错了。但另一方面,无损压缩能把一些图像文

件尺寸减少90%,这样的图像文件就不适合用JPEG 来压缩。JPEG 的有损部分产生在第2 步,量化矩

阵的值越高,从图像中丢掉的信息就越多,从而压缩率就越高,但同时图像的质量就越差。在JPEG

压缩时可以选择一个量化因子,这个因子的值决定了量化矩阵中的数值。理想的量化因子要在压缩率

和图像质量间达到平衡,所以对不同的图像要选择不同的量化因子,通常要经过若干次尝试后方可确

定。

TJPEGImage

 属性

CompressionQuality属性: 压缩质量。值越大图像质量越好,文件占用空间也越大

 

二:Empty 属性: JPEG 图像对象是否包含一幅图像。如果Empty 为真,

表明JPEG 图像对象已经装入一幅图像,反之则无

三:Grayscale 属性: 色彩标记。值为真黑白色,反之为彩色

 

四:Height Integer 属性   图像高度

五:Palette HPALETTE 属性  调色板

六:Performance属性   性能,控制内部位图显示速度

七:PixelFormat  显示格式,决定图像是24bit 还是8bit 格式

八:ProgressiveDisplay   控制图形显示时如何解压

九:ProgressiveEncoding   输出文件时如何压缩

十:Scale   图像显示大小(jsFullSize、jsHalf、jsQuarter、jsEighth)

十一:Width   图像宽度

十二:Modified   图形修改标识

十三:PaletteModified   调色板修改标识

十四:Transparent   透明

十五:Smoothing   压图形显示的平滑度

 

方法

Assign 图像格式的转换

Compress 按照CompressionQuality 属性设置的值对图像进行压缩

Create 建立JPEG 对象

Destory 释放JPEG 对象

LoadFromClipboardFormat 从剪贴板中读入图像

LoadFromStream 从流中读入图像

SaveToClipboardFormat 将图像保存到剪贴板

SaveToStream 将图像保存到流中

LoadFromFile 从文件中读入图像

SaveToFile 将图像保存到文件

 

 

posted @ 2010-08-31 23:14  坚持Delphi  阅读(1186)  评论(1编辑  收藏  举报