| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
VC实现多格式图像的转换

作者:未知    文章来源:网络    点击数:    更新时间:2007-7-6
 

色彩鲜艳漂亮的高品质图像,一个个形象生动的Windows图标,高速运动、活灵活现的三维动画,这些无一不显示出程序设计者的艺术才华。在程序设计中,图像处理已经成为每个程序员的必修课。 

在VC中编程显示一幅位图,下列步骤是不可缺少的: 装入位图、获得位图的大小信息、启用设备环境、位传输等,所需的程序代码一般比较冗长而且复杂。如果想将装入的位图另存为其他格式的图像文件,代码就更长了。这一切都是因为GDI本身的局限性造成的。 

GDI+技术 

随着Windows 2000的推出,上述情况有了极大的改观: 程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切全都依赖于Windows 2000及后继版中所使用的GDI+技术。 

和传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)。它是通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论要打开的文件格式是什么类型,GDI+首先要做的是在注册表中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\Content Type)。如果已经注册,就通过该编码信息调用COM组件,就这么简单。这种技术早就在微软的其他软件中使用了(如IE)。“体验”过Nimda病毒的朋友可能对“audio/wav”这段代码并不陌生,Nimda就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序,这其实也是IE使用COM技术的一个突出表现。 

配合GDI+的推出,微软也同时发布了相应的SDK,如果已经安装了最新的Microsoft PlatForm SDK或已经开始使用VS.NET,GDI+的SDK就已经在系统中了。如果没有的话,可以到http: //noner.top263.net/progtool上去下载GDI+的头文件和库文件。有了GDI+之后,只需简单地创建一个图形对象(Graphics object),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI+中的核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。使用GDI+的SDK编程,必须按照下面的规范来进行:使用GDI+的命名空间(namespace Gdiplus),在使用GDI+函数时必须进行GDI+的初始化,使用完毕要销毁GDI+,这些规范在下面所列的程序中有详细的说明。 

访问注册表编码信息 

上面说到GDI+是通过在注册表中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是存储在 ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。对于GDI,在注册表中访问编码信息通常使用以下两个函数来实现: 

1. 查看系统中可用的图像编码信息(数量及大小) 

Status GetImageEncodersSize( 

UINT* numEncoders, 

//存储编码器数量的地址 

UINT* size //存储编码信息所需内存大小 

); 

2. 得到所有的编码信息 

Status GetImageEncoders( 

UINT numEncoders,//可用编码器数量 

UINT size,//存储编码器信息所需内存(由ImageCodecInfo类组成的数组的大小) 

ImageCodecInfo* encoders//编码器信息指针 

); 

在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize返回的。下面的代码在注册表中查找具体格式图像的编码方式: 

int GetImageCLSID(const WCHAR* format, CLSID* pCLSID) 

{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中 

UINT num = 0; 

UINT size = 0; 

ImageCodecInfo* pImageCodecInfo = NULL; 

GetImageEncodersSize(&num, &size); 

if(size == 0) 

return FALSE; // 编码信息不可用 

//分配内存 

pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 

if(pImageCodecInfo == NULL) 

return FALSE; // 分配失败 

//获得系统中可用的编码方式的所有信息 

GetImageEncoders(num, size, pImageCodecInfo); 

//在可用编码信息中查找format格式是否被支持 

for(UINT i = 0; i < num; ++i) 

{ //MimeType:编码方式的具体描述 

if( wcscmp(pImageCodecInfo[i] 

.MimeType, format) == 0 ) 



*pCLSID = pImageCodecInfo[i] 

.Clsid; 

free(pImageCodecInfo); 

return TRUE; 





free(pImageCodecInfo); 

return FALSE; 

[1] [2] 下一页


  • 上一篇文章:

  • 下一篇文章: 没有了
  • 相关文章