C#-GDI+编程之基础篇_第1页
C#-GDI+编程之基础篇_第2页
C#-GDI+编程之基础篇_第3页
C#-GDI+编程之基础篇_第4页
C#-GDI+编程之基础篇_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C C GDI GDI 编程之基础篇编程之基础篇 一 关于一 关于 GDI GDI 从本质上来看 GDI 为开发者提供了一组实现与各种设备 例如监视器 打印机及其它具有图形化能力但不及涉及这些图 形细节的设备 进行交互的库函数 GDI 的本质在于 它能够替代开发人员实现与例如显示器及其它外设的交互 而从开 发者角度来看 要实现与这些设备的直接交互却是一项艰巨的任务 下图 1 展示了 GDI 在开发人员与上述设备之间起着重要的中介作用 其中 GDI 为我们 包办 了几乎一切 从把一个 简单的字符串 HelloWorld 打印到控制台到绘制直线 矩形甚至是打印一个完整的表单等 图图 1 GDI 1 GDI 担当着重要的中介作用担当着重要的中介作用 那么 GDI 是如何工作的呢 为了弄清这个问题 让我们来分析一个示例 绘制一条线段 实质上 一条线段就是一个从 一个开始位置 X0 Y0 到一个结束位置 Xn Yn 的一系列像素点的集合 为了画出这样的一条线段 设备 在本例中指显 示器 需要知道相应的设备坐标或物理坐标 然而 开发人员不是直接告诉该设备 而是调用 GDI 的 drawLine 方法 然后 由 GDI 在内存 即 视频内存 中绘 制一条从点 A 到点 B 的直线 GDI 读取点 A 和点 B 的位置 然后把它们转换成一个像素序列 并且指令监视器显示该像素 序列 简言之 GDI 把设备独立的调用转换成了一个设备可理解的形式 或者实现相反方向的转换 至此 我们已经简单了解了 GDI 的工作机理 现在 让我们开始探讨如何实现一些基本的图像操作 二 图像操作二 图像操作 缩略图 缩放与保存缩略图 缩放与保存 在本文示例中 我们将实现如下的任务 1 创建缩略图 2 缩放一个加载的图像 3 保存一个操作中的图像 a 创建缩略图 缩略图是图像的浓缩版本 典型情况下 一幅缩略图图像的尺寸为 80 200 像素 在 GDI 中 一个图像的缩略图可以通 过使用 Image 类的 GetThumbnailImage 方法来创建 其函数原型如下 public Image GetThumbnailImage int thumbWidth int thumbHeight GetThumbnailImageAbort callback IntPtr callbackData 第一个参数相应于缩略图的宽度 第二个参数相应于生成的缩略图的高度 第三个参数是一个 Image GetThumbnailImageAbort 委托 在 GDI 1 0 版中不使用此委托 即便如此 也必须创建一个委托并在该参数中 传递对此委托的引用 第四个参数同样没有使用 但是也需要提供以实现兼容性 注意 第四个参数必须为 IntPtr Zero 如果前两个参数 也就是宽度和高度 都为 0 的话 那么 GDI 返回一个嵌入式缩略图 否则 使用系统定义尺寸创建该 缩略图 例如 如果 img 是一个图像类的实例 并且使用的宽度和高度都是系统定义的 创建一个缩略图的语句应该如下 所示 Image thumbNailImage img GetThumbnailImage 0 0 tnCallBack IntPtr Ze ro 在此 thumbNailImage 包含返回的缩略图 而 tnCallback 是一个相应于 Image GetThumbnailImageAbort 的函数 其定 义如下 必须调用它 但是没有使用 style font size 10 0pt font family Verdana publicbool tnCallbackMethod return false b 缩放一个加载的图像 缩放是放大或缩小一个图像的过程 通过在图像尺寸上乘以缩放因子实现 其中 缩放因子 期望的图像尺寸 当前图像 尺寸 例如 要把一个图像放大 200 则当前尺寸必须乘以 200 200 200 100 2 为了缩小一个图像到 25 则当前 尺寸必须乘以 25 或 0 25 25 100 0 25 倍 c 保存图像 保存操作是图像操作中的关键操作之一 在保存一个图像时 图像相应的类型信息也必须进行保存 也就是说 该图像的 扩展名在这一过程中具有重要角色 每一种类型相应于一个特定的格式 实质上 在保存一个图像时 根据该格式输出数 据是非常必要的 然而 借助于 GDI API 的优势 一个对 Image 类的 Save 方法的简单调用就可以把相应的写数据操作 中所有细节省略掉 这个方法使用两个参数 被保存的图像的名字和待保存图像的格式 该格式能够通过 ImageFormat 类 提供的类型来指定 下列表格指定了 GDI 支持的各种图像格式 属性 描述 Bmp 指定 BMP 格式 Emf 指定 EMF 增强的元文件格式 Exif 指定 EXIF 格式 Gif 指定 GIF 格式 Guid 指定一个 GUID 结构 用于描述 ImageFormatobject Icon 指定 Windows 图标格式 Jpeg 指定 JPEG 格式 MemoryBmp 指定内存位图格式 Png 指定 PNG 格式 Tiff 指定 TIFF 格式 Wmf 指定 WMF Windows 元文件格式 其中 Emf 和 Wmf 是特定于 Windows 系统的 假定你想使用名字 checker gif 保存一个图像 那么 相应的实现语句将是 curImage Save checker gif ImageFormat Gif 这里 curImage 对应于 Image 类的实例 在下一节中 我将对前面开发的这个应用程序进行扩展 p 三 实际开发中的图像操作三 实际开发中的图像操作 下面 我们来讨论实际中的使用情况 我将在本文示例应用程序中添加下列功能 1 以用户指定的格式保存图像 2 根据从菜单下选择的百分比放大图像 3 创建一个加载图像的略缩图 相应的菜单操作如下所示 mnuSave 文件菜单下保存图像的子菜单 mnu200Zoom 放大图像 200 mnuThumbNail 创建图像的一个略缩图 下面是处理菜单项 mnuSave 的 Click 事件相应的方法 private void mnuSave Click object sender System EventArgs e 如果图像已经创建 if curImage null return 调用 SaveFileDialog 对话框 SaveFileDialog saveDlg new SaveFileDialog saveDlg Title Save Image As saveDlg OverwritePrompt true saveDlg CheckPathExists true saveDlg Filter Bitmap File bmp bmp Gif File gif gif JPEG File jpg jpg PNG File png png saveDlg ShowHelp true 如果选择 则进行保存 if saveDlg ShowDialog DialogResult OK 得到用户选择的文件名 string fileName saveDlg FileName 得到文件扩展名 string strFilExtn fileName Remove 0 fileName Length 3 保存文件 switch strFilExtn case bmp curImage Save fileName ImageFormat Bmp break case jpg curImage Save fileName ImageFormat Jpeg break case gif curImage Save fileName ImageFormat Gif break case tif curImage Save fileName ImageFormat Tiff break case png curImage Save fileName ImageFormat Png break default break 首先 以可接收的扩展名显示这个保存对话框 然后 由从该对话框返回的文件名检索相应的扩展名 最后 根据该扩展 名 使用相应的图像格式参数调用 Save 方法 接下来 我们分析菜单项 mnu200Zoom 相应的处理器 首先 让我们在应用程序级添加下列以粗体显示的一行 private double curZoom 1 0 private Image curImage null 用于存储当前图像 private int i 0 用于把屏幕重画操作与缩略图绘 制部分区别开来 然后 必须对 mnuLoad 处理代码作少许调整 如下所示 private void mnuLoad Click object sender System EventArgs e 创建 OpenFileDialog OpenFileDialog opnDlg new OpenFileDialog 设置一个图像类型过滤器 opnDlg Filter All Image files bmp gif jpg ico emf wmf Bitmap Files bmp gif jpg ico bmp gif jpg ico Meta Files emf wmf png emf wmf png opnDlg Title 打开图像文件 opnDlg ShowHelp true 如果 OK 选择它 if opnDlg ShowDialog DialogResult OK 读取当前选择的文件名 curFileName opnDlg FileName 使用 Image FromFile 创建图像对象 try curImage Image FromFile curFileName catch Exception exp MessageBox Show exp Message 改变 AutoScrollMinSize 属性 this AutoScrollMinSize new Size int curImage Width curZoom int curImage Height curZoom i 重新绘制表单 Invalidate p 注意 在此新添加的代码分别在原来的图像宽度和高度上乘以放大因子以生成一个放大的图像 然后 必须相应地修改 paint 事件的处理器 如下所示 private void Form1 Paint object sender PaintEventArgs e if curImage null g DrawImage curImage new Rectangle AutoScrollPosition X AutoScrollPosition Y int this ClientRectangle Width curZoom int ClientRectangle Height curZoom 该图像应该有根据放大因子的相应的高度和宽度 下面 我们来看一下 mnu200Zoom 菜单项相应的事件处理器 private void mnu200 Click object sender System EventArgs e if curImage null curZoom double 200 100 i Invalidate 最后 我们来看一下 mnuThumbNail 菜单项相应的事件处理器 1private void mnuThumbnail Click object sender EventArgs e 2 3if curImage null 4 5i 6 回调 7Image GetThumbnailImageAbort tnCallBack 8new Image GetThumbnailImageAbort tnCallbackMethod 9 得到缩略图图像 10Image thumbNailImage curImage GetThumbnailImage 11 100 100 tnCallBack IntPtr Zero 12 创建一个 Graphics 对象 13Graphics tmpg this CreateGraphics 14tmpg Clear this BackColor 15 画缩略图图像 16tmpg DrawImage thumbNailImage 10 10 thumbNailImage Width thumbNailImage Height 17 释放掉 Graphics 对象 18tmpg Dispose 19 20 21 22 在此 我们首先创建一个 GetThumbnailImageAbort 类型的变量并且赋给它值 tnCallbackMethod 这是通过传递给该方 法 GetThumbnailImageAbort 实现的 然后 它创建一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论