WIC HEIF HEIC 图像解码 C++
WIC HEIF HEIC image decoding C++
Windows Imaging Component 用于解码heif图像。但是,成功解码图像需要来自 Microsoft 商店的额外应用程序(heif 图像扩展、hevc 视频扩展)。
没有他们 WIC api returns 空白图像。现在我希望能够以编程方式确定 heif 文件是否可以正确解码。
我试图使用 DXVA Checker 来定位所需的解码器类型,它应该是 WIC_HEIF_Decoder。但是我找不到它在任何地方注册。
有一个 GUID 密钥但是 CLSID_WICHeifDecoder 记录了 here 我认为即使解码器丢失也可以在系统中注册。
有人知道怎么做吗?
如果您计划使用 WIC 解码器,您应该使用 WIC API 来检查可用性,而不是 Media Foundation API,即使这两个解码器目前都已知是打包在一起并属于同一个 Windows Store 应用程序(扩展)。
您应该能够使用 IWICImagingFactory::CreateComponentEnumerator
枚举解码器并确定 HEIF 是否在可用的解码器中。
Microsoft HEIF Decoder
- Class Identifier: CLSID_WICHeifDecoder
- Signing Status: WICComponentSigned
- Author: Microsoft
- Vendor Identifier: {F0E749CA-EDEF-4589-A73A-EE0E626A2A2B}
- Version: 1.0.0.0
- Spec Version: 1.0.0.0
- Friendly Name: Microsoft HEIF Decoder
- IWICBitmapCodecInfo:
- Container Format: GUID_ContainerFormatHeif
- Pixel Formats: GUID_WICPixelFormat32bppBGR
- Color Management Version: 1.0.0.0
- MIME Types: image/heic,image/heif,image/avci,image/heic-sequence,image/heif-sequence,image/avcs,image/avif,image/avif-sequence
- File Extensions: .heic,.heif,.avci,.heics,.heifs,.avcs,.avif,.avifs
- Patterns: 576
您可能更喜欢将 IWICImagingFactory::CreateDecoder
与 GUID_ContainerFormatHeif
结合使用,因为您应该对解码能力更感兴趣,而不是对特定的解码器实现感兴趣。
检查特定的 CLSID 很简单,使用注册表查询或直接 CoCreateInstance
调用,但它对指定的任务没有多大意义。
由于 HEIF 解码器仍可在 Windows 上识别,但无法对其进行解码,因此这是最好的 hack imo:
为了解码 HEIF 图像,应该在机器上安装 HEVC 视频扩展。
所以正确的检查是看是否有匹配HEVC输入的解码类型
MFStartup(MF_VERSION);
IMFActivate** activate {};
unsigned int count {};
// Set the HEVC GUID
MFT_REGISTER_TYPE_INFO input;
input.guidMajorType = MFMediaType_Video;
input.guidSubtype = MFVideoFormat_HEVC;
// Get all available output types for HEVC input
MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SYNCMFT, &input, nullptr, &activate, &count);
// Release interface pointers
for (size_t i = 0; i < count; i++) {
activate[i]->Release();
}
CoTaskMemFree(activate);
MFShutdown();
return (count > 0);
Windows Imaging Component 用于解码heif图像。但是,成功解码图像需要来自 Microsoft 商店的额外应用程序(heif 图像扩展、hevc 视频扩展)。
没有他们 WIC api returns 空白图像。现在我希望能够以编程方式确定 heif 文件是否可以正确解码。
我试图使用 DXVA Checker 来定位所需的解码器类型,它应该是 WIC_HEIF_Decoder。但是我找不到它在任何地方注册。
有一个 GUID 密钥但是 CLSID_WICHeifDecoder 记录了 here 我认为即使解码器丢失也可以在系统中注册。
有人知道怎么做吗?
如果您计划使用 WIC 解码器,您应该使用 WIC API 来检查可用性,而不是 Media Foundation API,即使这两个解码器目前都已知是打包在一起并属于同一个 Windows Store 应用程序(扩展)。
您应该能够使用 IWICImagingFactory::CreateComponentEnumerator
枚举解码器并确定 HEIF 是否在可用的解码器中。
Microsoft HEIF Decoder
- Class Identifier: CLSID_WICHeifDecoder
- Signing Status: WICComponentSigned
- Author: Microsoft
- Vendor Identifier: {F0E749CA-EDEF-4589-A73A-EE0E626A2A2B}
- Version: 1.0.0.0
- Spec Version: 1.0.0.0
- Friendly Name: Microsoft HEIF Decoder
- IWICBitmapCodecInfo:
- Container Format: GUID_ContainerFormatHeif
- Pixel Formats: GUID_WICPixelFormat32bppBGR
- Color Management Version: 1.0.0.0
- MIME Types: image/heic,image/heif,image/avci,image/heic-sequence,image/heif-sequence,image/avcs,image/avif,image/avif-sequence
- File Extensions: .heic,.heif,.avci,.heics,.heifs,.avcs,.avif,.avifs
- Patterns: 576
您可能更喜欢将 IWICImagingFactory::CreateDecoder
与 GUID_ContainerFormatHeif
结合使用,因为您应该对解码能力更感兴趣,而不是对特定的解码器实现感兴趣。
检查特定的 CLSID 很简单,使用注册表查询或直接 CoCreateInstance
调用,但它对指定的任务没有多大意义。
由于 HEIF 解码器仍可在 Windows 上识别,但无法对其进行解码,因此这是最好的 hack imo:
为了解码 HEIF 图像,应该在机器上安装 HEVC 视频扩展。 所以正确的检查是看是否有匹配HEVC输入的解码类型
MFStartup(MF_VERSION);
IMFActivate** activate {};
unsigned int count {};
// Set the HEVC GUID
MFT_REGISTER_TYPE_INFO input;
input.guidMajorType = MFMediaType_Video;
input.guidSubtype = MFVideoFormat_HEVC;
// Get all available output types for HEVC input
MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SYNCMFT, &input, nullptr, &activate, &count);
// Release interface pointers
for (size_t i = 0; i < count; i++) {
activate[i]->Release();
}
CoTaskMemFree(activate);
MFShutdown();
return (count > 0);