- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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/
类 ID (GUID) 通常由一系列用短划线分隔的十六进制数字指定,例如{557cf406-1a04-11d3-9a73-0000f81ef32e}。这不是可用于直接初始化 CLSID 结构的文字。
我想知道 CLSID 数据类型到底是什么,因为它在 C++ 中使用,我想在 delphi 中使用它。 什么是 CLSID? 最佳答案 CLSID 是标识 COM 对象的 GUID。为了实例化已注册的
GDI+ Image::Save方法需要一个 CLSID 参数来指定要使用的编码器。文档指向 some sample code用于获取与特定 MIME 类型关联的编码器,例如 image/jpeg 或
问题: 基于 CLSID ,我怎样才能找出它为 IClassFactory::CreateInstance支持 的对象(或接口(interface)) 注意: 目前正在使用 CLSIDFromProg
我遇到过托管 DLL 调用某些非托管 DLL 的情况。我知道非托管 DLL 的 CLSID,有什么方法可以找出包含该 CLSID 的二进制文件吗? 最佳答案 通常,您可以访问: HKEY_LOCAL_
我正在尝试通过 openscada 连接到 OPC 服务器。 我已经知道 MatrikonOPC explorer 给出的 OPC 服务器程序 ID,但连接不工作可能是由于错误的 DCOM 配置。在更
我想在 Windows XP 上获取 Control Panel 和 Add or Remove Programs 的 CLSID。 示例:shell::::{26EE0668-A00A-44D7-9
我想在我的应用程序中使用 LAV 解码器过滤器,但我不知道 clsid。 我在哪里可以找到它?有没有我可以包含的头文件? 我必须手动插入 clsid guid 吗? 最佳答案 最好在您的代码中对 GU
我用过x264 DirectShow filter来自 Monogram 用于解码 h264 avc 视频,我需要创建 intrance 并在 directshow 中向图形添加过滤器,我从 grap
我正在 DirectShow 中开发 MP4 过滤器。我目前正在尝试创建 IBaseFilter 对象,但要求之一是 CoCreateInstance 的 CLSID。 我对这个 ID 的来源感到困惑
我的 CLSID 有点问题。 我有一个(钩子(Hook))函数,它在参数中有一个 REFCLSID。所以我想打印这个参数。 我做到了: LPOLESTR pOleStr; StringFromCLSI
其中一个系统服务在他的日志中报告它已经加载了一些对象。在日志中还提到了加载对象的 CLSID(值为 1CECAF7C-B7A0-4B81-912D-78F202E3F0EA,另请参见屏幕截图: 当然,
我想创建一个小应用程序来从注册表中添加和删除用户定义的上下文菜单条目。为此,我需要以某种方式获取任意 DLL 的 CLSID,以便在编写新条目之前备份以前的条目(如果它们存在)。 尽管 regsrv3
我想从我的 dll 中检索我自己的 dll 的 CSLID。此 CLSID 在我的应用程序的 .rgs 文件中声明。 我正在创建很多 dll,每个都有不同的 CLSID,对我来说很重要的是我可以轻松地
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在解析一些第三方软件“脚本”,它会根据其内容生成一个 GUI 表单,我想在 C# 程序中读取该脚本并生成类似的输出,这是一个示例脚本: BEGIN SECTION Intro BACK
如果我有一个已知的 COM 库(.ocx 文件本身),在 C# 中是否有任何方法可以提取它的 CLSID 信息?基本上,当您添加对文件的引用时,我需要 Visual Studio 添加到其项目文件的文
注意:有关背景信息,请参阅此相关问题:How to get LINQPad to Dump() System.__ComObject references? 我能够使用 IPersist.GetCla
我正在尝试使用 java 运行 Vissim 8(学生版),为此我使用 jacob。现在我不确定我做错了什么,因为我是雅各布的新手。这是我尝试运行的代码: import com.jacob.activ
使用 Windows 10 和 Visual Studio 2013,我按照 Microsoft 传感器 API (https://learn.microsoft.com/en-us/windows/
我是一名优秀的程序员,十分优秀!