C#使用Graphics、Pen 和 Brush 类进行2D图形绘制
通过图形的例子,可以看到OOP的优点以及使用类、方法和属性的意义。
通过将适当的库添加到项目的命名空间中,您可以立即获得图形所需的一组工具。
这些是图形基元(线条、矩形、椭圆等)、绘图笔、阴影画笔以及许多其他有用的对象和方法。
如您所知,2D 图形分为光栅和矢量。光栅图像是在矩形区域中定义的一组彩色像素,存储在 *.bmp、*.jpg、*.png 等文件中。最简单的光栅编辑器是 Paint 程序。矢量图形比光栅图形更经济(就内存而言)。所以,要绘制一个矩形,只需指定两个点的坐标(左上角和右下角)以及线条的颜色和粗细就足够了。在本节中,我们将主要考虑矢量图形方法。
System.Drawing 命名空间使用大约 50 (!) 个类(包括Graphics类),提供对 GDI+ 图形界面功能的访问。稍后我们将使用其他命名空间:System.Drawing.Drawing2D、System.Drawing.Imaging、System.Drawing.Printing、System.Drawing.Text,它们扩展了 System.Drawing 库的功能。
Graphics类提供了在显示设备上绘图的方法(其他术语是图形上下文,“画布”)。在以下示例中,它表示为对象 g。
定义“画布”的方法
1. 图形对象 - 用于在 Form1 上绘图的“画布”(this 指针)可以指定,例如,使用一条语句:
Graphics g = this.CreateGraphics();
笔记。请注意,以标准方式
Graphics g = new Graphics();
无法创建画布对象。
此语句会生成错误:
没有为类型“System.Drawing.Graphics”定义构造函数。
2、另一个通过Bitmap类的光栅对象在可视化组件PictureBox (绘图框)上设置图形上下文的例子。在Form1类中我们将定义两个对象:
Graphics g; // 图形对象 - 画布位图 buf; // 位图图像的缓冲区
将以下运算符添加到 Form1() 构造函数中:
buf = new Bitmap(pictureBox1.Width, pictureBox1.Height); // 尺寸
g = Graphics.FromImage(buf); // 初始化g
3. 原则上,有时(如果所有图形操作都在一个函数内执行)这四行可以用一行代替:
Graphics g = Graphics.FromImage(new Bitmap(pictureBox1.Width, pictureBox1.Height));
之后,您可以将画布背景设置为白色:
g.Clear(Color.White);
4. 通过窗口句柄在窗体上指定“画布”的另一个示例:
Graphics g = Graphics.FromHwnd(this.Handle);
以下示例指定了这些方法。
System.Drawing库中其他类的对象
诸如Rectangle和Point 之类的类封装了 GDI+ 元素。请注意,Point 实际上是一个包含字段 x、y 的结构。这种澄清并不重要,因为在 C# 中,结构类似于类,并且初始化点结构对象看起来与初始化类对象相同:
Point point= new Point();
Pen类用于绘制直线和曲线,而从Brush类派生的类用于填充闭合路径(见下文)。
G raphicsPath类允许您指定一系列连接的直线和曲线,Region类描述由多边形和轮廓组成的图形形状的内部。
Image类是一个抽象基类,为 Bitmap 和 Metafile 派生类提供功能。位图用于处理像素图像(参见上面的示例)。图元文件定义了一个图形图元文件,其中包含描述可以记录(创建)和回放(显示)的图形操作序列的条目。该类不被继承。
图形类
它封装了GDI+绘图表面。这个类不是继承的。此类中有大量方法,因此我们首先将它们呈现在表格中,然后通过示例和解释来考虑其中的一些方法。
表的第三列表示参数组中不同的方法重载的数量(使用 IntelliSense 选择您需要的方法选项)。
方法名称 | 描述 | 过载次数 |
Clear(Color) | 清除整个绘图表面并用指定的背景颜色填充该表面。 | 1 |
CopyFromScreen(Point, Point, Size) | 将与位块中的像素矩形区域相对应的颜色数据从屏幕传输到 Graphics 对象的绘图表面。 | 4 |
Dispose() | 释放该 Graphics 对象使用的所有资源。 | 1 |
DrawArc(Pen, Rectangle, Single, Single) | 绘制一条圆弧,该圆弧是由 Rectangle 结构定义的椭圆的一部分。 | 4 |
DrawBezier(Pen, Point, Point, Point, Point) | 绘制由四个 Point 结构定义的贝塞尔曲线。 | 3 |
DrawBeziers(Pen, Point[]) | 绘制由 (3N+1) 个点结构数组定义的多条 (N) 贝塞尔曲线。 | 2 |
DrawCloseCurve(Pen, Point[ ]) | 绘制闭合基本样条线 | 4 |
DrawEllipse(Pen, Rectangle) | 绘制一个椭圆 | 4 |
DrawIcon(Icon, Rectangle) | 绘制图标 | 2 |
DrawImage(Image image, int x, int y) | 使用坐标 (x,y) 处的实际大小绘制给定图像 | 30 |
DrawLine(Pen, Point, Point) | 绘制一条连接两个 Point 结构的线。 | 4 |
DrawLines(Pen, Point[ ]) | 绘制一组连接 Point 结构数组的线段。 | 2 |
DrawPath(Pen, gp) | 使用 Pen 绘制 GraphicsPath gp 对象。 | 1 |
DrawPie(Pen, Rectangle, Single, Single) | 绘制由矩形结构和两条径向线定义的椭圆定义的扇区。 | 4 |
DrawPolygon(Pen, Point[]) | 绘制由 Point 结构数组定义的多边形。 | 2 |
DrawRectangle(Pen, Rectangle) | 绘制由 Rectangle 结构定义的矩形。 | 3 |
DrawRectangles(Pen, Rectangle[]) | 绘制一组由 Rectangle 结构定义的矩形。 | 2 |
DrawString(String, Font, Brush, PointF) | 使用定义的 Brush 和 Font 对象在指定位置创建指定的文本字符串。 | 6 |
Equals(Object) | 确定指定对象是否等于当前对象。 (继承自对象。) | 1 |
ExcludeClip(Rectangle) | 更新此 Graphics 的剪切区域以排除 Rectangle 结构定义的部分。 | 1 |
ExcludeClip(Region) | 更新此 Graphics 的剪辑区域以排除由 Region 结构定义的部分。 | 1 |
FillClosedCurve(Brush, Point[]) | 填充由 Point 结构数组定义的闭合基本曲线的内部。 | 6 |
FillEllipse(Brush, Rectangle) | 填充由 Rectangle 结构指定的边界矩形定义的椭圆的内部。 | 4 |
FillPath(Brush, GraphicsPath) | 填充 GraphicsPath 对象的内部。 | 1 |
FillPie(Brush, Rectangle, Single, Single) | 填充由 RectangleF 结构和两条径向线定义的椭圆定义的扇区的内部。 | 3 |
FillPolygon(Brush, Point[]) | 填充由 Point 结构指定的点数组定义的多边形的内部。 | 4 |
FillRectangle(Brush, Rectangle) | 填充由 Rectangle 结构定义的矩形的内部。 | 4 |
FillRegion(Brush,Region) | 填充 Region 对象的内部。 | 1 |
Flush() | 强制执行所有挂起的图形操作并立即返回,而不等待它们完成。 | 2 |
IntersectClip(Region) | 更新该对象的剪切区域以包括当前剪切区域和指定结构的交集 | 3 |
ResetClip() | 重置所选区域 g,使其无限大 | 1 |
有关另外两门课程的更多详细信息。
Pen类
Pen 类定义了用于绘制直线和曲线的对象。该类不被继承。类构造函数(也是方法重载的示例):
1) Pen(Color) 使用指定的颜色初始化 Pen 类的新实例。
2) Pen(Color, Single) 使用指定的 Color 和 Width 属性初始化 Pen 类的新实例。 (宽度 - 设置画笔的宽度,以用于绘图的 Graphics 对象为单位。
例如:
Pen redPen = new Pen(Color.Red); // 默认画笔厚度为 1 像素
或使用中间变量 green
Color green = Color.Green;
Pen greenPen = new Pen(green, 4.5f);
您可以在不指定显式笔名称的情况下输入新对象(创建动态笔对象的示例):
g .DrawRectangle(new Pen(Color.Red, 3), r );
例如,使用图形上下文(“画布”)g用 3 像素粗的红色笔绘制矩形r。
Brush类
Brush 类定义用于填充图形形状内部的对象,例如矩形、椭圆形、圆形、多边形和路径。这是一个无法实现的抽象基类。要创建画笔对象,可以使用 Brush 派生类,例如SolidBrush、TextureBrush和LinearGradientBrush, 例如:
SolidBrush br = new SolidBrush(Color.Aqua);
g.FillRectangle(br, r ); //在“画布”上填充矩形r g
或者不显式声明“画笔”对象 br:
g.FillRectangle(new SolidBrush(Color.Red), r);