【VC++技術雜談007】使用GDI+進行圖片格式轉換

  本文主要介紹如何使用GDI+對圖片進行格式轉換,能夠轉換的圖片格式爲bmp、jpg、png。編程

 

1.加載GDI+庫函數

  GDI+是GDI圖形庫的一個加強版本,提供了一系列Visual C++ API。爲了使用GDI+,須要在工程中包含「GdiPlus.h」頭文件,並加載「gdiplus.lib」庫文件。ui

  具體實現方法爲,下載GDI+庫,將下載獲得的Gdiplus文件夾放到工程中。Gdiplus文件夾中應當包含有「GdiPlus.h」等一系列頭文件、Gdiplus.lib庫文件和Gdiplus.dll動態連接庫。編碼

  在工程中的「StdAfx.h」頭文件中加入以下代碼:spa

1 #define UNICODE
2 #ifndef ULONG_PTR
3 #define ULONG_PTR unsigned long*
4 #endif
5 #include "Gdiplus/GdiPlus.h"
6 using namespace Gdiplus;
7 #pragma comment(lib, ".\\Gdiplus\\gdiplus.lib")

 

2.初始化GDI+庫以及卸載GDI+庫code

  在工程的初始化啓動函數InitInstance()中加入以下代碼,實現對GDI+庫的初始化。對象

1     GdiplusStartupInput gdiplusStartupInput;
2     GdiplusStartup(&m_GdiPlusToken, &gdiplusStartupInput, NULL);

  其中,m_GdiPlusToken是ULONG_PTR類型的成員變量。blog

  在應用程序退出時,即ExitInstance()函數中,實現對GDI+庫的卸載,具體實現代碼以下。圖片

1     GdiplusShutdown(m_GdiPlusToken);

 

3.編程示例ip

  以下的編程示例,實現了bmp、jpg、png三種圖片格式之間的互相轉換。程序運行界面如圖1所示。

主界面

3.1Bitmap.Save()方法

  進行圖片格式轉換主要利用了GDI+位圖對象Bitmap的Save()方法。該函數可以將位圖對象按指定的轉碼方式寫入到磁盤文件或數據流中,其中一個函數原型爲:

 1 inline Status
 2 Image::Save(
 3     IN const WCHAR* filename,
 4     IN const CLSID* clsidEncoder,
 5     IN const EncoderParameters *encoderParams
 6     )
 7 {
 8     return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
 9                                                      filename,
10                                                      clsidEncoder,
11                                                      encoderParams));
12 }

  其中,參數filename表示轉碼後的磁盤文件名(全路徑);參數clsidEncoder表示轉碼方式; 參數encoderParams表示轉碼參數。

3.2具體實現

  以下的代碼示例了點擊「格式轉換」按鈕後,如何設置轉碼方式、轉碼參數,以及調用Bitmap的Save()方法完成圖片格式轉換。

 1 /*
 2  * 函數功能 : 點擊"格式轉換"按鈕時,該函數被調用
 3  * 備    注 : 
 4  * 做    者 : 博客園 依舊淡然
 5  */
 6 void CImageConvertDlg::OnButtonImageConvert() 
 7 {
 8     UpdateData(TRUE);
 9 
10     //檢測源圖片文件是否選擇
11     if(m_EditImagePath.IsEmpty())
12     {
13         MessageBox("請選擇圖片!", "提示", MB_OK|MB_ICONWARNING);
14         return;
15     }
16 
17     //檢測轉換先後的格式是否相同
18     if(m_SourceImageType == m_DestinationImageType)
19     {
20         MessageBox("格式相同,不須要轉換!", "提示", MB_OK|MB_ICONWARNING);
21         return;
22     }
23     
24     //設置編碼方式
25     CLSID clsid;
26     if(m_DestinationImageType == _T("bmp"))
27         GetEnCoderClsid(L"image/bmp", &clsid);
28     else if(m_DestinationImageType == _T("jpg"))
29         GetEnCoderClsid(L"image/jpeg", &clsid);
30     else if(m_DestinationImageType == _T("png"))
31         GetEnCoderClsid(L"image/png", &clsid);
32 
33     //設置編碼參數
34     ULONG encoderQuality = 50;                                //壓縮比例
35     EncoderParameters encoderParameters;
36     encoderParameters.Count = 1;
37     encoderParameters.Parameter[0].Guid = EncoderQuality;
38     encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
39     encoderParameters.Parameter[0].NumberOfValues = 1;
40     encoderParameters.Parameter[0].Value = &encoderQuality;    
41 
42     //進行圖片格式轉換
43     Bitmap bmBitmap(m_EditImagePath.AllocSysString());        //根據源圖片文件構建一個GDI+位圖對象
44     CString strSaveSaveFilePath = m_EditImagePath.Left(m_EditImagePath.GetLength() - 3);
45     strSaveSaveFilePath += m_DestinationImageType;
46     Status status = bmBitmap.Save(strSaveSaveFilePath.AllocSysString(), &clsid, &encoderParameters);
47     if(status != Ok)
48     {
49         MessageBox("圖片轉換失敗!", "提示", MB_OK|MB_ICONWARNING);
50         return;
51     }
52 }

  其中,成員變量m_SourceImageType和m_DestinationImageType分別表示源圖片格式和目的圖片格式。

相關文章
相關標籤/搜索