




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C# GDI+编程之基础篇一、关于GDI+ 从本质上来看,GDI+为开发者提供了一组实现与各种设备(例如监视器,打印机及其它具有图形化能力但不及涉及这些图形细节的设备)进行交互的库函数。GDI+的本质在于,它能够替代开发人员实现与例如显示器及其它外设的交互;而从开发者角度来看,要实现与这些设备的直接交互却是一项艰巨的任务。下图1展示了GDI+在开发人员与上述设备之间起着重要的中介作用。其中,GDI+为我们“包办”了几乎一切从把一个简单的字符串“HelloWorld”打印到控制台到绘制直线,矩形甚至是打印一个完整的表单等。 图1.GDI+担当着重要的中介作用 那么,GDI+是如何工作的呢?为了弄清这个问题,让我们来分析一个示例绘制一条线段。实质上,一条线段就是一个从一个开始位置(X0,Y0)到一个结束位置(Xn,Yn)的一系列像素点的集合。为了画出这样的一条线段,设备(在本例中指显示器)需要知道相应的设备坐标或物理坐标。然而,开发人员不是直接告诉该设备,而是调用GDI+的drawLine()方法,然后,由GDI+在内存(即“视频内存”)中绘制一条从点A到点B的直线。GDI+读取点A和点B的位置,然后把它们转换成一个像素序列,并且指令监视器显示该像素序列。简言之,GDI+把设备独立的调用转换成了一个设备可理解的形式;或者实现相反方向的转换。 至此,我们已经简单了解了GDI+的工作机理。现在,让我们开始探讨如何实现一些基本的图像操作。 二、图像操作缩略图,缩放与保存 在本文示例中,我们将实现如下的任务: 1. 创建缩略图。 2. 缩放一个加载的图像。 3. 保存一个操作中的图像。 a) 创建缩略图 缩略图是图像的浓缩版本。典型情况下,一幅缩略图图像的尺寸为80200像素。在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.Zero);在此,thumbNailImage包含返回的缩略图,而tnCallback是一个相应于Image.GetThumbnailImageAbort的函数,其定义如下: /必须调用它,但是没有使用 style=font-size:10.0pt;font-family:Verdanapublicbool 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 & i=0).Graphics g = this.CreateGraphics();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.GetThumbnailImage11(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();19202122在此,我们首先创建一个GetThumbnailImageAbort类型的变量并且赋给它值tnCallbackMethod()这是通过传递给该方法GetThumbnailImageA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苗木收购合同样本
- 2025年乡村医生资格考试:农村常用药物知识及临床应用试题库
- 2025年医保知识考试题库及答案:报销流程重点解析
- 2025年消防安全知识培训考试题库:火灾预防与逃生消防器材维护试题
- 2025年小学语文毕业升学传统文化知识全真模拟试卷试题集
- 刮灰合同样本
- 临聘合同样本
- 加盟运营商合同样本
- 住宅物业托管合同标准文本
- 农场田地分租合同样本
- 期中(试题)-2024-2025学年人教精通版(2024)英语三年级下册
- 2025-2030中国煤焦油杂酚油行业市场发展趋势与前景展望战略研究报告
- 新版食品安全法培训课件
- 2025年高考物理专项复习:电磁感应综合题
- 第13课 亚非拉民族独立运动 课件(共26张)2024-2025学年统编版高中历史(必修)中外历史纲要(下)
- 2020-2025年中国辽宁省风力发电行业发展潜力分析及投资方向研究报告
- 安全车辆测试题及答案
- (二模)咸阳市2025年高考模拟检测(二)语文试卷(含答案)
- 2025高校教资《高等教育法规》核心备考题库(含典型题、重点题)
- 东湖高新区2023-2024学年下学期期中七年级数学试题(含答案)
- 劳务派遣劳务外包项目方案投标文件(技术方案)
评论
0/150
提交评论