Top-Down 与 Bottom-Up DIB
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
如果你不熟悉图形编程,你可能希望位图将安排在内存中,以便图像的上一行出现在缓冲区的开头,后跟下一行,依此类推。 但是,这不一定是这种情况。 在 Windows 中,独立于设备的位图(DIB)可以放在内存中,采用两个不同的方向(从下到上和从上到下)。
在自下而上 DIB 中,图像缓冲区以像素底行开头,后跟下一行,依此类推。 图像的上一行是缓冲区中的最后一行。 因此,内存中的第一个字节是图像的左下角像素。 在 GDI 中,所有 DIB 都是自下而上。 下图显示了自下而上 DIB 的物理布局。
在从上到下 DIB 中,行的顺序是反向的。 图像的上一行是内存中的第一行,后跟下一行。 图像的下一行是缓冲区中的最后一行。 使用从上到下 DIB 时,内存中的第一个字节是图像的左上角像素。 DirectDraw 使用自上而下 DIB。 下图显示了从上到下 DIB 的物理布局:
对于 RGB DIB,图像方向由 BITMAPINFOHEADER 结构的 biHeight 成员指示。 如果 biHeight 为正,则图像为自下而上。 如果 biHeight 为负值,则图像是从上到下。
YUV 格式的 DIB 始终从上而下,并且忽略 biHeight 成员的符号。 解码器应提供具有正 biHeight的 YUV 格式,但它们还应接受具有负 biHeight 的 YUV 格式并忽略该符号。
此外,任何使用 biCompression 成员中 FOURCC 的 DIB 类型都应将其 biHeight 表示为正数,因为 FOURCC 本身标识了任何兼容筛选器应理解其图像方向的压缩方案。
相关主题