如何从WIC解码器确定自上而下/自下而上?

How to determine top-down/bottom-up from WIC decoder?

本文关键字:自上而下 自下而上 WIC 解码器      更新时间:2023-10-16

我正在使用WIC(Windows映像组件(来解码图像文件并访问像素数据。 我正在尝试找出像素顺序(即自下而上或自上而下(。

我使用IWICImagingFactory::CreateDecoderFromFileName来创建解码器,从中获取(第一(帧(IWICBitmapFrameDecode(。 对于帧,我使用GetPixelFormatGetSize来计算缓冲区大小,最后我使用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()