gpt4 book ai didi

c++ - GDI+ 是否有标准图像编码器 CLSID?

转载 作者:可可西里 更新时间:2023-11-01 15:19:21 24 4
gpt4 key购买 nike

GDI+ Image::Save方法需要一个 CLSID 参数来指定要使用的编码器。文档指向 some sample code用于获取与特定 MIME 类型关联的编码器,例如 image/jpeg 或 image/png。但是,我对复制半页函数只是为了支持单行调试辅助的想法犹豫不决,我将中间结果保存到磁盘。

标准编码器不应该有一个标准 CLSID 列表吗?我在哪里可以找到这样的列表?我一直无法通过搜索 Microsoft 的包含文件找到一个。

最佳答案

没有一个。我认为他们希望编解码器列表可扩展并支持插件,但从未解决过。鉴于他们在相当长的一段时间内没有对 GDI+ 进行任何更改,他们很可能不会很快更改。您可能可以根据 Gdiplus::GetImageEncoders 的枚举生成自己的硬编码列表。

即:

image/bmp  : {557cf400-1a04-11d3-9a73-0000f81ef32e}
image/jpeg : {557cf401-1a04-11d3-9a73-0000f81ef32e}
image/gif : {557cf402-1a04-11d3-9a73-0000f81ef32e}
image/tiff : {557cf405-1a04-11d3-9a73-0000f81ef32e}
image/png : {557cf406-1a04-11d3-9a73-0000f81ef32e}

这是我经常在项目之间剪切和粘贴的函数,用于获取编码器的 CLSID。您可以将其修改为表查找。

#include <windows.h>
#include <gdiplus.h>
#include <string>
#include <vector>

HRESULT GetGdiplusEncoderClsid(const std::wstring& format, GUID* pGuid)
{
HRESULT hr = S_OK;
UINT nEncoders = 0; // number of image encoders
UINT nSize = 0; // size of the image encoder array in bytes
std::vector<BYTE> spData;
Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::Status status;
bool found = false;

if (format.empty() || !pGuid)
{
hr = E_INVALIDARG;
}

if (SUCCEEDED(hr))
{
*pGuid = GUID_NULL;
status = Gdiplus::GetImageEncodersSize(&nEncoders, &nSize);

if ((status != Gdiplus::Ok) || (nSize == 0))
{
hr = E_FAIL;
}
}

if (SUCCEEDED(hr))
{

spData.resize(nSize);
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)&spData.front();
status = Gdiplus::GetImageEncoders(nEncoders, nSize, pImageCodecInfo);

if (status != Gdiplus::Ok)
{
hr = E_FAIL;
}
}

if (SUCCEEDED(hr))
{
for (UINT j = 0; j < nEncoders && !found; j++)
{
if (pImageCodecInfo[j].MimeType == format)
{
*pGuid = pImageCodecInfo[j].Clsid;
found = true;
}
}

hr = found ? S_OK : E_FAIL;
}

return hr;
}


int main()
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

GUID guidBmp = {};
GUID guidJpeg = {};
GUID guidGif = {};
GUID guidTiff = {};
GUID guidPng = {};

GetGdiplusEncoderClsid(L"image/bmp", &guidBmp);
GetGdiplusEncoderClsid(L"image/jpeg", &guidJpeg);
GetGdiplusEncoderClsid(L"image/gif", &guidGif);
GetGdiplusEncoderClsid(L"image/tiff", &guidTiff);
GetGdiplusEncoderClsid(L"image/png", &guidPng);

return 0;
}

关于c++ - GDI+ 是否有标准图像编码器 CLSID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5345803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com