在 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:

 

 

  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中添加

 

 

 

  1. private:  
  2.     GdiplusStartupInput m_gdiplusStartupInput;  
  3.     ULONG_PTR m_pGdiToken;  


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

  1. GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);  


5、 CShowApp添加名字爲ExitInstance的虛函數的,中添加如下退出GDI+的代碼

  1. GdiplusShutdown(m_pGdiToken);  


(3) 測試 GDI+是否配置成功

  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 中添加如下成員變量


  1. CString strOpenFileName;  


(2)在 CSshowView 中添加如下成員函數
1、在 CSshowView 中添加 ToWChar 函數

 

 

 

  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 函數

 

 

 

  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()

 

 

 

  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()

 

 

 

  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

發佈了50 篇原創文章 · 獲贊 7 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章