GDI+概述
GDI(Graphic Device Interface,图像设备接口)是早期Windows操作系统的一个可执行程序,位于C:\Windows\System32文件夹中,文件名为GDI.exe。GDI+(即Graphic Device Interface Plus),是GDI的升级版本,提供了各种丰富的图形图像处理功能,统一在.Net Framework中封装和定义。
在.NET Framework中,GDI+被封装在如下几个命名空间中。
(1)System.Drawing:提供了对GDI+基本图形功能的访问,其中,Graphics类是整个GDI+的核心,能绘制线条、曲线、图形、图像和文本的画面。其他类需要和Graphics类配合使用。在System.Drawing中,常见的类与结构如表9-1所示。
表9-1 GDI+常用的类和结构说明
类和结构 | 说明 |
---|---|
Graphics | 封装一个GDI+绘图图面 |
Bitmap | 封装GDI+位图,用于处理由像素数据定义的图像的功能 |
Brush | 用于创建画笔对象,以填充图形的内部 |
Font | 定义特定的文本格式,包括字体、字号和字形属性 |
Pen | 定义用于绘制直线和曲线的钢笔对象 |
Region | 指示由矩形和由路径构成的图形形状的内部 |
SolidFormat | 定义单色画笔 |
StringFormat | 封装文本布局信息、显示操作和OpenType功能 |
Color | 表示一种ARGB颜色(alpha、红色、绿色、蓝色) |
Point | 表示在二维平面中定义点的整数x和y坐标的有序对 |
PointF | 表示在二维平面中定义点的浮点x和y坐标的有序对 |
Rectangle | 存储一组整数,共4个,表示一个矩形的位置和大小 |
RectangleF | 存储一组浮点数,共4个,表示一个矩形的位置和大小 |
Size | 存储一个有序整数对,通常为矩形的宽度和高度 |
SizeF | 存储有序浮点对,通常为矩形的宽度和高度 |
(2)System.Drawing.Drawing2D:提供了高级的二维和矢量图形功能,主要有梯度型画刷、Matirx类和GraphicsPath类等。
(3)System.Drawing.Imaging:提供了高级GDI+图像处理功能。
(4)System.Drawing.Text:提供了高级GDI+字体和文本排版功能。
Windows操作系统的GDI+服务分为以下3个主要部分
(1)二维矢量图形
矢量图形由图元(如线条、曲线和图形)组成,它们由一系列坐标系统的点集组成。GDI+提供了用于存储这些图元本身信息的类或结构体,也提供了绘制图元的类。例如,Rectangle结构体存储了一个矩形的尺寸位置;Pen类存储线条颜色、线条宽度,以及线条样式等信息;Graphics类提供绘制线条、矩形、路径和其他图形的方法;而Brush类存储了封闭图形内部填充颜色和图案的信息。
(2)图像处理
有些图片很难采用矢量图形表示,这种类型的图像采用位图进行存储,即由表示屏幕上独立点颜色的数字型数组所组成。GDI+中提供了若干种类,可实现快速存取和显示。例如,CachedBitmap类可用于存储一张缓存在内存中的图片。
(3)图文混排
图文混排是文字处理和绘图软件的基本功能,关系到文字以何种字体、尺寸和样式在绘图区域中的具体显示和控制,GDI+为这种复杂的任务提供广泛的支持。
辅助绘图对象
在图像处理中,绘制位置控制对象Point、Size、Rectangle等对象所对应的浮点型类型,这些结构对象的用法与Point、Size和Rectangle相同。
1.Point结构
Point是一种简单的结构,代表着坐标系统中的一个点,由坐标值x和y共同组成。例如,定义一个坐标点p(100,100),程序代码如下:Point p = new Point(100,100);
2.Size结构
Size是一种简单的结构,代表一个矩形区域的尺寸。例如,定义一个宽度为100、高为50的矩形,程序代码如下:Size s = new Size(100,50);
3.Rectangle结构
Rectangle是一种结构,代表一个矩形,常用的属性和方法如表9-2所示。
属性或方法 | 说明 |
---|---|
Width | 矩形区域的宽度 |
Height | 矩形区域的高度 |
Left | 矩形区域左边框的X坐标 |
Right | 矩形区域右边框的X坐标 |
Top | 矩形区域左上角的Y坐标 |
Bottom | 矩形区域下边框的Y坐标 |
X | 矩形区域左上角的X坐标 |
Y | 矩形区域左上角的Y坐标 |
Location | 矩形区域左上角的X坐标和Y坐标 |
Size | 矩形区域的大小 |
FromLTRB() | 通过使用4个位置LTRB(左端、顶端、右端、底端)绘制矩形 |
Inflate() | 根据指定量放大矩形 |
Contains() | 用于定义一个点是否在矩形边框内 |
例如:定义一个左上角坐标为(10,10)、宽度为100、高度为50的矩形,程序代码如下:Rectangle r = new Rectangle(10,10,100,50);
4.Color结构
颜色是进行图形操作的基本要素,任何一种颜色都可以由四个分量决定,每个分量占据一个字节。
A:Alpha值,即透明度,取值范围为0-255,0为完全透明,255为完全不透明。
R:红色,取值范围为0-255,255为饱和红色。
G:绿色,取值范围为0-255,255为饱和绿色。
B:蓝色,取值范围为0-255,255为饱和蓝色。
Color结构的常用属性和方法如表9-3所示,
属性或方法 | 说明 |
---|---|
A | 只读属性,返回Color类对象字节的Alpha分量 |
R | 只读属性,返回Color类对象字节值的红色分量 |
G | 只读属性,返回Color类对象字节值的绿色分量 |
B | 只读属性,返回Color类对象值的蓝色分量 |
FromArgb() | 用于创建基于ARGB的Color结构 |
FromKnownColor() | 用于创建已知颜色的Color结构 |
FromName() | 通过使用颜色名称来创建Color结构 |
GetHue() | 返回Color结构的“色度-饱和度-亮度“值 |
ToArgb() | 返回32位ARGB整数值 |
ToKnownColor() | 返回一个基于某个Color结构的已知颜色值 |
获取Color的使用方法可以根据实际应用进行选择。例如,定义一个颜色,其ARGB分量的值分别为120,255,0,0,合起来表示带透明效果的红色,程序代码如下:Color c = Color.FromArgb(120,255,0,0);
5.Font类
用于指示绘制过程中所使用的字体,Font类常用属性如表9-4所示。
属性 | 说明 |
---|---|
Bold | 只读属性,返回字体是否加粗 |
Height | 只读属性,返回字体行高 |
Italic | 返回字体是否倾斜 |
Name | 返回字体名称 |
Strikeout | 返回字体是否有删除线 |
Underline | 返回字体是否有下划线 |
Unit | 返回字体单位 |
Size | 返回字体的尺寸 |
SizeInPoints | 返回以Point为单位的字体大小 |
Style | 返回字体样式 |
获取Font对象主要采用Font的多种构造方法。例如,定义一个宋体20号的字体,程序代码如下:Font font = new Font("宋体”,20);
6.Graphics类
要进行图形处理,必须首先创建Graphics对象,然后才能利用它进行各种画图操作。Graphics对象的常用方法如表9-5所示。
方法 | 说明 |
---|---|
DrawLine() | 绘制直线 |
DrawLines() | 一次绘制多条直线 |
DrawRectangle() | 绘制矩形 |
DrawRectangles() | 一次绘制多个矩形 |
DrawPolygon() | 绘制多边形 |
FillPolygon() | 填充多边形封闭区域 |
DrawCurve() | 绘制自定义曲线 |
DrawClosedCurve() | 绘制封闭曲线 |
DrawBezier() | 绘制贝塞尔曲线 |
DrawBeziers() | 绘制多个贝塞尔曲线 |
DrawEllipse() | 绘制椭圆 |
FillEllipse() | 填充椭圆 |
DrawImage() | 绘制图像 |
DrawString() | 绘制文本 |
创建Graphics对象的一般有两种形式
(1)用CreateGraphics方法创建Graphics对象。例如:Graphics g1 = this.CreateGraphics();
(2)从Image创建Graphics对象。例如:Graphics g2 = Graphics.FromImage(Bitmap.FromFile(@"D:\1.jpg"));