GDI(Graphics Device Interface)和 GDI+ 都是 Windows 提供的图形绘制接口,但它们有很多区别,GDI+ 是 GDI 的增强版,提供了更丰富的功能和更好的绘图效果。
GDI:硬件加速:部分 GDI 操作可以利用硬件加速,对于简单、频繁的绘图操作性能较高。适用于简单绘图:在需要快速、低开销的图形渲染时(如部分游戏或系统级绘图),GDI 是不错的选择。
GDI+:软件渲染:大部分 GDI+ 绘图都是在软件层面完成,相对来说在性能上不如硬件加速的 GDI。视觉效果优先:尽管性能可能稍逊,但提供更优的视觉效果,适合用户界面、图形应用程序等场景。
总结:
GDI 适用于简单、高性能的绘图场景,通常在老旧或对性能要求极高的应用中使用。 GDI+ 则提供了更多先进的图形特性,如抗锯齿、透明度和渐变填充,适合现代 .NET 应用程序开发,尤其在需要高质量图形显示的场景中表现更佳。
Graphics(图形上下文):所有绘图操作都依赖于它。
Pen(画笔):用于绘制线条和形状的边框
Brush(画刷):用于填充形状。
Color(颜色):定义绘图颜色。
Font(字体):用于绘制文本。
Bitmap(位图):用于处理图像。
画图形的基本步骤?
创建Graphics对象;才有了绘制图形的能力。
绘画的时机?Paint事件
使用Graphics对象提供的相关方法,进行画图。画图时会依赖其他对象,如:Pen,Brush,Font,Color等
绘制参数:
// 抗锯齿,让图形更平滑
g.SmoothingMode = SmoothingMode.AntiAlias;
// 设置合成图像的呈现质量为高质量,让图形绘制高质量,更清晰
g.CompositingQuality = CompositingQuality.HighQuality;
// 设置插补模式为高质量的双三次插值法,还是为了让图形绘制质量更高,更清晰
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
Pen:画笔
//参数1.颜色 参数2.粗细
Pen pen = new Pen(Color.Red, 20F);
Point:x,y坐标整数对
//设置一个坐标数组 points
Point[] points = new Point[] {
new Point(20,20),
new Point(100,20),
new Point(55,100),
new Point(20,20),
new Point(100,20),
};
g.DrawLines(pen, points):连接一组Point定义的线段
//参数1.画笔 参数2.Point数组
g.DrawLines(pen, points );//连接一组Point定义的线段
//方法1.
Graphics g = this.CreateGraphics(); // 在窗体上绘制
//方法2. Paint 事件中使用 e.Graphics:
this.panel1.Paint += panel1_Paint; //给窗体中的 panel1的Paint 中添加事件 panel1_Paint
private void panel1_Paint(object sender, PaintEventArgs e)
{
//第一步. 创建画布
Graphics g = e.Graphics;
//方法3. Graphics g = (sender as Panel).CreateGraphics
//第二步. 设置绘制参数
SetQuality(g);
/* 绘制虚线
Pen p = new Pen(Color.Red, 5);
p.Color = Color.Blue;
p.Width = 2;
p.DashStyle = DashStyle.Dot; //此画笔使用的虚线样式为:点组成的直线
g.DrawLine(p, 50, 100, 100, 100); //绘制一条连接由坐标对指定的两个点的线条
*/
//第三步: 绘制线段
Pen pen = new Pen(Color.Red, 20F); //1.设置画笔
Point[] points = new Point[] { //2.设置坐标数组
new Point(20,20),
new Point(100,20),
new Point(55,100),
new Point(20,20),
new Point(100,20),
};
g.DrawLines(pen, points); //3. 连接一组Point定义的线段
}
//封装绘制参数
private static void SetQuality(Graphics g)
{
// 抗锯齿,让图形更平滑
g.SmoothingMode = SmoothingMode.AntiAlias;
// 设置合成图像的呈现质量为高质量,让图形绘制高质量,更清晰
g.CompositingQuality = CompositingQuality.HighQuality;
// 设置插补模式为高质量的双三次插值法,还是为了让图形绘制质量更高,更清晰
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
}
g.DrawArc(pen1, rect, 0, -180):绘制弧线(中心圆)
//参数1.画笔 参数2.范围 参数3.起始角度 参数4.绘制角度
g.DrawArc(pen1, rect, 0, -180);
g.DrawEllipse(pen1, rect):椭圆
//参数1.画笔 参数2.范围
g.DrawEllipse(pen1, rect); //准备的范围 rect 是正方形的话,就是正圆
Rectangle:准备四个整数,表示一个矩形
//参数1,2: xy轴坐标 参数3,4: 宽高
Rectangle rect = new Rectangle(20, 20, 100, 100);
private void Panel2_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建画布
Graphics g = e.Graphics;
//第二步: 设置绘制参数
SetQuality(g);
//第三步: 绘制弧线
Pen pen1 = new Pen(Color.Red, 10F); //1.创建画笔
Rectangle rect = new Rectangle(20, 20, 100, 100); // 2.准备范围(这里是一个正方形)
g.DrawArc(pen1, rect, 0, -180); //3.绘制弧线
}
g.DrawRectangle(pen, new Rectangle(20,20, 150,120)):一步到位绘制矩形
g.DrawPolygon(pen, points):绘制多边形
//参数1.画笔 参数2.坐标数组
g.DrawPolygon(pen, points);
private void Panel4_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建一个画布
Graphics g = e.Graphics;
// 方法1.g.DrawRectangle(pen, new Rectangle(20,20, 150,120)); 一步到位绘制空心矩形
//第二步: 设置绘制参数
SetQuality(g);
第三步: 绘制矩形
Pen pen = new Pen(Color.Red, 10F); //1.创建画笔
Point[] points = new Point[] { //2.设置坐标数组
new Point(20,20), // 左上角
new Point(170,20), // 右上角
new Point(170,140), // 右下角
new Point(20,140), // 左下角
};
g.DrawPolygon(pen, points); //3.绘制多边形
}
Brush:定义用于填充的形状
SolidBrush:纯色填充
HatchBrush:图案填充
LinearGradientBrush:渐变填充
TextureBrush:纹理填充
Brushes:静态类
//它包含常见颜色的 Brush 实例,例如:
Brush blueBrush = Brushes.Blue;
Brush redBrush = Brushes.Red;
Brush greenBrush = Brushes.Green;
g.DrawPie(new Pen(Color.Red, 10), new Rectangle(30, 30, 100, 100), 0, 30):绘制一个空心扇形
//参数1.画笔 参数2.一个矩形 参数3.开始角度 参数4.结束角度
g.DrawPie(new Pen(Color.Red, 10), new Rectangle(30, 30, 100, 100), 0, 30);
g.FillPie(brush1, new Rectangle(30, 30, 100, 100), 0, 90):填充一个扇形
//参数1.画刷 参数2.矩形 参数3.开始角度 参数4.结束角度
g.FillPie(brush1, new Rectangle(30, 30, 100, 100), 0, 90);
private void Panel5_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建一个画布
Graphics g = e.Graphics;
//第二步:设置绘制参数
SetQuality(g);
/* g.DrawPie(new Pen(Color.Red, 10), new Rectangle(30, 30, 100, 100), 0, 30);
g.DrawPie(new Pen(Color.Blue, 10), new Rectangle(30, 30, 100, 100), 30, 90);*/ //空心扇形
//第三步: 准备画刷
// 规律:DrawXXX使用Pen,FillXXX使用Brush。
Brush brush1 = new SolidBrush(Color.Red);
Brush brush2 = new SolidBrush(Color.Blue);
Brush brush3 = new SolidBrush(Color.Green);
Brush brush4 = new SolidBrush(Color.Yellow);
//第四步: 绘制实心扇形
g.FillPie(brush1, new Rectangle(30, 30, 100, 100), 0, 90);
g.FillPie(brush2, new Rectangle(30, 30, 100, 100), 90, 90);
g.FillPie(brush3, new Rectangle(30, 30, 100, 100), 180, 90);
g.FillPie(brush4, new Rectangle(30, 30, 100, 100), 270, 90);
}
Image.FromFile(path):从指定路径创建 Image图片
string path = Path.Combine(Environment.CurrentDirectory, "../../images/1.png");
//参数1.路径
Image img = Image.FromFile(path);
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel):在指定位置并且按指定大小绘制指定的lmage 的指定部分
GraphicsUnit:度量单位
g.DrawImage(img, new Point(10, 10)) //在指定位置使用原始物理大小绘制指定的图片
// 参数1:绘制的原始图片。参数2:把原始图片绘制的多大的一个矩形中(目标矩形),如果图片过大,会自动缩放到此矩形中。参数3:原始图片的所占的矩形大小。参数4:参数3所用的单位
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
private void Panel3_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建画布
Graphics g = e.Graphics;
//第二步: 设置绘制参数
SetQuality(g);
//第三步: 获取图片路径
string path = Path.Combine(Environment.CurrentDirectory, "../../images/1.png");
Image img = Image.FromFile(path);
//第四步: 绘制图片
//g.DrawImage(img, new Point(10, 10)); 绘制原始大小的方法
Rectangle destRect = new Rectangle(0, 0, this.panel3.Width, this.panel3.Height);
Rectangle srcRect = new Rectangle(0, 0, img.Width, img.Height);//创建需要的矩形
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);//在指定位置并且按指定大小绘制指定的lmage 的指定部分
}
补充:
位图创建
Bitmap map = new Bitmap(宽, 高);
g.DrawCurve(new Pen(Color.Red, 5), points):绘制曲线
//参数1.画笔 参数2.坐标数组
g.DrawCurve(new Pen(Color.Red, 5), points);
private void Panel6_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建画布
Graphics g = e.Graphics;
//第二部: 设置绘制参数
SetQuality(g);
//第三步: 绘制曲线
PointF[] points = { //1. 准备一个浮点坐标数组
new PointF(0,this.panel6.Height),
new PointF(this.panel6.Width/9F,this.panel6.Height/9F),
new PointF(this.panel6.Width/2F,this.panel6.Height/2F),
new PointF(this.panel6.Width/9F * 8,this.panel6.Height/9F),
new PointF(this.panel6.Width,this.panel6.Height),
};
g.DrawCurve(new Pen(Color.Red, 5), points); //绘制曲线
}
g.DrawString("中国", new Font("宋体", 18F), new SolidBrush(Color.Red), 50, 50):绘制字符串
//参数1.要绘制的字符串 参数2.文本格式 参数3.笔刷 参数4,5 XY轴坐标
g.DrawString("中国", new Font("宋体", 18F), new SolidBrush(Color.Red), 50, 50);
Font
"宋体":字体格式
18F:字体大小
FontStyle:字体样式 (可选)
GraphicsUnit:字体的度量单位(可选)
private void Panel7_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建一个画布
Graphics g = e.Graphics;
//第二步: 设置绘制参数
SetQuality(g);
//第三步: 绘制文字
// C# 画刷:SolidBrush,LinearGradientBrush,SystemBrushes等,一般画刷都是填充时使用的。所以一般没有点状,线状画刷。
g.DrawString("中国", new Font("宋体", 18F), new SolidBrush(Color.Red), 50, 50);
}
g.DrawLine( ) //绘制一条连接由坐标对指定的两个点的线条
//参数1.画笔 参数2,3 坐标一 参数4,5 坐标二
g.DrawLine(p, 50, 100, 100, 100);
LinearGradientBrush:渐变画刷
//线性渐变
//参数1.起始坐标 参数2.结束坐标 参数3.起始颜色 参数4.结束颜色
Brush brush = new LinearGradientBrush(pt1, pt3, Color.Red, Color.Blue);
//径向渐变
//参数1.渐变的应用区域 参数2.起始颜色 参数3.结束颜色 参数4.渐变角度
Brush brush2 = new LinearGradientBrush(rect, Color.Red, Color.Blue, 225F);
private void Panel7_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建画布
Graphics g = e.Graphics;
//第二步: 设置绘制参数
SetQuality(g);
//第三步: 绘制渐变图形
Point pt1 = new Point(50, 110); //1.准备坐标
Point pt2 = new Point(150, 110);
Rectangle rect = new Rectangle(50, 110, 100, 100); //2.创建一个矩形
Brush brush1 = new LinearGradientBrush(pt1, pt3, Color.Red, Color.Blue); //3.创建线性渐变画刷
//Brush brush2 = new LinearGradientBrush(rect, Color.Red, Color.Blue, 225F); //创建径向渐变画刷
g.FillRectangle(brush1, rect); //4.填充指定矩形
}
g.DrawIcon(new Icon(path), new Rectangle(160, 110, 64, 64)):绘制 icon 图像
new Icon(path):从指定路径创建 icon 新实例
//参数1. icon实例 参数2.矩形
g.DrawIcon(new Icon(path), new Rectangle(160, 110, 64, 64));
private void Panel7_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建画布
Graphics g = e.Graphics;
//第二步: 设置绘制参数
SetQuality(g);
Pen p = new Pen(Color.Red, 5);
//第三步: 绘制Icon图像
string path = Path.Combine(Environment.CurrentDirectory, "../../images/2.ico"); //1.拿到图片路径
g.DrawIcon(new Icon(path), new Rectangle(160, 110, 64, 64)); //2.绘制图像
}
GraphicsPath:包含直线和曲线图形路径,用直线和曲线可以绘制一个闭合区域。
GraphicsPath path = new GraphicsPath(); //创建一个 GraphicsPath 实例path
path.StartFigure(); // 路径开始,开始绘制
// 在开始绘制和结束绘制之间,可以画各种线,图形等,如:直线,曲线,扇形,椭圆,矩形,多边形等
path.AddLine(30, 30, 100, 30);
path.AddLine(100, 30, 100, 130);
path.CloseFigure(); // 路径结束,结束绘制
g.DrawPath():绘制空心路径
//参数1.画笔 参数2.路径
g.DrawPath(new Pen(Color.Red, 6), path);
g.FillPath():填充实心路径
//参数1.笔刷 参数2.路径
g.FillPath(Brushes.Red, path);
private void Panel8_Paint(object sender, PaintEventArgs e)
{
//第一步: 创建一个画布
Graphics g = e.Graphics;
//第二步: 设置绘制参数
SetQuality(g);
//第三步: 创建路径
// GraphicsPath包含直线和曲线图形路径,用直线和曲线可以绘制一个闭合区域。
GraphicsPath path = new GraphicsPath();
path.StartFigure(); // 路径开始,开始绘制
// 在开始绘制和结束绘制之间,可以画各种线,图形等,如:直线,曲线,扇形,椭圆,矩形,多边形等
path.AddLine(30, 30, 100, 30);
path.AddLine(100, 30, 100, 130);
path.CloseFigure(); // 路径结束,结束绘制
path.StartFigure(); // 路径开始
path.AddEllipse(110, 0, 30, 30);
path.CloseFigure(); // 路径结束
//第四步: 绘制路径
//g.DrawPath(new Pen(Color.Red, 6), path); //空心路径
g.FillPath(Brushes.Red, path);
}