



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
色彩鲜艳漂亮的高品质图像,一个个形象的Windows图标,高速运动、活灵活现的三维动画,这些生动的图形无一不显示着程序设计者的艺术才华。在程序设计中,图像处理已经成了每个程序员的必修课,所以,对于每个程序员来说,熟悉“BMP”、“GIF”、“JPEG”图像格式及具体应用、调色板、图像文件头格式、图像压缩算法等概念似乎已经成了工作中不可缺少的基础知识。面对如此多的图像格式,如果要全部掌握其具体细节,好像这对程序员有些不公。在VC中编程显示一幅位图,下列的步骤是不可少的:装入位图、获得位图的大小信息、启用设备环境、位传输,所需的程序代码显得千篇一律的冗长。如果想要装入的位图另存为其他格式的图像文件?两个字:头疼!而这一切都是因为GDI本身的局限性所造成。随着Windows2000的推出,上面的情况有了大大的改观:你可以不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切,全部都依赖于Windows2000及后继版中所使用的GDI技术。首先来看看GDI的具体技术细节及GDI编程特点。Windows2000在用户界面方面包括了几个重大的改进,可能你已经注意到了有阴影的鼠标、渐入的工具条快速提示、透明的窗口、平滑地窗口变化等。Windows2000在界面上之所以有这么大的改进,完全是因为Windows2000采用了一种GDI(graphicsdeviceinterface:图形设备接口)。这种GDI,以前叫GDI2k,现在有了一个更好听的名字:GDI。GDI是一种新型的图形设备接口,它的主要特点在于它能够创建全新的用户桌面体系、能够轻易地完成二维或三维的图形处理,为桌面带来一种数字化的图片。GDI 同时也提供了增强的图形处理技术,如常见的:alphablending、纹理、贴图、增强的文本及图片显示技术。实际上,GDI 主要的特色就在于强调通过硬件加速来达到良好的视觉感受!同传统的GDI不同,GDI中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI简化了对图像文件的访问(打开、保存)程序:通过调用COM组件来实现的,GDI扮演的只是指挥者,而非操作员。对于图像文件,GDI所关心的不是图像文件的文件头信息,不论欲打开的文件格式是什么类型,GDI首先要做的是在注册中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOTMIMEDatabaseContentType),如果已经注册,就通过该编码信息调用COM组件,就这么简单。这种技术其实早就在微软的其他软件中已经使用了,如IE。“体验”过NIMDA病毒的朋友可能对“audio/wav”这段代码并不陌生,NIMDA就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序。这其实也是IE使用COM技术的一个突出表现。配合GDI的推出,微软也同时发布了相应的SDK,如果你已经安装了最新的MicrosoftPlatFormSDK或已经开始使用VS.net,GDISDK已经在你的系统中了。如果没有的话,可以到/progtool上去下载GDI的头文件和库文件。在使用GDI 之后,,再有没有必要去考虑什么句柄、设备环境这样的概念了。你只需要简单地创建一个图形对象(Graphicsobject),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI中核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于组件对象模型的GDI 。使用GDI的SDK编程,必须得按照下面的规范来进行:使用GDI的名空间(namespaceGdiplus)、在使用GDI函数时必须进行GDI的初始化,使用完毕之后也得销毁GDI,这种规范在下面所列的程序中有详细的说明。前面说到了GDI是通过在注册中查看编码信息来访问图像文件的,在GDI的SDK中,编码信息是储存在ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。在GDI中,在注册表中访问编码信息通常使用以下两个函数来实现:1、查看系统中可用的图像编码信息(数量及大小)StatusGetImageEncodersSize(UINT*numEncoders,/存储编码器数量的地址UINT*size/存储编码信息所需内存大小);2、得到所有的编码信息StatusGetImageEncoders(UINTnumEncoders,/可用编码器数量UINTsize,/储存编码器信息所需内存(由ImageCodecInfo类组成的数组的大小)ImageCodecInfo*encoders/编码器信息指针);在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize所返回的。下面的代码就能够在注册表中查找具体格式图像的编码方式:intGetImageCLSID(constWCHAR*format,CLSID*pCLSID)/得到格式为format的图像文件的编码值,访问该格式图像的COM组件的/GUID值保存在pCLSID中UINTnum=0;UINTsize=0;ImageCodecInfo*pImageCodecInfo=NULL;GetImageEncodersSize(&num,&size);if(size=0)returnFALSE;/编码信息不可用/分配内存pImageCodecInfo=(ImageCodecInfo*)(malloc(size);if(pImageCodecInfo=NULL)returnFALSE;/分配失败/获得系统中可用的编码方式的所有信息GetImageEncoders(num,size,pImageCodecInfo);/在可用编码信息中查找format格式是否被支持for(UINTi=0;iInvalidate();voidCImageShowView:OnFileSaveAs()if(strOpenFileName.IsEmpty()AfxMessageBox(当前没有打开图像文件,不能进行保存!);return;/建立图形对像Graphicsgraphics(GetDC()-m_hDC);/装入当前已经打开的图形文件Imageimage(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength();CStringstrFileSave;/当其他格式的图像全部另存为BMP文件staticcharszFilter=位图(*.BMP)|*.BMP|;CFileDialogdlgChoseImage(0,BMP,NULL,NULL,szFilter);if(dlgChoseImage.DoModal()=IDOK)strFileSave=dlgChoseImage.GetPathName();CLSIDclsid;if(GetImageCLSID(Limage/bmp,&clsid)image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength(),&clsid,NULL);/将保存后的图像进行显示strOpenFileName=strFileSave;this-Invalidate();最后,为了显示浏览图像转换前后的效果,还应该在窗口中分另绘制转换前后的图像,这很容易,只需要在OnDraw函数中添加绘制代码,如下所述:voidCImageShowView:OnDraw(CDC*pDC)CImageShowDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/如果没有选择显示图形文件,则不用重绘if(strOpenFileName.IsEmpty()return;/显示当前打开的图像文件的全名this-GetParent()-SetWindowText(strOpenFileName);/建立图形对象Graphicsgraphics(pDC-m_hDC);/装入图形文件Imageimage(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength();PointdestPoints3=Point(0,0),Point(image.GetWidth(),0),Point(0,image.GetHeight();Point*pdestPoints=destPoints;/在指定区域pdestPoints显示图像graphics.DrawImage(&image,pdestPoints,3);在编译上面的程序之前,应该将Gdiplus.lib文件连编到项目中去,否则将会出现“LINK2001”编译错误。该程序在VisualStudio6.0、Windows2000/XP下调试通过,它能够显示或转换的图像格式有BMP、GIF、JPEG、Exif、PNG、TIFF、ICON、WMF、EMF等等。需要说明的是,本文只就GDI编程的基本原理进行阐述,其实,GDI的应用远不止于此。在GDI的背后,有你意想不到的惊奇!瞧,这程序运行起来是不是有些象ACDSee之类的图像浏览程序?如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养猪专业试题及答案
- 养殖专业试题及答案
- 财务相关专业试题及答案
- 绿化专业面试题及答案
- 甘肃省金太阳2026届高三9月开学联考(26-1002C)物理(含答案)
- 飞机多学科优化设计MDO提纲
- 火电燃料专业试题及答案
- 湖南省百师联盟2024-2025学年高二上学期1月期末检测生物学试卷(含答案)
- 河北省石家庄高新区外国语学校2025-2026学年八年级上学期开学测试英语试卷(含答案)
- 福建省泉州市安溪县2024-2025学年高二上学期11月期中考试语文试卷(含答案)
- 班组长管理技能提升修改
- 幼儿园消防安全教育课件:《玩火很危险》
- 酒精性肝病诊疗指南
- 学习解读《调查研究的重要论述》专题PPT
- 领导干部个人有关事项报告表(模板)
- 《中国近现代史纲要》 课件 第十一章 中国特色社会主义进入新时代
- EN61238-1额定电压36kV电力电缆用压接和机械连接器 试验方法和要求
- 专利法全套ppt课件(完整版)
- 自动插件机操作指导书
- 培智三年级上册生活数学全册教案
- 高考作文卷面书写
评论
0/150
提交评论