思路:利用 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:
- #include <afxdtctl.h>
- #define ULONG_PTR ULONG
- #include <gdiplus.h>
- using namespace Gdiplus;
- #pragma comment(lib, "gdiplus.lib")
2、如(1)中所說,將gdiplus.dll拷貝到本工程的Debug或Release目錄下
3、在show.h中的class CShowApp : public CWinApp中添加
- private:
- GdiplusStartupInput m_gdiplusStartupInput;
- ULONG_PTR m_pGdiToken;
4、在show.cpp中的BOOL CShowApp::InitInstance()中添加
- GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
5、 CShowApp添加名字爲ExitInstance的虛函數的,中添加如下退出GDI+的代碼
- GdiplusShutdown(m_pGdiToken);
(3) 測試 GDI+是否配置成功
- void CShowView::OnDraw(CDC* pDC)
- {
- CShowDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- Graphics graphics(pDC->m_hDC);
- Pen pen(Color(255, 0, 255));
- graphics.DrawLine(&pen, 0, 0, 200, 100);
- }
若能成功運行,表明GDI+配置成功
二、 添加轉換代碼,實現將打開的 JPG 格式文件保存成 BMP 格式文件
(1)在 CSshowView 中添加如下成員變量
- CString strOpenFileName;
(2)在 CSshowView 中添加如下成員函數
1、在 CSshowView 中添加 ToWChar 函數
- WCHAR* CShowView::ToWChar(char *str)
- {
- //在 GDI+中,有關字符的參數類型全部都是 WCHAR 類型的
- //該函數是將傳統字符串進行轉換
- static WCHAR buffer[1024];
- wcsset(buffer,0);
- MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
- return buffer;
- }
2、在 CSshowView 中添加 GetImageCLSID 函數
- int CShowView::GetImageCLSID(const WCHAR *format, CLSID *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;
- }
3、在 MFC ClassWixard 中重載 OnFileOpen()
- void CShowView::OnFileOpen()
- {
- static char szFilter[ ]="常見圖像格式文件(*.*)|*.*|";
- CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
- if(dlgChoseImage.DoModal() ==IDOK)
- {
- strOpenFileName=dlgChoseImage.GetPathName();
- // 打開文件後立即在窗口中顯示 (重繪客戶窗口)
- this->Invalidate() ;
- }
- }
4、在 MFC ClassWixard 中重載 OnFileSave()
- void CShowView::OnFileSave()
- {
- 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",strOpenFileName,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() ;
- }
- }
- }