【VC++技术杂谈007】使用GDI+进行图片格式转换

  本文主要介绍如何使用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分别表示源图片格式和目的图片格式。

 

posted @ 2015-04-21 23:13  依旧淡然  阅读(5531)  评论(0编辑  收藏  举报