利用GDI+实现常见图片格式任意转换的函数

一:首先配置好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函数即可.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值