C++ GDI+调用

封装了一个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 == 0)   
        return false; // Failure   
   //为ImageCodecInfo数组分配足额空间
   Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
   //获取所有的图像编码器信息
   Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
   bool flag = false;
   //查找符合的图像编码器的Clsid
   for (UINT ix = 0; !flag && ix < num; ++ix) 
   {
     //忽略大小写进行字符串比较
     if ( _wcsicmp(pImageCodecInfo[ix].MimeType, format) == 0) 
     {
       *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();

 

posted on   梦琪小生  阅读(1135)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示