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::CreateDecoderGUID_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);