⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc实现多格式图像的转换.htm

📁 GDI编程的参考资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      href="http://www.programfan.com/article/article.asp?classid=10">WINDOWS编程</A></DIV></TD>
    <TD>
      <DIV align=center><STRONG><A 
      href="http://www.programfan.com/article/article.asp?classid=16">VB.net</A></STRONG></DIV></TD>
    <TD>
      <DIV align=center><STRONG><A 
      href="http://www.programfan.com/article/article.asp?classid=11">JSP</A></STRONG></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=13">游戏开发</A></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=12">汇编语言</A></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=14">数据库开发</A></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=15">Visual 
      C#</A></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=17">XML</A></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=9">PHP</A></DIV></TD>
    <TD>
      <DIV align=center><A 
      href="http://www.programfan.com/article/article.asp?classid=19"><STRONG>算法</STRONG></A></DIV></TD>
    <TD>&nbsp;</TD></TR></TBODY></TABLE>
<TABLE style="WORD-BREAK: break-all; WORD-WRAP: break-word" cellSpacing=0 
cellPadding=0 width=755 border=0>
  <TBODY>
  <TR>
    <TD vAlign=top width="75%" height=234>
      <DIV align=center>
      <TABLE cellSpacing=1 cellPadding=0 width="99%" align=left border=0>
        <TBODY>
        <TR>
          <TD style="BORDER-BOTTOM: rgb(0,0,0) 1px solid" width="100%" 
          bgColor=#99ccff height=18><STRONG>您所在的位置:<A 
            href="http://www.programfan.com/">编程爱好者网站</A> -<A 
            href="http://www.programfan.com/article/article.asp">文档中心</A> - <A 
            style="COLOR: rgb(255,0,0)" 
            href="http://www.programfan.com/article/article.asp?classid=2">Visual 
            C++文章</A></STRONG></TD></TR>
        <TR>
          <TD style="FONT-SIZE: 11pt; FONT-FAMILY: 宋体" align=middle 
          bgColor=#fafafa height=248>
            <DIV align=center>
            <TABLE cellSpacing=0 cellPadding=0 width="95%" border=0>
              <TBODY>
              <TR>
                <TD style="FONT-SIZE: 11pt; COLOR: #ff0000; FONT-FAMILY: 宋体" 
                align=middle bgColor=#fafafa 
              height=24><B>VC实现多格式图像的转换</B></TD></TR>
              <TR>
                <TD style="COLOR: #c0c0c0" align=middle bgColor=#fafafa 
                height=50>(加入日期:2002-3-9 点击数:12562)<BR><B>【<A 
                  href="http://www.programfan.com/article/comment.asp?id=1613">对此文发表评论</A>】&nbsp;【<A 
                  href="http://www.programfan.com/club">编程爱好者论坛</A>】 【<A 
                  onclick='javascript:SaveAs("编程爱好者文章中心","")' 
                  href="http://www.programfan.com/article/showarticle.asp?id=1613#">保存文章至硬盘</A>】 
                  &nbsp;【<A onclick=javascript:window.print() 
                  href="http://www.programfan.com/article/showarticle.asp?id=1613#">打印文章</A>】</B></TD></TR>
              <TR>
                <TD align=middle height=25>
                  <P align=center><A href="http://www.dvpx.com/" 
                  target=_blank><IMG height=55 src="VC实现多格式图像的转换.files/dvpx.gif" 
                  width=500 border=0></A></P></TD></TR>
              <TR>
                <TD style="WORD-BREAK: break-all; WORD-WRAP: break-word" 
                bgColor=#fafafa height=123>
                  <TABLE width=300 align=left border=0>
                    <TBODY>
                    <TR>
                      <TD><IFRAME id=nadframe marginWidth=0 marginHeight=0 
                        src="VC实现多格式图像的转换.files/ad300_300.htm" frameBorder=0 
                        width=300 scrolling=no 
                  height=300></IFRAME></TD></TR></TBODY></TABLE>
                  <P class=fontsize10 style="FONT-SIZE: 10.5pt"><BR>◆ 周鸣扬 
                  (healthboy@163.net) 
                  <BR><BR>色彩鲜艳漂亮的高品质图像,一个个形象生动的Windows图标,高速运动、活灵活现的三维动画,这些无一不显示出程序设计者的艺术才华。在程序设计中,图像处理已经成为每个程序员的必修课。 
                  <BR><BR>在VC中编程显示一幅位图,下列步骤是不可缺少的: 
                  装入位图、获得位图的大小信息、启用设备环境、位传输等,所需的程序代码一般比较冗长而且复杂。如果想将装入的位图另存为其他格式的图像文件,代码就更长了。这一切都是因为GDI本身的局限性造成的。 
                  <BR><BR>GDI+技术 <BR><BR>随着Windows 2000的推出,上述情况有了极大的改观: 
                  程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切全都依赖于Windows 2000及后继版中所使用的GDI+技术。 
                  <BR><BR>和传统的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技术的一个突出表现。 
                  <BR><BR>配合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+,这些规范在下面所列的程序中有详细的说明。 
                  <BR><BR>访问注册表编码信息 
                  <BR><BR>上面说到GDI+是通过在注册表中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是存储在 
                  ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。对于GDI,在注册表中访问编码信息通常使用以下两个函数来实现: 
                  <BR><BR>1. 查看系统中可用的图像编码信息(数量及大小) <BR><BR>Status 
                  GetImageEncodersSize( <BR><BR>UINT* numEncoders, 
                  <BR><BR>//存储编码器数量的地址 <BR><BR>UINT* size //存储编码信息所需内存大小 
                  <BR><BR>); <BR><BR>2. 得到所有的编码信息 <BR><BR>Status 
                  GetImageEncoders( <BR><BR>UINT numEncoders,//可用编码器数量 
                  <BR><BR>UINT size,//存储编码器信息所需内存(由ImageCodecInfo类组成的数组的大小) 
                  <BR><BR>ImageCodecInfo* encoders//编码器信息指针 <BR><BR>); 
                  <BR><BR>在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize返回的。下面的代码在注册表中查找具体格式图像的编码方式: 
                  <BR><BR>int GetImageCLSID(const WCHAR* format, CLSID* pCLSID) 
                  <BR><BR>{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中 
                  <BR><BR>UINT num = 0; <BR><BR>UINT size = 0; 
                  <BR><BR>ImageCodecInfo* pImageCodecInfo = NULL; 
                  <BR><BR>GetImageEncodersSize(&amp;num, &amp;size); 
                  <BR><BR>if(size == 0) <BR><BR>return FALSE; // 编码信息不可用 
                  <BR><BR>//分配内存 <BR><BR>pImageCodecInfo = 
                  (ImageCodecInfo*)(malloc(size)); <BR><BR>if(pImageCodecInfo == 
                  NULL) <BR><BR>return FALSE; // 分配失败 
                  <BR><BR>//获得系统中可用的编码方式的所有信息 <BR><BR>GetImageEncoders(num, 
                  size, pImageCodecInfo); <BR><BR>//在可用编码信息中查找format格式是否被支持 
                  <BR><BR>for(UINT i = 0; i &lt; num; ++i) <BR><BR>{ 
                  //MimeType:编码方式的具体描述 <BR><BR>if( wcscmp(pImageCodecInfo[i] 
                  <BR><BR>.MimeType, format) == 0 ) <BR><BR>{ <BR><BR>*pCLSID = 
                  pImageCodecInfo[i] <BR><BR>.Clsid; 
                  <BR><BR>free(pImageCodecInfo); <BR><BR>return TRUE; <BR><BR>} 
                  <BR><BR>} <BR><BR>free(pImageCodecInfo); <BR><BR>return FALSE; 
                  <BR><BR>} <BR><BR>实现多格式的图像浏览和转换 
                  <BR><BR>有了前面的知识,实现多格式的图像的浏览与转换就不是什么难事了。 
                  <BR><BR>1.在VC中创建一个SDI项目ImageShow,对GDI+声明和初始化及销毁进行代码编制,具体代码如下: 
                  <BR><BR>#include “Gdiplus.h” <BR><BR>using namespace Gdiplus; 
                  <BR><BR>CImageShowView::CImageShowView() <BR><BR>{ 
                  <BR><BR>//初始化GDI+ <BR><BR>GdiplusStartupInput 
                  gdiplusStartupInput; <BR><BR>ULONG_PTR gdiplusToken; 
                  <BR><BR>GdiplusStartup(&amp;gdiplusToken, 
                  &amp;gdiplusStartupInput, NULL); <BR><BR>} 
                  <BR><BR>CImageShowView::~CImageShowView() <BR><BR>{ 
                  <BR><BR>//销毁GDI+ <BR><BR>ULONG_PTR gdiplusToken; 
                  <BR><BR>GdiplusShutdown(gdiplusToken); <BR><BR>} <BR><BR>2. 
                  通过类向导(Class 
                  Wizard),重载“文件”菜单中的“打开”和“另存为”两项。为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存为其他格式的文件也很简单,只不过是对文件名进行分析而已)。另外,为了在打开和保存文件时进行文件名的传递,还应在CImageShowView类中加入一全局变量“CString 
                  strOpenFileName”。“打开”和“另存为”两菜单的对应代码如下: <BR><BR>WCHAR* 
                  ToWChar(char * str) <BR><BR>{ 
                  <BR><BR>//在GDI+中,有关字符的参数类型全部都是WCHAR类型 <BR><BR>//该函数是将传统字符串进行转换 
                  <BR><BR>static WCHAR buffer[1024]; <BR><BR>wcsset(buffer,0); 
                  <BR><BR>MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024); 
                  <BR><BR>return buffer; <BR><BR>} <BR><BR>void 
                  CImageShowView::OnFileOpen() <BR><BR>{ 
                  <BR><BR>//本程序能够打开各类常见格式的图像文件 static char 
                  szFilter[]=“常见格式图像文件(*.*)|*.*|”; <BR><BR>CFileDialog 
                  dlgChoseImage(1,NULL,NULL,NULL,szFilter); 
                  <BR><BR>if(dlgChoseImage.DoModal()==IDOK) <BR><BR>{ 
                  <BR><BR>strOpenFileName=dlgChoseImage <BR><BR>.GetPathName(); 
                  <BR><BR>//打开文件后立即在窗口中显示(重绘客户窗口) <BR><BR>this-&gt;Invalidate(); 
                  <BR><BR>} <BR><BR>} <BR><BR>void 
                  CImageShowView::OnFileSaveAs() <BR><BR>{ 
                  <BR><BR>if(strOpenFileName.IsEmpty()) <BR><BR>{ 
                  <BR><BR>AfxMessageBox(“当前没有打开图像文件,不能进行保存!”); <BR><BR>return; 
                  <BR><BR>} <BR><BR>//建立图形对象 <BR><BR>Graphics 
                  graphics(GetDC()-&gt;m_hDC); <BR><BR>//装入当前已经打开的图像文件 
                  <BR><BR>Image 
                  image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength()))); 
                  <BR><BR>CString strFileSave; <BR><BR>//将其他格式的图像全部另存为BMP文件 
                  <BR><BR>static char szFilter[]=“位图(*.BMP)|*.BMP|”; 
                  <BR><BR>CFileDialog dlgChoseImage(0,“BMP”,NULL,NULL,szFilter); 
                  <BR><BR>if(dlgChoseImage.DoModal()==IDOK) <BR><BR>{ 
                  <BR><BR>strFileSave=dlgChoseImage.GetPathName(); <BR><BR>CLSID 
                  clsid; <BR><BR>if(GetImageCLSID(L“image/bmp”,&amp;clsid)) 
                  <BR><BR>{ 
                  <BR><BR>image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), 
                  &amp;clsid, NULL); <BR><BR>//将保存后的图像进行显示 
                  <BR><BR>strOpenFileName=strFileSave; 
                  <BR><BR>this-&gt;Invalidate(); <BR><BR>} <BR><BR>} <BR><BR>} 
                  <BR><BR>3.为了浏览图像转换前后的效果,还应该在窗口中分别绘制转换前后的图像,这需要在OnDraw函数中添加绘制代码,如下所示: 
                  <BR><BR>void CImageShowView::OnDraw(CDC* pDC) <BR><BR>{ 
                  <BR><BR>CImageShowDoc* pDoc = GetDocument(); 
                  <BR><BR>ASSERT_VALID(pDoc); <BR><BR>//如果没有选择显示图像文件,则不用重绘 
                  <BR><BR>if(strOpenFileName.IsEmpty()) <BR><BR>return; 
                  <BR><BR>//显示当前打开的图像文件的全名 
                  <BR><BR>this-&gt;GetParent()-&gt;SetWindowText(strOpenFileName); 
                  <BR><BR>//建立图像对象 <BR><BR>Graphics graphics(pDC-&gt;m_hDC); 
                  <BR><BR>//装入图形文件 <BR><BR>Image 
                  image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength()))); 
                  <BR><BR>Point destPoints[3] = <BR><BR>{ <BR><BR>Point(0, 0), 
                  <BR><BR>Point(image.GetWidth(), 0), <BR><BR>Point(0, 
                  image.GetHeight()) <BR><BR>}; <BR><BR>Point* pdestPoints = 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -