文章出處

  本文主要介紹如何使用GDI+對圖片進行格式轉換,可以轉換的圖片格式為bmp、jpg、png。

 

1.加載GDI+庫

  GDI+是GDI圖形庫的一個增強版本,提供了一系列Visual C++ API。為了使用GDI+,需要在工程中包含“GdiPlus.h”頭文件,并加載“gdiplus.lib”庫文件。

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

  在工程中的“StdAfx.h”頭文件中加入如下代碼:

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+庫

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

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

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

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

1     GdiplusShutdown(m_GdiPlusToken);

 

3.編程示例

  如下的編程示例,實現了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分別表示源圖片格式和目的圖片格式。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()