一:首先配置好GDI+环境,引入相关文件:
//使用GDI+
#include "Includes/GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib,"lib/gdiplus.lib")
二:初始化
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
同时,在程序结束记得释放:
GdiplusShutdown(gdiplusToken);
三:添加GetImageCLSID函数
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在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;
}
四:添加图片格式转换函数
BOOL ImageConvert(CString strLoadFile,CString strSaveFile)
{
CString strLoadExt,strSaveExt;//获取打开和保存的图像文件后缀名
int nLenLoadExt = strLoadFile.ReverseFind('.');
int nLenSaveExt = strSaveFile.ReverseFind('.');
strLoadExt = strLoadFile.Right(strLoadFile.GetLength()-nLenLoadExt-1);
strSaveExt = strSaveFile.Right(strSaveFile.GetLength()-nLenSaveExt-1);
strLoadExt.MakeLower();
strSaveExt.MakeLower();
//判断文件后缀名是否正确
if (strSaveExt!="bmp"&&strSaveExt!="jpg"&&strSaveExt!="jpeg"&&strSaveExt!="png"/
&&strSaveExt!="tiff"&&strSaveExt!="gif")
{
AfxMessageBox("所保存的文件格式不正确!");
return FALSE;
}
if("jpg" == strSaveExt)
strSaveExt = "jpeg";
// AfxMessageBox(strLoadExt+"/n"+strSaveExt);
CLSID encoderClsid ;
Image *image = NULL;
//将常规字符转化为宽字符
WCHAR WcLoadName[1024];
WCHAR WcSaveName[1024];
WCHAR WcLoadExt[256];
WCHAR WcSaveExt[256];
wcsset(WcSaveName,0);
wcsset(WcLoadName,0);
::MultiByteToWideChar(CP_ACP,0,strLoadFile.GetBuffer(0),strLoadFile.GetLength()+1,WcLoadName,1024);
::MultiByteToWideChar(CP_ACP,0,strSaveFile.GetBuffer(0),strSaveFile.GetLength()+1,WcSaveName,1024);
::MultiByteToWideChar(CP_ACP,0,strLoadExt.GetBuffer(0),strLoadExt.GetLength()+1,WcLoadExt,256);
::MultiByteToWideChar(CP_ACP,0,strSaveExt.GetBuffer(0),strSaveExt.GetLength()+1,WcSaveExt,256);
//加载文件
image = Bitmap::FromFile(WcLoadName,TRUE);
if (image==NULL)
{
AfxMessageBox("Faild to load file!");
return FALSE;
}
WCHAR Wctype[1024]=L"image/";
wcscat(Wctype,WcSaveExt);
///读图片CLSID///
GetImageCLSID(Wctype,&encoderClsid);
//保存图片
if(Ok==image->Save(WcSaveName,&encoderClsid,NULL))
AfxMessageBox("Save OK!");
delete image;
return TRUE;
}
注:strLoadFile为原图片文件路径,strSaveFile为转换后的图片欲保存的文件路径,使用时只需调用ImageConvert函数即可.