c++ - 使用 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 的扩展元数据支持:
在 Windows 7 中,WIC 扩展了对 JPEG、PNG 和 GIF 图像的元数据支持。
- 添加了对动画 GIF 和 GIF 属性的支持。
因此,这可能意味着您正在触摸具有不受支持的元数据属性的 GIF 文件,在 XP(Vista 或 7)之后添加了对这些属性的支持。
推荐阅读
- leaflet - 如何将用户名:密码传递给 Leaflet 中的基本身份验证外部 WMS
- javascript - 使用本机 javascript 实现 lodash _.has 的简单方法是什么?
- android - 检查 Google Login(Android) 是登录还是注册?
- javascript - 从类方法访问 javascript 中的类属性
- python-3.x - 如何用 tkinter Python 将 2 个标签分开很远?
- c# - 在 asp.net 中使用 ajax 调用更新下拉列表
- html - Css Animations:尝试上下移动 div 元素并同时旋转其中的 img 元素失败
- azure - Azure Kubernetes 上的 Apache Ignite 连接错误
- docker - 从另一个容器访问 Neo4J
- flutter - 我可以手动更改屏幕方向吗?