9 绘图及图像谢新冲.docx
《9 绘图及图像谢新冲.docx》由会员分享,可在线阅读,更多相关《9 绘图及图像谢新冲.docx(62页珍藏版)》请在冰豆网上搜索。
![9 绘图及图像谢新冲.docx](https://file1.bdocx.com/fileroot1/2023-8/4/83828d9a-dc32-4742-941d-91757cd0d2b5/83828d9a-dc32-4742-941d-91757cd0d2b51.gif)
9绘图及图像谢新冲
第9章绘图及图像
在窗体和控件上绘图是一种常见的操作,事实上,所有的窗体和控件都是绘制出来的的,如果要实现特定的控件,也需要绘图。
本章介绍有关绘图、字体及图像的基本类及常见的操作。
9.1绘图基础支持类
System.Drawing名字空间包括了.NET的基本图形功能,这种图形功能被称为GDI+。
这个名称来源于原始的Windows图形库,即图形设备接口(GraphicalDeviceInterface,GDI)。
GDI+是在GDI的基础上的2D图形库,是为绘制线条、形状、文本和显示位图而设计的。
System.Drawing名字空间包括了有关绘图的基本功能,更加高级的功能由以下名字空间提供:
1)System.Drawing.Drawing2D:
供了高级的2D和向量图形。
2)System.Drawing.Imaging:
提供了高级的图像处理。
3)System.Drawing.Text:
供了高级文本显示功能。
4)System.Drawing.Printing:
供了打印功能。
要进行绘图,需要用到相关的基础支持类及数据结构,包括位置、大小、颜色、画笔、和刷子等。
本节就来介绍这些类及数据结构。
9.1.1位置及大小
表示位置及范围,经常要用到点(Point)、矩形(Rectangle)、大小(Size)等数据结构。
1.Point和PointF
Point和PointF都是一种结构,两者都表示一个简单的(X,Y)坐标点。
两者的不同之处在于:
Point使用整数坐标,而PointF使用的是浮点(float)型坐标。
表91、表92和表93总结了Point类和PointF类的主要成员。
表91Point结构的成员
成员
描述
IsEmpty
如果X和Y都是0,则返回True
X
X坐标
Y
Y坐标
Equals
如果两个点的坐标相同,则返回True
Offset
通过一个具体的数值平移坐标
ToString
返回一个表示坐标点的字符串
+,-
+、-运算符
==,!
=
等式运算符
表92Point结构的static方法
方法
描述
Ceiling
将PointF坐标向上近似成最接近的整数
Round
将PointF坐标向下近似成最接近的整数
Truncate
截取PointF坐标
表93PointF结构的成员
成员
描述
IsEmpty
如果X和Y都是0,则返回True
X
X坐标
Y
Y坐标
+,-
+,-运算符
==,!
=
等式运算符
另外,还定义了在Point和Size之间、Point和PointF之间、PointF和Point之间进行转换的运算符。
2.Rectangle和RectangleF
Rectangle和RectangleF结构相似,它们都是表示矩形的数值类型,不同之处在于:
Rectangle使用整数坐标,而RectangleF则使用浮点型坐标。
表94、表95和表96总结了Rectangle类和RectangleF类的主要成员。
表94Rectangle结构的主要成员
成员
描述
IsEmpty
如果X和Y都是0,则返回True
X,Y
左上角的X和Y坐标
Top,Left,Bottom,Right
矩形左上右下的坐标
Width,Height
矩形的宽度和高度
Location
获取(或设定)左上角的坐标
Size
表示矩形高度和宽度的Size对象
Contains
如果矩形中包括了一个给定的矩形(或点),则返回True
Equals
如果这个点和其他的点包括了相同的坐标,则返回True
FromLTRB
由左、上、右、下的坐标值创建一个矩形
Inflate
放大矩形
Intersect
返回两个矩形交叉部分的矩形
IntersectsWith
如果一个矩形和另外一个矩形交叉,则返回True
Offset
通过一个具体的数值平移一个点的坐标
ToString
返回一个表示矩形的字符串
Union
返回一个表示两个矩形合并的矩形
==,!
=
等式运算符
表95Rectangle结构的static方法
方法
描述
Ceiling
将RectangleF的坐标向上近似成最接近的整数
Round
将RectangleF的坐标向下近似成最接近的整数
Truncate
截取RectangleF的坐标
Union
返回一个表示两个矩形合并的矩形
表96RectangleF结构的成员
成员
描述
IsEmpty
如果X和Y都是0,则返回True
X,Y
左上角的X和Y坐标
Top,Left,Bottom,Right
矩形上、左、下、右的坐标
Width,Height
矩形的宽度和高度
Location
获取(或设定)左上角的坐标
Size
表示矩形高度和宽度的Size对象
Contains
如果矩形中包括了一个给定的矩形(或者点),则返回True
Equals
如果这个点和其他的点包括了相同的坐标,则返回True
FromLTRB
由左、上、右、下的坐标值创建一个矩形
Inflate
放大矩形
Intersect
返回两个矩形交叉部分的矩形
IntersectsWith
如果一个矩形和另外一个矩形交叉,则返回True
Offset
通过一个具体的数值转换一个点的坐标
ToString
返回一个表示矩形的字符串
==,!
=
等式运算符,用来运算矩形的大小的位置
另外,还定义了在Rectangle和RectangleF之间双向转换的运算符。
RectangleF有两个static方法:
Truncate()和Union()。
3.Size和SizeF
Size和SizeF结构通过Width和Height一对属性表示了一个矩形区域的大小。
如以前,Size使用整数坐标,而SizeF则使用浮点型坐标。
表97、表98和表99总结了Size类和SizeF类的主要成员。
表97Size结构的主要成员
成员
描述
Height
矩形区域的高度
Width
矩形区域的宽度
IsEmpty
如果高和宽的值都是0,则返回True
Equals
测试两个Size对象的高和宽是否相等
ToString
返回一个表示Size的字符串
+,-
+,-运算符
==,!
=
等式运算
表98Size结构的static方法
方法
描述
Ceiling
将SizeF的坐标向上近似成最接近的整数
Round
将SizeY的坐标向下近似成最接近的整数
Truncate
截取SizeF的坐标
表99SizeF结构的成员
成员
描述
Height
矩形区域的高度
Width
矩形区域的宽度
IsEmpty
如果高和宽的值都是0,则返回True
Equals
测试两个Size对象的高和宽是否相等
ToPointF
返回一个表示SizeF的Point对象
ToSize
返回一个表示SizeF的Size对象
ToString
返回一个表示SizeF的字符串
+,-
+,-运算符
==,!
=
等式运算
另外,系统还提供了从Size到SizeF、从SizeF到Size、从Size到Point以及从SizeF到PointF的转换。
9.1.3颜色
颜色用Color结构来表示。
颜色值是通过4个整数值表示的:
A1pha、Red、Green和B1ue,其中Alpha表示透明度,另外的3个则表示颜色的红、绿、蓝3种基色。
.NET提供了大量的标准颜色,这些颜色被定义为System.Drawing.KnownColor枚举的一部分。
这个枚举包括了一百多个以上的成员,成员的值可以区分为以下两个部分:
(1)颜色描绘了屏幕上的元件,如:
窗口文本、控件、活动标题。
如果用户使用控制面版改变桌面颜色样式,那么这些都会发生改变。
(2)固定的RGB(红、绿、蓝)值表示了标准的颜色,如:
天蓝色(Azure)、菊色(Cornflower)、轻灰色(LightGray)和中紫色(MediumPurple)。
表910和表911列出了Color类的重要属性和方法。
表910Color类的属性
属性
描述
A
获取颜色的alpha(透明度)成分
R,G,B
获取颜色的红、绿、蓝成分
IsEmpty
如果颜色值没有初始化,则返回True
IsKnownColor
如果颜色符合预定义的颜色,则返回True
IsNamedColor
如果颜色有一个名称,则返回True
Name
返回颜色的名称
表911Color类的方法
方法
描述
Equals
测试Color对象是否相等
FromArgb,FromKnownColor,FromName
创建一个Color对象
GetBrightness,GetHue,GetSaturation
获取颜色的色调(Hue)、饱和度(Saturation)、亮度(Brightness)成分,即:
HSB成分
ToArgb
返回的颜色的Alpha、Red、Green和Blue成分
ToKnownColor
将已知颜色的成员返回给相应的颜色对象
==,!
=
测试颜色值是否相等
注意,Color没有构造函数,但是可以通过使用静态的生成方法返回Color对象的引用,如:
Colorc2=Color.FromArgb(255,0,127);
Colorc3=Color.FromArgb(255,255,0,127);
Alpha的取值为0表示完全透明,取值为255则表示完全不透明。
例91ColorTest.cs测试颜色的使用
1privatevoidForm1_Paint(objectsender,System.Windows.Forms.PaintEventArgse)
2{
3Graphicsg=e.Graphics;
4Color[]colors=
5{
6Color.Red,
7Color.FromName("Blue"),
8Color.FromKnownColor(KnownColor.ActiveCaption),
9Color.FromKnownColor(KnownColor.InactiveCaption),
10Color.FromArgb(255,255,0),
11Color.FromArgb(128,255,255,0),
12};
13for(inti=0;i14{
15g.FillRectangle(newSolidBrush(colors[i]),i*30+10,20,20,100);
16}
17}
运行结果如图91:
图91测试颜色的使用
9.1.4画笔
画笔(Pen)类和刷子(Brush)类包装了线条厚度、线条样式、填充模式和颜色,画笔用来绘制形状、线条和曲线的轮廓,而刷子则用于填充区域。
画笔有两个基本的属性:
宽度(Width)和填充颜色(或填充模式)。
填充模式是由Brush的子类来提供的,所以,可以根据需要,在绘制线条的时候,填充合适的纹理(texture)或斜度(gradient)。
表912列出了Pen类中的几个重要属性。
表912Pen类的重要属性
属性
描述
Alignment
获取(或设置)这只画笔所绘制对象的对齐(参见表11.3)
Brush
获取(或设置)与这只画笔相关的刷子
Color
获取(或设置)这只画笔的颜色
DashPattern
获取(或设置)自定义的破折号和空格的排列
DashStyle
表示这条线所使用的破折号样式
LineJoin
表示线条连接的方法
MiterLimit
表示在斜接角上,连接厚度的限度
PenType
说明画笔的类型
StartCap,EndCap
表示线条的开始罩(cap)和结束罩
Transform
一个矩阵,用于描述该画笔所绘制对象是如何转换的
Width
获取(或设置)画笔的像素宽度
Alignment描述了画笔是如何与相关线条相对齐的,用PenAlignment枚举的成员表示这些对齐方式,如表913所示。
表913PenAlignment枚举
成员
描述
Center
画笔和正被绘制线条的中心对齐
Inset
画笔和正被绘制线条的内部对齐
Left
画笔和正被绘制线条的左边对齐
Outset
画笔和正被绘制线条的外部对齐
Right
画笔和正被绘制线条的右边对齐
DashStyle设置了使用该画笔所绘制虚线(dashedline)的样式,用DashStyle枚举的成员表示这些样式,如表914所示。
表914DashStyle枚举
成员
描述
Custom
说明用户自定义的线条样式
Dash
说明一条虚线
DashDot
说明了具有重复“破折线-点”模式的线条
DashDotDot
说明了具有重复“破折线-点-点”模式的线条
Dot
说明了点样式的线条
Solid
说明了实心线条(默认值)
线罩(Linecap)是指线的末端是如何被绘制的,可以用LineCap枚举的成员表示。
线罩主要包括了以下几种:
圆、正方形、三角形和自定义形。
PenType类是System.Drawing.Drawing2D.PenType枚举的成员,可能的取值如表915所示:
表915PenType枚举
成员
描述
HatchFill
画笔将以阴影图案填充
LinearGradient
画笔将以线性渐变填充
PathGradient
画笔以路径渐变填充
SolidColor
画笔将以纯色(默认的颜色)填充
TextureFill
画笔将以位图纹理填充
表916中列出了Pen类最重要的几种方法。
表916Pen类的方法
方法
描述
Clone
创建一个该画笔的准确拷贝
Dispose
释放画笔所用的Windows资源
MultiplyTransform
将转换矩阵与另一个矩阵相乘
ResetTransform
将转换矩阵重新设置
RotateTransform
旋转转换
ScaleTransform
比例转换
SetLineCap
设置画笔的起始和结束的线罩
TranslateTransform
平移转换
Dispose()方法能释放Pen对象使用的潜在系统资源。
尽管在Pen对象被放入回收站或者程序结束时也会释放这些资源,但是为了有效利用系统资源,在结束Pen对象时应该即时调用Dispose()。
如果想获取一个Pen对象来表示一种标准颜色,可以使用System.Drawing.Pens类。
对于Color类中每一种预定义的颜色,System.Drawing.Pens类都包含相应的Pen对象,如:
Penpen=Pens.AliceBlue;
如果想用一个Pen对象描述一种用于UI元件中的默认颜色,就可以使用System.Drawing.SystemPens类。
对于每一种预先定义的UI颜色,这个类都有相应的Pen对象,如:
Pen=SystemPens.HighlightText;
表917列出了所有能够通过SystemPens类的属性检索到的颜色。
表917SystemPens类的属性
属性
描述
ActiveCaptionText
活动窗口标题栏文本的颜色
Control
按扭或其他控件的颜色
ControlDark
3D元件阴影部分的颜色
ControlDarkDark
3D元件最暗部分的颜色
ControlLight
3D元件高亮部分的颜色
ControlLightLight
3D元件最亮部分的颜色
ControlText
控件上面文本的颜色
GrayText
无效文本的颜色
Highlight
高亮背景的颜色
HighlightText
高亮区域文本的颜色
InactiveCaptionText
非活动窗口标题栏文本的颜色
InfoText
在工具提示上的文本颜色
MenuText
菜单上文本颜色
WindowFrame
窗口框架的颜色
WindowText
窗口文本的颜色
DashPattern属性通过为每一个破折线和空格的大小提供一个数组,使得可以自定线条的样式:
pen.DashPattern=newfloat[]{0.5,1,1,5,2,2.5};
例92PenTest.cs使用Pen
1privatevoidForm1_Paint(objectsender,System.Windows.Forms.PaintEventArgse)
2{
3Graphicsg=e.Graphics;
4
5Penpen;
6Pointpoint=newPoint(10,10);
7SizesizeLine=newSize(0,150);
8SizesizeOff=newSize(30,0);
9
10pen=Pens.LimeGreen;
11g.DrawLine(pen,point+=sizeOff,point+sizeLine);
12pen=SystemPens.MenuText;
13g.DrawLine(pen,point+=sizeOff,point+sizeLine);
14pen=newPen(Color.Red);
15g.DrawLine(pen,point+=sizeOff,point+sizeLine);
16pen=newPen(Color.Red,8);
17g.DrawLine(pen,point+=sizeOff,point+sizeLine);
18
19pen.DashStyle=DashStyle.Dash;
20g.DrawLine(pen,point+=sizeOff,point+sizeLine);
21pen.DashStyle=DashStyle.Dot;
22g.DrawLine(pen,point+=sizeOff,point+sizeLine);
23
24pen.DashStyle=DashStyle.Solid;
25pen.StartCap=LineCap.Round;
26g.DrawLine(pen,point+=sizeOff,point+sizeLine);
27pen.EndCap=LineCap.Triangle;
28g.DrawLine(pen,point+=sizeOff,point+sizeLine);
29
30pen.DashPattern=newfloat[]{0.5f,1f,1,5f,2f,2.5f};
31g.DrawLine(pen,point+=sizeOff,point+sizeLine);
32}
运行结果如图92:
图92使用Pen
9.1.4刷子
刷子用来填充图形的内部。
刷子是抽象基类Brush派生出来的类,在System.Drawing中定义了两种刷子类:
(1)SolidBrush——定义一个单颜色的刷子。
(2)TextureBrush——定义一个用图像填充图形内部区域的刷子。
SolidBrush类只有几个重要成员,如表918所示。
表918SolidBrush类的重要成员
成员
描述
SolidBrush
设置一个颜色的构造函数
Clone
创建一个该刷子的准确拷贝
Dispose
释放刷子占用的Windows资源
Color
获取或设置刷子的颜色
OnSystemColorChanged
当系统颜色发生变化时调用
如果想用一个Brush对象描述一种标准颜色,那么可以使用System.Drawing.Brushes类。
对于Color类中预先定义的每一种颜色,这个类都有相应的Bursh对象。
如:
Brushbr=Brushes.Azure;
如果想用刷子描述用于UI元件中的一种标准颜色,可以使用System.Drawing.SystemBrushes类。
对于每一种预先定义的UI颜色,都有相应的Bursh对象。
如:
Brushbr=SystemBrushes.Desktop;
表919列出了所有能够通过SystemBrushes类的属性检索到的颜色。
表919SystemBrushes类的属性
属性
描述
ActiveBorder
活动窗口边界的颜色
ActiveCaption
活动窗口标题栏的颜色
ActiveCaptionText
活动窗口标题栏的文本颜色
AppWorkspace
它是应用程序工作区的颜色(应用程序工作区是多文档视图中未被文档占据的区域)
Control
3D元件的外表颜色
ControlDark
3D元件阴影部分的颜色
ControlDarkDark
3D元件最暗的颜色
ControlLight
3D元件高亮颜色
ControlLightLight
3D元件最亮颜色
ControlText
控件上面文本颜色
Desktop
桌面颜色
Highlight
高亮背景的颜色
HighlightText
高亮文本的颜色
HotTrack
用于表示热跟踪(hot-tracking)的颜色
InactiveBorder
活动窗口边界颜色
InactiveCaption
活动窗口标题栏颜色
Info
工具提示的背景颜色
Menu
菜单背景颜色
ScrollBar
滚动条