C# GDI+ 图形编程入门:核心类、绘图对象与创建方式详解

Miles
Miles
发布时间:2026-10-13 | 4人浏览过
原创

C# GDI+是Windows平台下进行2D图形处理、图像渲染和文本显示的基础技术。本文系统介绍GDI+的运行环境、绘图核心类以及常用图形对象的创建与配置方法,通过具体代码示例展示如何高效实现各类几何图形绘制。

GDI+ 概述与核心服务

GDI+(Graphics Device Interface Plus)是微软在 Windows 2000 及以后版本中引入的增强版图形设备接口。相比传统 GDI,GDI+ 提供了更强大的功能集和更灵活的托管类接口,主要支持以下三类服务:

  • 二维矢量图形:包括线条、椭圆、多边形等基本图元的绘制,支持渐变和抗锯齿效果。
  • 图像处理:支持 BMP、JPEG、GIF、PNG 等多种格式图像的加载、修改和保存。
  • 文字显示:提供丰富的字体控制能力,支持字形、字号及样式的精细调节。

在进行 GDI+ 编程时,最关键的对象是 Graphics 类,它代表了绘图表面。配合 Pen(画笔)、Brush(画刷)、Rectangle(矩形结构)等辅助类,可以完成绝大多数界面绘图任务。

获取 Graphics 对象的三种方法

Graphics 对象封装了具体的绘图上下文,所有绘图动作都依赖该实例。在实际开发中,通常通过以下三种方式获取该对象:

第1步:利用 Paint 事件

这是在控件或窗体上绘图的推荐方式,特别是在需要响应重绘(如窗口大小改变、最小化恢复)时。系统会在重绘发生时自动触发 Paint 事件,并传入包含 Graphics 对象的 PaintEventArgs。

// 覆盖 OnPaint 方法以执行自定义绘图
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Graphics g = e.Graphics;
    // 在此处执行绘图操作,例如:
    // g.DrawLine(Pens.Red, 0, 0, 100, 100);
}

注意:在 Paint 事件中进行的绘图通常是临时的,如果需要在其他时刻维持绘图结果,需将逻辑转移到定时器或状态刷新机制中,或使用双缓冲技术防止闪烁。

第2步:调用 CreateGraphics 方法

如果需要在一个已经存在的窗体或控件上即时绘图(例如鼠标按下时的临时轨迹),可以直接调用其 CreateGraphics() 方法。这种方式获取的 Graphics 对象仅针对当前屏幕快照有效,若发生重绘则内容会丢失。

// 获取当前窗体的绘图表面
Graphics g = this.CreateGraphics();
// 执行绘图...
g.Dispose(); // 使用后记得释放资源

第3步:从 Image 派生

当需要对一个已存在的图片文件进行修改(如添加水印、调整对比度)并保存时,需要从 Image 对象创建 Graphics 对象。这种 Graphics 对象指向内存中的图像位图而非屏幕显示器。

// 从文件加载图像
using (Image img = Image.FromFile("g1.jpg"))
{
    using (Graphics g = Graphics.FromImage(img))
    {
        // 在内存中对图像进行编辑
        // ... 绘制逻辑 ...
    }
    // 保存或显示处理后的图像
}

风险提示:在使用完从非 Paint 事件创建的 Graphics 对象后,务必调用 Dispose() 方法以释放 GDI 句柄,防止资源泄漏。

引用必要的命名空间

使用 GDI+ 的所有功能前,必须引入正确的命名空间。主要的绘图相关类位于 System.Drawing 及其子命名空间中:

using System;
using System.Drawing;           // 核心绘图类
using System.Drawing.Drawing2D; // 高级 2D 功能(路径、变换)
using System.Drawing.Imaging;   // 图像编码与解码

常用画图对象详解

绘图过程中,除了操作 Graphics 实例的方法外,还需要构建描述“怎么画”的工具对象。

1. Pen 类:绘制线条

Pen 对象定义了线条的颜色、宽度和样式(如实线、虚线)。它是抽象基类 Brush 的一种特化形式,专门用于轮廓描绘。

// 创建红色实线画笔,宽度为 2
Pen redPen = new Pen(Color.Red, 2);

// 创建蓝色虚线画笔,指定样式
Pen dashPen = new Pen(Color.Blue, 1) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash };

常用属性:Color(颜色)、Width(宽度)、DashPattern(自定义虚线模式)。

2. Color 结构:定义颜色

GDI+ 使用 32 位 ARGB 值表示颜色。可以通过多种静态方法创建 Color 实例:

// 方式一:预设名称
Color pink = Color.Pink;

// 方式二:已知枚举颜色
Color brown = Color.FromKnownColor(KnownColor.Brown);

// 方式三:自定义 RGB 及 Alpha
Color custom = Color.FromArgb(128, 255, 0, 0); // 半透明红色

应用场景:获取像素颜色时,可使用 Bitmap.GetPixel(x, y) 返回对应位置的 Color 结构。

3. Brush 类:填充区域

Brush 是抽象基类,不能直接实例化,实际使用的是其派生类:

  • SolidBrush:纯色填充。
  • TextureBrush:纹理填充。
  • LinearGradientBrush:线性渐变填充(GDI+ 亮点之一)。
  • HatchBrush:阴影线填充。

4. Font 类:文本排版

Font 定义了文字的显示风格。实例化时通常需要字体族(Family)、大小和单位:

// 创建 Arial 字体,大小 16,粗体
Font myFont = new Font("Arial", 16f, FontStyle.Bold, GraphicsUnit.Pixel);

5. Rectangle 与 Point 类:定位

这两个结构体用于描述几何位置:

  • Point(x, y):定义二维平面上的坐标原点。
  • Rectangle(x, y, width, height):定义带大小的矩形区域,常用于限制绘图范围或作为参数传递给 DrawEllipse 等方法。

总结

C# GDI+ 提供了一种底层且高效的图形处理手段,虽然在新项目中常被 WPF 或 WinUI 取代,但在控制台绘图、简单 UI 插件开发及图像算法验证中仍不可或缺。掌握 Graphics 的生命周期管理与基础工具类的属性配置,是编写稳健图形程序的关键。

以上就是 C# GDI+ 基础图形编程的详细教程,更多关于 C# 图像处理与技术实践的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表