在 VC++6.0 中将 JPG 格式图片转换成 BMP 格式

思路:利用 GDI+来完成
难点: (1)配置 GDI 开发环境,添加配置代码
(2)在当文档程序中添加转换代码
注意:本文档由 ybdesire 参考网上资料撰写完成,代码已经做过测试,可直接复制张贴


实现过程:

一、配置 GDI 开发环境
(1) 下载 GDI+ SDK for Visual C++ 6.0
http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip
下载的GDIPlus文件夹中有Includes,Lib文件夹和gdiplus.dll文件。
将Includes和Lib中的文件分别拷到VC6安装目录中的VC98\include和lib文件夹下。

(2) 新建 MFC 单文档应用程序 show:

 

 

[cpp]  view plain copy
  1. #include <afxdtctl.h>  
  2. #define ULONG_PTR ULONG  
  3. #include <gdiplus.h>  
  4. using namespace Gdiplus;  
  5. #pragma comment(lib, "gdiplus.lib")  


2、如(1)中所说,将gdiplus.dll拷贝到本工程的Debug或Release目录下

3、在show.h中的class CShowApp : public CWinApp中添加

 

 

 

[cpp]  view plain copy
  1. private:  
  2.     GdiplusStartupInput m_gdiplusStartupInput;  
  3.     ULONG_PTR m_pGdiToken;  


4、在show.cpp中的BOOL CShowApp::InitInstance()中添加

[cpp]  view plain copy
  1. GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);  


5、 CShowApp添加名字为ExitInstance的虚函数的,中添加如下退出GDI+的代码

[cpp]  view plain copy
  1. GdiplusShutdown(m_pGdiToken);  


(3) 测试 GDI+是否配置成功

[cpp]  view plain copy
  1. void CShowView::OnDraw(CDC* pDC)  
  2. {  
  3.     CShowDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     Graphics graphics(pDC->m_hDC);  
  6.     Pen pen(Color(255, 0, 255));  
  7.     graphics.DrawLine(&pen, 0, 0, 200, 100);  
  8. }  


若能成功运行,表明GDI+配置成功


二、 添加转换代码,实现将打开的 JPG 格式文件保存成 BMP 格式文件


(1)在 CSshowView 中添加如下成员变量


[cpp]  view plain copy
  1. CString strOpenFileName;  


(2)在 CSshowView 中添加如下成员函数
1、在 CSshowView 中添加 ToWChar 函数

 

 

 

[cpp]  view plain copy
  1. WCHAR* CShowView::ToWChar(char *str)  
  2. {  
  3.     //在 GDI+中,有关字符的参数类型全部都是 WCHAR 类型的  
  4.     //该函数是将传统字符串进行转换  
  5.     static WCHAR buffer[1024];  
  6.     wcsset(buffer,0);  
  7.     MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);  
  8.     return buffer;  
  9. }  


2、在 CSshowView 中添加 GetImageCLSID 函数

 

 

 

[cpp]  view plain copy
  1. int CShowView::GetImageCLSID(const WCHAR *format, CLSID *pCLSID)  
  2. {  
  3.     UINT num=0;  
  4.     UINT size=0;  
  5.     ImageCodecInfo* pImageCodecInfo=NULL;  
  6.     GetImageEncodersSize(&num,&size);  
  7.     if(size==0)  
  8.         return FALSE; // 编码信息不可用  
  9.     // 分配内存  
  10.     pImageCodecInfo=(ImageCodecInfo*)(malloc(size));  
  11.     if(pImageCodecInfo==NULL)  
  12.         return FALSE; // 分配失败  
  13.     // 获得系统中可用的编码方式的所有信息  
  14.     GetImageEncoders(num,size,pImageCodecInfo);  
  15.     // 在可用编码信息中查找 format 格式是否被支持  
  16.   
  17.     for(UINT i=0;i<num;++i)  
  18.     {  
  19.         //MimeType: 编码方式的具体描述  
  20.         if (wcscmp(pImageCodecInfo[ i] .MimeType,format)==0)  
  21.         {  
  22.             *pCLSID=pImageCodecInfo[i].Clsid;  
  23.             free(pImageCodecInfo);  
  24.             return TRUE;  
  25.         }  
  26.     }  
  27.     free(pImageCodecInfo);  
  28.     return FALSE;  
  29. }  


3、在 MFC ClassWixard 中重载 OnFileOpen()

 

 

 

[cpp]  view plain copy
  1. void CShowView::OnFileOpen()  
  2. {  
  3.     static char szFilter[ ]="常见图像格式文件(*.*)|*.*|";  
  4.     CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);  
  5.     if(dlgChoseImage.DoModal() ==IDOK)  
  6.     {  
  7.         strOpenFileName=dlgChoseImage.GetPathName();  
  8.         // 打开文件后立即在窗口中显示 (重绘客户窗口)  
  9.         this->Invalidate() ;  
  10.     }  
  11. }  


4、在 MFC ClassWixard 中重载 OnFileSave()

 

 

 

[cpp]  view plain copy
  1. void CShowView::OnFileSave()  
  2. {  
  3.     if( strOpenFileName.IsEmpty() )  
  4.     {  
  5.         AfxMessageBox("当前没有打开图像文件, 不能进行保存!");  
  6.         return;  
  7.     }  
  8.   
  9.     // 建立图形对象  
  10.     Graphics graphics(GetDC()->m_hDC);  
  11.   
  12.     // 装入当前已经打开的图像文件  
  13.     Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));  
  14.   
  15.     CString strFileSave;  
  16.     // 将其他格式的图像全部另存为 BMP 文件  
  17.     static char szFilter[ ]= "位图(*.BMP)|*.BMP|";  
  18.   
  19.     CFileDialog dlgChoseImage(0,"BMP",strOpenFileName,NULL,szFilter);  
  20.   
  21.     if(dlgChoseImage.DoModal() ==IDOK)  
  22.   
  23.     {  
  24.   
  25.         strFileSave=dlgChoseImage.GetPathName();  
  26.   
  27.         CLSID clsid;  
  28.   
  29.         if(GetImageCLSID(L"image/bmp", &clsid))  
  30.         {  
  31.             image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, NULL);  
  32.             // 将保存后的图像进行显示  
  33.             strOpenFileName=strFileSave;  
  34.             this->Invalidate() ;  
  35.         }  
  36.     }  
  37. }  

 

 

 

 

转自:http://blog.sina.com.cn/s/blog_9402171001012i5u.html

你可能感兴趣的:(mfc,VC,bmp,jpg,数字图像处理)