您的位置:首页 > 其它

使用GDI+转换图片格式

2013-09-07 12:41 483 查看
调用ImageConvert函数即可,测试代码在http://download.csdn.net/detail/qq1134993111/6227899

ImageConverter.h

/*
转换图片格式  GDI+支持的格式
*/
#pragma once
#include <wtypes.h>
#include <guiddef.h>
#include <string>
using namespace std;
#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus")

//获取format对应类型的图片解码器的CLSID
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
/*
wstrImageSrcPath 源图片文件全路径(包括扩展名)
wstrImageDesPath 转换后文件存放全路径(包括括展名)
wstrFormatType   转换参数,例如:L"image/png" 、L"image/bmp" 等等。要和wstrImageDesPath路径中的图像格式一样
返回值为true表示成功
*/
bool ImageConvert(wstring wstrImageSrcPath,wstring wstrImageDesPath,wstring wstrFormatType);


ImageConverter.cpp

#include "ImageConverter.h"

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT  num = 0;          // number of image encoders
UINT  size = 0;         // size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

//2.获取GDI+支持的图像格式编码器种类数以及ImageCodecInfo数组的存放大小
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1;  // Failure

//3.为ImageCodecInfo数组分配足额空间
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1;  // Failure

//4.获取所有的图像编码器信息
GetImageEncoders(num, size, pImageCodecInfo);

//5.查找符合的图像编码器的Clsid
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;  // Success
}
}

//6.释放步骤3分配的内存
free(pImageCodecInfo);
return -1;  // Failure
}

bool ImageConvert(wstring wstrImageSrcPath,wstring wstrImageDesPath,wstring wstrFormatType)
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;

//1.初始化GDI+,以便后续的GDI+函数可以成功调用
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

CLSID   encoderClsid;
Status  stat;

//7.创建Image对象并加载图片
Image* image = new Image(wstrImageSrcPath.c_str());

// Get the CLSID of the  wstrFormatType  Corresponding picture type encoder. 获取wstrFormatType对应类型的图片解码器的CLSID
GetEncoderClsid(wstrFormatType.c_str(), &encoderClsid);

//8.调用Image.Save方法进行图片格式转换,并把步骤3)得到的图像编码器Clsid传递给它
stat = image->Save(wstrImageDesPath.c_str(), &encoderClsid, NULL);

bool bRet;
if(stat == Ok)
bRet=true;
else
bRet=false;

//9.释放Image对象
delete image;
//10.清理所有GDI+资源
GdiplusShutdown(gdiplusToken);

return bRet;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: