2

Windows Imaging Component 用于解码 heif 图像。但是,成功解码图像需要来自 Microsoft 商店的额外应用程序(heif 图像扩展、hevc 视频扩展)。

没有它们,WIC api 将返回空白图像。现在我希望能够以编程方式确定是否可以正确解码 heif 文件。

我试图使用应该是WIC_HEIF_Decoder的DXVA Checker来定位所需解码器类型的存在。但我找不到它在任何地方注册。

在此处输入图像描述

有一个 GUID 键,但是CLSID_WICHeifDecoder记录在这里,我认为即使缺少解码器也可以在系统中注册。

有谁知道如何做到这一点?

4

2 回答 2

4

如果您计划使用 WIC 解码器,您应该使用 WIC API 而不是 Media Foundation API 来检查可用性,即使两个解码器都已知 - 目前 - 打包在一起并且属于同一个 Windows Store 应用程序(扩展) .

您应该能够使用IWICImagingFactory::CreateComponentEnumerator枚举解码器并确定 HEIF 是否在可用的解码器中。

微软 HEIF 解码器

  • 类标识符:CLSID_WICHeifDecoder
  • 签名状态:WICComponentSigned
  • 作者:微软
  • 供应商标识符:{F0E749CA-EDEF-4589-A73A-EE0E626A2A2B}
  • 版本:1.0.0.0
  • 规格版本:1.0.0.0
  • 友好名称:Microsoft HEIF 解码器
  • IWICBitmapCodecInfo:
    • 容器格式:GUID_ContainerFormatHeif
    • 像素格式:GUID_WICPixelFormat32bppBGR
    • 色彩管理版本:1.0.0.0
    • MIME 类型:image/heic,image/heif,image/avci,image/heic-sequence,image/heif-sequence,image/avcs,image/avif,image/avif-sequence
    • 文件扩展名:.heic、.heif、.avci、.heics、.heifs、.avcs、.avif、.avifs
    • 图案:576

您可能更喜欢使用IWICImagingFactory::CreateDecoderwith ,GUID_ContainerFormatHeif因为您应该对解码能力而不是特定解码器实现更感兴趣。

使用注册表查询或直接CoCreateInstance调用检查特定的 CLSID 很简单,但对于指定的任务没有多大意义。

于 2020-10-10T15:28:31.720 回答
1

由于 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);
于 2020-10-12T18:11:44.733 回答