美文网首页
C#之GDI+绘图

C#之GDI+绘图

作者: 小羊爱学习 | 来源:发表于2024-05-15 10:17 被阅读0次

    一 简介

    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 由上到下。
    GDI坐标系.png

    常用操作

       //平移坐标系
      g.TranslateTransform(10, 10);
      //顺时针选装坐标系
      g.RotateTransform(45);
      // 恢复坐标轴坐系
      g.ResetTransform()
    
    • Pen:定义用于绘制直线和曲线的对象,此类不能被继承。

    通过反编译我们可以看到Pen对象创建方法和一些属性

    image.png
    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
    画圆弧
    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
    绘制字符串
    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);//填充这个矩形
    

    相关文章

      网友评论

          本文标题:C#之GDI+绘图

          本文链接:https://www.haomeiwen.com/subject/nxblfjtx.html