C#之GDI+绘图
一 简介
GDI+ 是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”,GDI+主要提供了以下三类服务:
- 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。
- 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。
- 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。
Graphics类 是GDI+技术的一个基本类。GDI+(Graphics Device Interface)是.NET框架的重要组成部分,提供对二维图形图像和文字排版处理的支持。
GDI+相关的类分布在下列命名空间中:
- System.Drawing:提供了最基本的绘图功能(比如画直线、矩形、椭圆等);
- System.Drawing.Drawing2D: 提供了高级的二维和矢量绘图功能(比如渐变、 图案填充、- 轨迹等)
- System.Drawing.Imaging: 提供图像处理功能
- System.Drawing.Text: 提供排版功能
- System.Drawing.Printing: 提供与打印相关的服务
二 技术要点
- Graphics对象:通常我们有三种方式获取Graphics对象。
方法一:利用控件或窗体的Paint事件中的PainEventArgs。
在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用的Graphics)的一部分,在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。
eg:
//窗体的Paint事件的响应方法
private void form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
}
也可以直接重载控件或窗体的OnPaint方法,具体代码如下所示:
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
}
Paint事件在重绘控件时发生。
方法二、调用某控件或窗体的CreateGraphics方法
调用某控件或窗体的CreateGraphics方法以获取对Graphics对象的引用,该对象表示该控件或窗体的绘图图面。如果想在已存在的窗体或控件上绘图,通常会使用此方法。
eg:
Graphics g = this.CreateGraphics();
方法三、调用Graphics类的FromImage静态方法
由从Image继承的任何对象创建Graphics对象。在需要更改已存在的图像时,通常会使用此方法。
eg:
//名为“g1.jpg”的图片位于当前路径下
Image img = Image.FromFile("g1.jpg");//建立Image对象
Graphics g = Graphics.FromImage(img);//创建Graphics对象
- 坐标系:在 GDI 绘图中,水平轴 X 由左到右,垂直轴 Y 由上到下。
常用操作
//平移坐标系
g.TranslateTransform(10, 10);
//顺时针选装坐标系
g.RotateTransform(45);
// 恢复坐标轴坐系
g.ResetTransform()
- Pen:定义用于绘制直线和曲线的对象,此类不能被继承。
通过反编译我们可以看到Pen对象创建方法和一些属性
image.png
当然具体权威的还是去官网看一下这个pen:https://learn.microsoft.com/zh-cn/dotnet/api/system.drawing.pen?view=net-8.0
image.png
image.png
Pen p = new Pen(Color.Blue, 5);//设置笔的粗细为,颜色为蓝色
//画实线
p.DashStyle = DashStyle.Solid;//恢复实线
//画虚线
p.DashStyle = DashStyle.Dot;//定义虚线的样式为点
//自定义虚线
p.DashPattern = new float[] { 2, 1 };//设置短划线和空白部分的数组
//画箭头,只对不封闭曲线有用
p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头
p.Dispose();
这里主要说一下Brush,它是一个抽象类,不能被直接new实例化,我们一般使用它的派生类
① SolideBrush:实心画刷(最简单)
② HatchBrush:带阴影线的画刷;
③ LinearGradientBrush 填充颜色线性渐变的画刷;
④ PathGradientBrush 填充颜色沿着路径渐变的画刷;
⑤ TextureBrush 使用图像进行填充的画刷
eg:
Brush brush = new SolidBrush(Color.FromArgb(15, 68, 35));
SolidBrush brush = new SolidBrush(Color.Blue);
-
Graphics类的部分绘制方法:
1.png
消除锯齿
g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
画直线
画矩形
image.png
画圆弧
image.png
画椭圆(包括圆)
方法名 | 注释 |
---|---|
DrawEllipse(Pen, Int32, Int32, Int32, Int32) | 绘制由边框定义的椭圆,边框由矩形左上角的坐标、高度和宽度指定。 |
DrawEllipse(Pen, Rectangle) | 绘制由边界矩形结构指定的椭圆。 |
DrawEllipse(Pen, RectangleF) | 绘制由边界RectangleF定义的椭圆。 |
DrawEllipse(Pen, Single, Single, Single, Single) | 绘制由一对坐标、高度和宽度指定的边界矩形定义的椭圆。 |
画扇形
画多边形
image.png
绘制字符串
image.png
填充图形
基本上是将draw改为fill
Graphics g = this.CreateGraphics();
Rectangle rect = new Rectangle(10, 10, 50, 50);//定义矩形,参数为起点横纵坐标以及其长和宽
//单色填充
SolidBrush b1 = new SolidBrush(Color.Blue);//定义单色画刷
g.FillRectangle(b1, rect);//填充这个矩形