CGDI编程教程CGDI编程教程
第 7 章 C#图 形 图 像 编 程 基 础本章主要介绍使用 C#进行图形图像编程基础,其中包括 GDI+绘图基础、C#图像处理基础以及简单的图像处理技术。7.1 GDI+绘图基础编 写 图 形 程 序 时 需 要 使 用 GDI( Graphics Device Interface, 图 形 设 备 接 口 ) ,从 程 序 设 计 的 角 度 看 , GDI 包 括 两 部 分 : 一 部 分 是 GDI 对 象 , 另 一 部 分 是 GDI 函 数 。GDI 对 象 定 义 了 GDI 函 数 使 用 的 工 具 和 环 境 变 量 , 而 GDI 函 数 使 用 GDI 对 象 绘 制 各 种图 形 , 在 C#中 , 进 行 图 形 程 序 编 写 时 用 到 的 是 GDI+( Graphice Device Interface Plus 图 形 设 备 接 口 ) 版 本 , GDI+是 GDI 的 进 一 步 扩 展 , 它 使 我 们 编 程 更 加 方 便 。7.1.1 GDI+概 述GDI+是 微 软 在 Windows 2000 以 后 操 作 系 统 中 提 供 的 新 的 图 形 设 备 接 口 , 其 通 过 一套 部 署 为 托 管 代 码 的 类 来 展 现 , 这 套 类 被 称 为 GDI+的 “托 管 类 接 口 ”, GDI+主 要 提 供了 以 下 三 类 服 务 :(1) 二 维 矢 量 图 形 : GDI+提 供 了 存 储 图 形 基 元 自 身 信 息 的 类 (或 结 构 体 )、 存 储 图形 基 元 绘 制 方 式 信 息 的 类 以 及 实 际 进 行 绘 制 的 类 。(2) 图 像 处 理 : 大 多 数 图 片 都 难 以 划 定 为 直 线 和 曲 线 的 集 合 , 无 法 使 用 二 维 矢 量 图形 方 式 进 行 处 理 。 因 此 , GDI+为 我 们 提 供 了 Bitmap、 Image 等 类 ,它 们 可 用 于 显 示 、 操作 和 保 存 BMP、 JPG、 GIF 等 图 像 格 式 。(3) 文 字 显 示 : GDI+支 持 使 用 各 种 字 体 、 字 号 和 样 式 来 显 示 文 本 。我 们 要 进 行 图 形 编 程 , 就 必 须 先 讲 解 Graphics 类 , 同 时 我 们 还 必 须 掌 握Pen、 Brush 和 Rectangle 这 几 种 类 。GDI+比 GDI 优 越 主 要 表 现 在 两 个 方 面 : 第 ( 一 ) GDI+通 过 提 供 新 功 能 ( 例 如 : 渐变 画 笔 和 alpha 混 合 ) 扩 展 了 GDI 的 功 能 ; 第 ( 二 ) 修 订 了 编 程 模 型 , 使 图 形 编 程 更加 简 易 灵 活 。7.1.2 Graphics 类Graphics 类 封 装 一 个 GDI+绘 图 图 面 , 提供将对象绘制到显示设备的方法,Graphics与特定的设备上下文关联。画 图 方 法 都 被 包 括 在 Graphics 类 中 , 在 画 任 何 对 象 ( 例 如 :Circle,Rectangle) 时 , 我 们 首 先 要 创 建 一 个 Graphics 类 实 例 , 这 个 实 例 相 当 于 建 立了 一 块 画 布 , 有 了 画 布 才 可 以 用 各 种 画 图 方 法 进 行 绘 图 。绘 图 程 序 的 设 计 过 程 一 般 分 为 两 个 步 骤 : ( 一 ) 创 建 Graphics对象;(二)使用Graphics对象的方法绘图、显示文本或处理图像。通 常 我 们 使 用 下 述 三 种 方 法 来 创 建 一 个 Graphics 对 象 。方 法 一 、 利 用 控 件 或 窗 体 的 Paint 事 件 中 的 PainEventArgs在窗体或控件的 Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs 指定绘制控件所用的 Graphics)的一部分,在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。例 如 :/窗体的 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对象的引用,该对象表示该控件或窗体的绘图图面。如果想在已存在的窗体或控件上绘图,通常会使用此方法。例 如 :Graphics g = this.CreateGraphics();方法三、调用 Graphics 类 的 FromImage 静 态 方 法由从 Image继承的任何对象创建 Graphics对象。在需要更改已存在的图像时,通常会使用此方法。例 如 :/名 为 “g1.jpg”的 图 片 位 于 当 前 路 径 下Image img = Image.FromFile("g1.jpg");/建 立 Image 对 象Graphics g = Graphics.FromImage(img);/创建 Graphics对象Graphics 类的方法成员有 了 一 个 Graphics 的 对 象 引 用 后 , 就 可 以 利 用 该 对 象 的 成 员 进 行 各 种 各 样 图 形 的绘 制 , 表 7.1 列 出 了 Graphics 类 的 常 用 方 法 成 员 。表 7.1 Graphics 类常用方法名 称 说 明DrawArc 画 弧 。DrawBezier 画 立 体 的 贝 尔 塞 曲 线 。DrawBeziers 画 连 续 立 体 的 贝 尔 塞 曲 线 。DrawClosedCurve 画 闭 合 曲 线 。DrawCurve 画 曲 线 。DrawEllipse 画 椭 圆 。DrawImage 画 图 像 。DrawLine 画 线 。DrawPath 通 过 路 径 画 线 和 曲 线 。DrawPie 画 饼 形 。DrawPolygon 画 多 边 形 。DrawRectangle 画 矩 形 。DrawString 绘 制 文 字 。FillEllipse 填 充 椭 圆 。FillPath 填 充 路 径 。FillPie 填 充 饼 图 。FillPolygon 填 充 多 边 形 。FillRectangle 填 充 矩 形 。FillRectangles 填 充 矩 形 组 。FillRegion 填 充 区 域 。在 .NET 中 , GDI+的 所 有 绘 图 功 能 都 包 括 在System、 System.Drawing、 System.Drawing.Imaging、 System.Drawing.Darwing2D 和System.Drawing.Text 等 命 名 空 间 中 , 因 此 在 开 始 用 GDI+类 之 前 , 需 要 先 引 用 相 应 的命 名 空 间 。2引用命名空间在 C#应 用 程 序 中 使 用 using 命 令 已 用 给 定 的 命 名 空 间 或 类 , 下 面 是 一 个 C#应 用 程序 引 用 命 名 空 间 的 例 子 :using System;using System.Collections.Generic;using System.Data;using System.ComponentModel;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;7.1.3 常 用 画 图 对 象在 创 建 了 Graphics 对 象 后 , 就 可 以 用 它 开 始 绘 图 了 , 可 以 画 线 、 填 充 图 形 、 显 示文 本 等 等 , 其 中 主 要 用 到 的 对 象 还 有 : Pen:用来用 patterns、colors 或者 bitmaps进行填充。 Color:用来画线和多边形,包括矩形、圆和饼形。 Font:用来给文字设置字体格式。 Brush:用来描述颜色。 Rectangle:矩 形 结 构 通 常 用 来 在 窗 体 上 画 矩 形 。 Point:描 述 一 对 有 序 的 x,y 两 个 坐 标 值 。1Pen 类Pen用来绘制指定宽度和样式的直线。使用 DashStyle属性绘制几种虚线,可以使用各种填充样式(包括纯色和纹理)来填充 Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理。使 用 画 笔 时 , 需 要 先 实 例 化 一 个 画 笔 对 象 , 主 要 有 以 下 几 种 方 法 。用 指 定 的 颜 色 实 例 化 一 只 画 笔 的 方 法 如 下 :public Pen(Color);用 指 定 的 画 刷 实 例 化 一 只 画 笔 的 方 法 如 下 :public Pen(Brush);用 指 定 的 画 刷 和 宽 度 实 例 化 一 只 画 笔 的 方 法 如 下 :public Pen(Brush, float);用 指 定 的 颜 色 和 宽 度 实 例 化 一 只 画 笔 的 方 法 如 下 :public Pen(Color, float);实 例 化 画 笔 的 语 句 格 式 如 下 :Pen pn=new Pen(Color.Blue);或 者 Pen pn=new Pen(Color.Blue,100);Pen 常 用 的 属 性 有 以 下 几 个 , 如 表 7.2 所 示 :表 7.2 Pen 常用属性名 称 说 明Alignment 获 得 或 者 设 置 画 笔 的 对 齐 方 式 。Brush 获 得 或 者 设 置 画 笔 的 属 性 。Color 获 得 或 者 设 置 画 笔 的 颜 色 。Width 获 得 或 者 设 置 画 笔 的 宽 度 。2Color 结构在 自 然 界 中 , 颜 色 大 都 由 透 明 度 ( A) 和 三 基 色 ( R,G,B) 所 组 成 。 在 GDI+中 , 通过 Color 结 构 封 装 对 颜 色 的 定 义 , Color 结 构 中 , 除 了 提 供 ( A,R,G,B) 以 外 , 还 提 供许 多 系 统 定 义 的 颜 色 , 如 Pink( 粉 颜 色 ) , 另 外 , 还 提 供 许 多 静 态 成 员 , 用 于 对 颜 色 进行 操 作 。 Color 结 构 的 基 本 属 性 如 表 7.3 所 示 。表 7.3 颜色的基本属性名 称 说 明A 获 取 此 Color 结 构 的 alpha 分 量 值 , 取 值 ( 0 255) 。B 获 取 此 Color 结 构 的 蓝 色 分 量 值 , 取 值 ( 0 255) 。G 获 取 此 Color 结 构 的 绿 色 分 量 值 , 取 值 ( 0 255) 。R 获 取 此 Color 结 构 的 红 色 分 量 值 , 取 值 ( 0 255) 。Name获 取 此 Color 结 构 的 名 称 , 这 将 返 回 用 户 定 义 的 颜 色 的 名 称或 已 知 颜 色 的 名