封装了一个GDI+的使用类

GdiPluss.h

#pragma once
#include <comdef.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib") class CGdiPluss
{
public:
CGdiPluss(void);
~CGdiPluss(void); public:
enum ImageFormat
{
//Jpeg图片格式
Jpeg,
//Png图片格式
Png,
//Bmp图片格式
Bmp,
//Gif图片格式
Gif,
//Tiff图片格式
Tiff
} ; public:
//打开GDI+
void OpenGdiPlus();
//关闭GDI+
void CloseGdiPlus();
//获取Image的格式信息CLSID
//参数:format,image的图片格式(image/png | image/bmp | image/jpeg | image/gif | image/tiff)
//参数:CLSID,保存格式的信息
bool GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
//图片保存
//参数:src,保存的图片
//参数:filename,保存的路径
//参数:format,图片保存的格式
bool SaveImage(Bitmap* src,const WCHAR* filename, ImageFormat format); private:
ULONG_PTR m_gdiplus_token; };

GdiPluss.cpp

#include "GdiPluss.h"

CGdiPluss::CGdiPluss(void)
{
} CGdiPluss::~CGdiPluss(void)
{
} void CGdiPluss::OpenGdiPlus()
{
::GdiplusStartupInput startinput;
::GdiplusStartup(&m_gdiplus_token,&startinput,NULL);
} void CGdiPluss::CloseGdiPlus()
{
::GdiplusShutdown(m_gdiplus_token);
} bool CGdiPluss::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num, size;
//获取GDI+支持的图像格式编码器种类数以及ImageCodecInfo数组的存放大小
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == )
return false; // Failure
//为ImageCodecInfo数组分配足额空间
Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
//获取所有的图像编码器信息
Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
bool flag = false;
//查找符合的图像编码器的Clsid
for (UINT ix = ; !flag && ix < num; ++ix)
{
//忽略大小写进行字符串比较
if ( _wcsicmp(pImageCodecInfo[ix].MimeType, format) == )
{
*pClsid = pImageCodecInfo[ix].Clsid;
flag = true;
}
}
free(pImageCodecInfo);
return flag;
} bool CGdiPluss::SaveImage(Bitmap* src,const WCHAR* filename, ImageFormat format)
{
CLSID clsid;
WCHAR* _format;
switch(format)
{
case Jpeg:
_format=L"image/jpeg";
break;
case Png:
_format=L"image/png";
break;
case Bmp:
_format=L"image/bmp";
break;
case Gif:
_format=L"image/gif";
break;
case Tiff:
_format=L"image/tiff";
break;
default:
return false;
break;
}
if(!GetEncoderClsid(_format,&clsid))
return false;
src->Save(filename,&clsid);
return true;
}

使用很简单:

::CGdiPluss m_gdi;

开启

m_gdi.OpenGdiPlus();

关闭
m_gdi.CloseGdiPlus();

最新文章

  1. Android中的AlertDialog使用示例四(多项选择确定对话框)
  2. difference bewteen *args and **args in python?
  3. SQLServer 事务隔离级别与锁的申请和释放
  4. 【微信Java开发 --番外篇】错误解析
  5. 看上去很美 国内CDN现状与美国对比
  6. 原生javascript模仿win8等待进度条。
  7. [转]UINavigationController 返回的方法汇总
  8. selenium简单代码入门
  9. MFC可编辑的ListCtrl
  10. 如何自定义echarts主题
  11. bzoj4028: [HEOI2015]公约数数列
  12. (原)ubuntu上安装Torch7及nn及dpnn
  13. 由 “无法使用从远程表选择的&#160;lob&#160;定位符” 错误而引导出来的一系列问题解决方案
  14. Python全栈学习_作业集锦(持续更新)
  15. CMake set 语法
  16. 利用MySQL游标进行计算排名
  17. 将json转换为数据结构体
  18. vsftpd上传文件出现553 Could not create file错误解决方法
  19. Linux下SVN配置hook经验总结
  20. 记一款bug管理系统(bugdone.cn)的开发过程(3) - 永久免费化

热门文章

  1. 关于JavaScript中name的意义冲突
  2. C++11新特性(1) 右值引用
  3. 目的可疑,但方法非常值得学习的书——leo鉴书56
  4. GO1.6语言学习笔记3-工具篇(SublimeText 3+GoSublime组合)
  5. Python rjust() 方法
  6. Linux操作系统CentOS7.2发行版本的安装与配置(安装是选择服务器类型)
  7. k8s的容器监测探针
  8. for循环中的break与continue
  9. 链队列的C++实现
  10. canvas.drawBitmap(bitmap, src, dst, paint)