C# GDI+ 图形编程入门:核心类、绘图对象与创建方式详解
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# 图像处理与技术实践的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









