C#,Winform 中GDI+ 技术的使用基础

GDI+

GDI(Graphics Device Interface)和 GDI+ 都是 Windows 提供的图形绘制接口,但它们有很多区别,GDI+ 是 GDI 的增强版,提供了更丰富的功能和更好的绘图效果。

  1. GDI:硬件加速:部分 GDI 操作可以利用硬件加速,对于简单、频繁的绘图操作性能较高。适用于简单绘图:在需要快速、低开销的图形渲染时(如部分游戏或系统级绘图),GDI 是不错的选择。

  2. GDI+:软件渲染:大部分 GDI+ 绘图都是在软件层面完成,相对来说在性能上不如硬件加速的 GDI。视觉效果优先:尽管性能可能稍逊,但提供更优的视觉效果,适合用户界面、图形应用程序等场景。

总结:

GDI 适用于简单、高性能的绘图场景,通常在老旧或对性能要求极高的应用中使用。 GDI+ 则提供了更多先进的图形特性,如抗锯齿、透明度和渐变填充,适合现代 .NET 应用程序开发,尤其在需要高质量图形显示的场景中表现更佳。

GDI+ 主要涉及的类:

  1. Graphics(图形上下文):所有绘图操作都依赖于它。

  2. Pen(画笔):用于绘制线条和形状的边框

  3. Brush(画刷):用于填充形状。

  4. Color(颜色):定义绘图颜色。

  5. Font(字体):用于绘制文本。

  6. Bitmap(位图):用于处理图像。

基本步骤

画图形的基本步骤?

  1. 创建Graphics对象;才有了绘制图形的能力。

  2. 绘画的时机?Paint事件

  3. 使用Graphics对象提供的相关方法,进行画图。画图时会依赖其他对象,如:Pen,Brush,Font,Color等

绘制线段

  1. 绘制参数:

    // 抗锯齿,让图形更平滑
    g.SmoothingMode = SmoothingMode.AntiAlias;
    // 设置合成图像的呈现质量为高质量,让图形绘制高质量,更清晰
    g.CompositingQuality = CompositingQuality.HighQuality;
    // 设置插补模式为高质量的双三次插值法,还是为了让图形绘制质量更高,更清晰
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

  2. Pen:画笔

    //参数1.颜色    参数2.粗细
    Pen pen = new Pen(Color.Red, 20F);
  3. 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),
    };
  4. 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;
    }


    绘制弧线

    1. g.DrawArc(pen1, rect, 0, -180):绘制弧线(中心圆)

      //参数1.画笔  参数2.范围  参数3.起始角度  参数4.绘制角度
      g.DrawArc(pen1, rect, 0, -180);                                                                        
    2. g.DrawEllipse(pen1, rect):椭圆

      //参数1.画笔  参数2.范围
      g.DrawEllipse(pen1, rect);  //准备的范围 rect 是正方形的话,就是正圆
    3. 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.绘制弧线
    }


    绘制矩形

    1. g.DrawRectangle(pen, new Rectangle(20,20, 150,120)):一步到位绘制矩形

    2. 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.绘制多边形
    
    }


    绘制饼图

    1. Brush:定义用于填充的形状

      • SolidBrush:纯色填充

      • HatchBrush:图案填充

      • LinearGradientBrush:渐变填充

      • TextureBrush:纹理填充

      • Brushes:静态类

        //它包含常见颜色的 Brush 实例,例如:
        Brush blueBrush = Brushes.Blue;
        Brush redBrush = Brushes.Red;
        Brush greenBrush = Brushes.Green;

    2. 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);
    3. 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);
    }


    绘制图片

    1. Image.FromFile(path):从指定路径创建 Image图片

      string path = Path.Combine(Environment.CurrentDirectory, "../../images/1.png");
      //参数1.路径
      Image img = Image.FromFile(path);
    2. 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(宽, 高);


    绘制曲线

    1. 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);  //绘制曲线
    }


    绘制文字

    1. 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);
    2. 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);
    }


    绘制渐变图形

    1. g.DrawLine( ) //绘制一条连接由坐标对指定的两个点的线条

      //参数1.画笔    参数2,3 坐标一    参数4,5 坐标二
      g.DrawLine(p, 50, 100, 100, 100);
    2. 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.填充指定矩形
    }


    绘制icon图片

    1. 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.绘制图像
    }


    绘制路径

    1. GraphicsPath:包含直线和曲线图形路径,用直线和曲线可以绘制一个闭合区域。

      GraphicsPath path = new GraphicsPath();  //创建一个 GraphicsPath 实例path
      path.StartFigure(); // 路径开始,开始绘制
      
      // 在开始绘制和结束绘制之间,可以画各种线,图形等,如:直线,曲线,扇形,椭圆,矩形,多边形等
      path.AddLine(30, 30, 100, 30); 
      path.AddLine(100, 30, 100, 130);
      
      path.CloseFigure(); // 路径结束,结束绘制
    2. g.DrawPath():绘制空心路径

      //参数1.画笔    参数2.路径
      g.DrawPath(new Pen(Color.Red, 6), path);
    3. 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);
    }


     

    你可能感兴趣的:(C#,WinForm,c#,visualstudio,GDI+)