使用WIC(Windows映像组件)时遇到的问题



最近,我使用WIC解析GIF。代码已经写好,它可以在win10和win7上完美运行,但在WinXP上失败了。我排除了很长一段时间,终于在这行代码上找到了原因:

// pBitmapFrameDecode is an IWICBitmapFrameDecode
hr = pBitmapFrameDecode->GetMetadataQueryReader(&pFrameMetadataQueryReader);
if (hr == WINCODEC_ERR_UNSUPPORTEDOPERATION) MessageBoxA(NULL, "WINCODEC_ERR_UNSUPPORTEDOPERATION", "Error!", MB_OK);

在这行代码中,GetMetadataQueryReader失败,导致GetMetadataByName在以下代码中失败。我觉得很奇怪,所以我查看了MSDN。IWICBitmapFrameDecode::GetMetadataQueryReader

但我发现我的XP电脑符合MSDN中编写的最低配置要求(SP3(。更奇怪的是,该函数返回WINCODEC_ERR_UNSUPPORTEDOPERATION。这太奇怪了。起初,我认为这是我自己的设备问题,所以我借了几台XP电脑,并在它们上运行我的代码。它们都返回WINCODEC_ERR_UNSUPPORTEDOPERATION。MSDN错了吗?

MSDN不是"错误";,但有些不完整。

大多数WIC通常只是代码和解码器/编码器(特定于给定文件格式的编解码器(之间的中介。

在XP上支持GetMetadataQueryReader这一事实并不意味着XP上的给定编解码器支持与其他Windows版本上的相同编解码器具有相同级别的元数据。图像元数据可能非常复杂和深入(并且可以及时改进规范(。

如果你去这个MSDN页面:Windows 7的新功能,你会读到:

JPEG、PNG和GIF的扩展元数据支持:

在Windows7中,WIC扩展了对JPEG、PNG和GIF图像。

  • 添加了对GIF和GIF动画属性的支持

因此,这可能意味着您正在接触具有不受支持的元数据属性的GIF文件,XP(Vista或7(之后添加了对这些属性的支持。

最新更新