Top-Down与Bottom-Up DIB

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

如果你不熟悉图形编程,你可能希望位图在内存中排列,以便图像的上一行显示在缓冲区的开头,后跟下一行,依此类推。 但是,情况不一定如此。 在 Windows 中,可以将与设备无关的位图 (DIB) 放在内存中,采用两个不同的方向(自下而上和自上而下)。

在自下而上的 DIB 中,图像缓冲区从底部的像素行开始,然后是上一行,依此类推。 图像的上一行是缓冲区中的最后一行。 因此,内存中的第一个字节是图像的左下角像素。 在 GDI 中,所有 DDB 都是自下而上的。 下图显示了自下而上的 DIB 的物理布局。

自下而上 dib

在自上而下的 DIB 中,行的顺序将颠倒。 图像的上一行是内存中的第一行,然后是下一行。 图像的底部行是缓冲区中的最后一行。 使用自上而下 DIB 时,内存中的第一个字节是图像的左上角像素。 DirectDraw 使用自上而下的 DDB。 下图显示了自上而下 DIB 的物理布局:

自上而下 dib

对于 RGB DIB,图像方向由 BITMAPINFOHEADER 结构的 biHeight 成员指示。 如果 biHeight 为正值,则图像为自下而上。 如果 biHeight 为负值,则图像为自上而下。

采用 YUV 格式的 DIB 始终自上而下,并且忽略 biHeight 成员的符号。 解码器应提供具有正 biHeight 的 YUV 格式,但它们还应接受具有负 biHeight 的 YUV 格式,并忽略符号。

此外,任何在 biCompression 成员中使用 FOURCC 的 DIB 类型都应将其 biHeight 表示为正数,无论其方向是什么,因为 FOURCC 本身标识的压缩方案,其图像方向应由任何兼容的筛选器理解。

使用视频帧