大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> VC中实现多格式图像的灵活转换

VC中实现多格式图像的灵活转换

时间: 2021-07-31 作者:daque

四川省新都县国度税务局 周鸣扬 颜色灿烂美丽的高品德图像,一个个局面的windows图标,高速疏通、绘声绘色的三维动画,那些灵巧的图形无一不表露着步调安排者的艺术本领。在步调安排中,图像处置仍旧成了每个步调员的选修课,以是,对于每个步调员来说,熟习“bmp”、“gif”、“jpeg”图像方法及简直运用、绘图板、图像文献头方法、图像收缩算法等观念犹如仍旧成了处事中不行缺乏的普通常识。面临如许多的图像方法,即使要十足控制其简直详细,犹如这对步调员有些不公。在vc中编制程序表露一幅位图,下列的办法是不行少的:装入位图、赢得位图的巨细消息、起用摆设情况、位传输,所需的步调代码显得老生常谈的繁杂。即使想要装入的位图另存为其余方法的图像文献……?两个字:头疼!而这十足都是由于gdi自己的控制性所形成。 跟着windows 2000的推出,上头的情景有了大大的变化:你不妨不用领会每种图像方法的简直含意,仿造不妨写出多方法图像欣赏或变换步调,这十足,十足都依附于windows 2000及后继版中所运用的gdi+本领。开始来看看gdi+的简直本领详细及gdi+编制程序特性。 windows 2000在用户界面上面囊括了几个宏大的矫正,大概你仍旧提防到了有暗影的鼠标、渐入的东西条赶快提醒、通明的窗口、光滑地窗口变革等。windows 2000在界面上之以是有这么大的矫正,实足是由于windows2000沿用了一种gdi(graphics device interface :图形摆设接口)。这种gdi,往日叫gdi2k,此刻有了一个更动听的名字:gdi+。gdi+是一种新式的图形摆设接口,它的重要特性在乎它不妨创造崭新的用户桌面体制、不妨简单地实行二维或三维的图形处置,为桌面带来一种数字化的图片。 gdi+ 同声也供给了巩固的图形处置本领,如罕见的:alpha blending、 纹理、贴图、巩固的文本及图片表露本领。本质上,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; } 有了这种看法,实行多方法的图像的欣赏与变换就并不是什么难题了。为了报告的简单,开始在vc中创造一个sdi名目imageshow,开始对运用gdi+声明和初始化及废弃举行代码体例,简直代码如次: #include "gdiplus.h" using namespace gdiplus; cimageshowview::cimageshowview() { //初始化gdi+ gdiplusstartupinput gdiplusstartupinput; ulong_ptr gdiplustoken; gdiplusstartup(&gdiplustoken, &gdiplusstartupinput, null); } cimageshowview::~cimageshowview() { //废弃gdi+ ulong_ptr gdiplustoken; gdiplusshutdown(gdiplustoken); } 接着经过类引导(class wizard),重载“文献”菜单中的“翻开”和“另存为”两项,为了编制程序的大略,本步调只将暂时翻开的图像文献径直存为bmp文献(本质上生存成其余方法的文献也很大略,只然而是对文献名举行领会罢了)。其余,为了在翻开和生存文献举行文献名的传播,开始应在cimageshowview类中介入一全部变量“cstring stropenfilename”。“翻开”和“另存为”两项的相应代码如次,大师经过代码中的解释部份领会编制程序思绪,该当不会有什么题目: wchar* towchar(char * str) { //在gdi+中,相关字符的参数典型十足都是wchar典型的 //该因变量是将保守字符串举行变换 static wchar buffer[1024]; wcsset(buffer,0); multibytetowidechar(cp_acp,0,str,strlen(str),buffer,1024); return buffer; } void cimageshowview::onfileopen() { //本步调不妨翻开各类罕见方法的图像文献 static char szfilter[]="罕见方法图形文献(*.*)|*.*|"; cfiledialog dlgchoseimage(1,null,null,null,szfilter); if(dlgchoseimage.domodal()==idok) { stropenfilename=dlgchoseimage.getpathname(); //翻开文献后登时在窗口中表露(重绘存户窗口) this->invalidate(); } } void cimageshowview::onfilesaveas() { if(stropenfilename.isempty()) { afxmessagebox("暂时没有翻开图像文献,不许举行生存!"); return; } //创造图形对像 graphics graphics(getdc()->m_hdc); //装入暂时仍旧翻开的图形文献 image image(towchar(stropenfilename.getbuffer(stropenfilename.getlength()))); cstring strfilesave; //当其余方法的图像十足另存为bmp文献 static char szfilter[]="位图(*.bmp)|*.bmp|"; cfiledialog dlgchoseimage(0,"bmp",null,null,szfilter); if(dlgchoseimage.domodal()==idok) { strfilesave=dlgchoseimage.getpathname(); clsid clsid; if(getimageclsid(l"image/bmp", &clsid)) { image.save(towchar(strfilesave.getbuffer(strfilesave.getlength())), &clsid, null); //将生存后的图像举行表露 stropenfilename=strfilesave; this->invalidate(); } } } 结果,为了表露欣赏图像变换前后的功效,还该当在窗口平分秋色另绘制变换前后的图像,这很简单,只须要在ondraw因变量中增添绘制代码,如次所述: void cimageshowview::ondraw(cdc* pdc) { cimageshowdoc* pdoc = getdocument(); assert_valid(pdoc); //即使没有采用表露图形文献,则不必重绘 if(stropenfilename.isempty()) return; //表露暂时翻开的图像文献的全名 this->getparent()->setwindowtext(stropenfilename); //创造图形东西 graphics graphics(pdc->m_hdc); //装入图形文献 image image(towchar(stropenfilename.getbuffer(stropenfilename.getlength()))); point destpoints[3] = { point(0, 0), point(image.getwidth(), 0), point(0, image.getheight()) }; point* pdestpoints = destpoints; //在指定地区pdestpoints表露图像 graphics.drawimage(&image, pdestpoints, 3); } 在编写翻译上头的步调之前,该当将gdiplus.lib文献连编到名目中去,要不将会展示“link 2001”编写翻译缺点。该步调在visual studio 6.0、windows2000/xp下调节和测试经过,它不妨表露或变换的图像方法有bmp、gif、jpeg 、exif 、png 、tiff 、icon、wmf 、emf之类。须要证明的是,正文只就gdi+编制程序的基础道理举行阐明,本来,gdi+的运用远不只于此。在gdi+的背地,有你预见不到的诧异! 瞧,这步调运转起来是否有些象acdsee之类的图像欣赏步调?即使对本步调举行些矫正,你也以做出功效越发强劲的图像处置步调。正文中所提到的步调,在我的网页“国税之家”(http://nationaltax.home.chinaren.com)的“个尘世界”中不妨下载入到。相关gdi+的编步调扶助消息,大师不妨到微软的msdn网站去查看。即使你有visual studio .net,这就最佳,由于所附的msdn for visual studio.net 7.0中有gdi+编制程序所需的十足消息。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.