如何从WIC解码器确定自上而下/自下而上?
How to determine top-down/bottom-up from WIC decoder?
我正在使用WIC(Windows映像组件(来解码图像文件并访问像素数据。 我正在尝试找出像素顺序(即自下而上或自上而下(。
我使用IWICImagingFactory::CreateDecoderFromFileName
来创建解码器,从中获取(第一(帧(IWICBitmapFrameDecode
(。 对于帧,我使用GetPixelFormat
和GetSize
来计算缓冲区大小,最后我使用CopyPixels
将解码的像素数据放入缓冲区中。
这适用于各种 JPEG 文件,为我提供自上而下的像素行,并且像素按 BGRX 顺序 (GUID_WICPixelFormat32bppBGR
(。
但是,当我尝试使用 GIF 文件时,像素行是自下而上的顺序。 报告的像素格式是RGBA(GUID_WICPixelFormat32bppRGBA
(,但基本事实显示通道顺序是BGRA(每个32位像素的低字节中的蓝色,就像JPEG一样(。
我的主要问题:有没有办法查询像素数据的自上而下/自下而上的方向?
我发现了一个类似的问题,询问使用 JPEG 源时的旋转,答案是查询 EXIF 数据以了解图像是否旋转。 但是EXIF不与GIF一起使用。所以我想知道我是否应该假设像素总是自下而上的,除了那些确实具有 EXIF 方向的像素。更新 6/25/2020不,JPEG 方向是中性的,GIF 没有方向信息,但 MS Paint 和其他程序可以以正确的方向打开文件。
我的第二个问题:GIF 解码器中不正确的通道顺序 (RGB/BGR( 是怎么回事?
不仅如此,WIC文档说GIF解码器应该将索引返回到颜色表(GUID_WICPixelFormat8bppIndexed
(而不是实际的像素值。 我的机器上的某些软件是否有可能安装自己的有缺陷的 GIF 解码器来取代 Windows 10 附带的解码器?
若要查询照片方向以获取支持它的格式,应使用 System.Photo.Orientation 照片元数据策略(或文件格式特定的元数据查询路径之一(使用 IWICMetadataQueryReader 接口。
至于GetPixelFormat((报告"不正确"的像素格式,它就在备注部分:
此方法返回的像素格式不一定是图像存储的像素格式。编解码器可以执行从存储像素格式到输出像素格式的格式转换。
Windows 下图像位图的本机字节顺序是 BGRA,因此这就是您从解码器获得的内容。如果你想要不同格式的图像,你需要使用IWICImagingFactory::CreateFormatConverter((创建一个格式转换器,并在复制之前转换图像数据。
最后,GIF 没有方向元数据,因为它始终从上到下编码。您获得垂直反转图像的最可能原因是因为您直接从解码器读取它 - 尝试在转换器上调用CopyPixels()
。
- 最小硬币更换问题(自上而下方法)
- 最长的公共子序列自上而下
- 如何从WIC解码器确定自上而下/自下而上?
- 此动态编程问题的自上而下方法
- 不带连续 1 的位字符串,使用自上而下的 DP
- 此解决方案中生成更改的方法数量(自上而下)有什么问题?
- 自上而下的动态规划与递归朴素解决方案.检查运行时执行
- C++自上而下的金字塔
- 自上而下的递归下降解析:依靠尾声优化
- OPENCV是否有一个软件包将3D点转换为2D自上而下的视图
- C中的内存分配过程?它是向下还是自下而上的方法
- "Poor Man's Reflection"(又名自下而上的反射)C++
- 用于简单 2D 自上而下的车辆碰撞物理的算法
- 自上而下的编译..当变量相互使用时,在哪里定义变量
- 如何将递归解决方案转换为自下而上或自上而下的解决方案
- 在C++中模拟自上而下添加时出现分段错误
- 自上而下张开树的 makeEmpty() 的时间复杂度
- 奶牛的待遇-自下而上的动态编程
- 硬币变化自下而上的动态规划
- 自上而下的视角瞄准坦克炮塔用鼠标