BITMAPINFOHEADER 结构 (wingdi.h)

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

BITMAPINFOHEADER 结构包含有关与设备无关的位图的尺寸和颜色格式的信息, (DIB) 。

注意 GDI 文档中还介绍了此结构。 但是,视频数据的语义与用于 GDI 的语义略有不同。 如果使用此结构来描述视频数据,请使用此处提供的信息。
 

语法

typedef struct tagBITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
} BITMAPINFOHEADER, *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

成员

biSize

指定结构所需的字节数。 此值不包括颜色表的大小或颜色掩码的大小(如果它们追加到结构的末尾)。 请参阅“备注”。

biWidth

指定位图的宽度(以像素为单位)。 有关计算位图步幅的信息,请参阅备注。

biHeight

指定位图的高度(以像素为单位)。

  • 对于未压缩的 RGB 位图,如果 biHeight 为正值,则位图为自下而上的 DIB,原点位于左下角。 如果 biHeight 为负数,则位图为自上而下 DIB,原点位于左上角。
  • 对于 YUV 位图,无论 biHeight 的符号如何,位图始终是自上而下的。 解码器应提供具有正 biHeight 的 YUV 格式,但为了向后兼容,它们应接受具有正或负 biHeight 的 YUV 格式。
  • 对于压缩格式,无论图像方向如何, biHeight 都必须是正数。

biPlanes

指定目标设备的平面数。 此值必须设置为 1。

biBitCount

指定每像素 (bpp) 位数。 对于未压缩格式,此值是每像素的平均位数。 对于压缩格式,此值是解码图像后未压缩图像的隐含位深度。

biCompression

对于压缩视频和 YUV 格式,此成员是 FOURCC 代码,以小端顺序指定为 DWORD 。 例如,YUYV 视频具有 FOURCC“VYUY”或0x56595559。 有关详细信息,请参阅 FOURCC 代码

对于未压缩的 RGB 格式,可以使用以下值:

含义
BI_RGB
未压缩的 RGB。
BI_BITFIELDS
带颜色掩码的未压缩 RGB。 适用于 16-bpp 和 32-bpp 位图。
 

有关更多信息,请参见备注。 请注意, BI_JPGBI_PNG 不是有效的视频格式。

对于 16 bpp 位图,如果 biCompression 等于 BI_RGB,则格式始终为 RGB 555。 如果 biCompression 等于 BI_BITFIELDS,则格式为 RGB 555 或 RGB 565。 使用 AM_MEDIA_TYPE 结构中的子类型 GUID 来确定特定的 RGB 类型。

biSizeImage

指定图像的大小(以字节为单位)。 对于未压缩的 RGB 位图,可以将其设置为 0。

biXPelsPerMeter

指定位图的目标设备的水平分辨率(以像素/米为单位)。

biYPelsPerMeter

指定位图的目标设备的垂直分辨率(以每米像素为单位)。

biClrUsed

指定位图实际使用的颜色表中的颜色索引数。 有关更多信息,请参见备注。

biClrImportant

指定被认为对显示位图很重要的颜色索引数。 如果此值为零,则所有颜色都很重要。

注解

颜色表

BITMAPINFOHEADER 结构后跟调色板条目或颜色掩码数组。 规则取决于 biCompression 的值。
  • 如果 biCompression 等于 BI_RGB 并且位图使用 8 bpp 或更少,则位图具有紧跟 BITMAPINFOHEADER 结构的颜色表。 颜色表由 RGBQUAD 值数组组成。 数组的大小由 biClrUsed 成员提供。 如果 biClrUsed 为零,则数组包含给定 bitdepth 的最大颜色数;即 2^biBitCount 颜色。
  • 如果 biCompression 等于 BI_BITFIELDS,则位图使用三个 DWORD 颜色掩码 (红色、绿色和蓝色,) 指定像素的字节布局。 每个掩码中的 1 位表示像素中该颜色的位。
  • 如果 biCompression 是视频 FOURCC,则视频格式暗示存在颜色表。 当位深度为 8 bpp 或更少时,不应假定存在颜色表。 但是,某些旧组件可能假定存在颜色表。 因此,如果要分配 BITMAPINFOHEADER 结构,建议在位深度为 8 bpp 或更低时为颜色表分配空间,即使未使用颜色表也是如此。
BITMAPINFOHEADER 后跟一个颜色表或一组颜色掩码时,可以使用 BITMAPINFO 结构来引用颜色蒙板的颜色表。 BITMAPINFO 结构定义如下:
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD          bmiColors[1];
} BITMAPINFO;

如果将 BITMAPINFOHEADER 强制转换为 BITMAPINFO则 bmiHeader 成员引用 BITMAPINFOHEADER,bmiColors 成员引用颜色表中的第一个条目或第一个颜色掩码。

请注意,如果位图使用颜色表或颜色掩码,则整个格式结构的大小 (BITMAPINFOHEADER 加上颜色信息) 不等于 sizeof(BITMAPINFOHEADER)sizeof(BITMAPINFO)。 必须计算每个实例的实际大小。

计算 Surface Stride

在未压缩的位图中,步幅是从一行像素的开头到下一行开头所需的字节数。 图像格式定义图像的最小步幅。 此外,图形硬件可能需要为包含图像的图面提供更大的步幅。

对于未压缩的 RGB 格式,最小步幅始终是图像宽度(以字节为单位),向上舍入到最接近的 DWORD。 若要计算步幅和图像大小,可以使用 GDI_DIBWIDTHBYTES 和/或 GDI_DIBSIZE 宏或以下公式:

stride = ((((biWidth * biBitCount) + 31) & ~31) >> 3);
biSizeImage = abs(biHeight) * stride;

对于 YUV 格式,没有用于计算最小步幅的一般规则。 必须了解特定 YUV 格式的规则。 有关最常见的 YUV 格式的说明,请参阅 推荐的视频呈现 8 位 YUV 格式

解码器和视频源应提供格式,其中 biWidth 是图像的宽度(以像素为单位)。 如果视频呈现器需要大于默认图像步幅的表面步幅,它会通过设置以下值来修改建议的媒体类型:

  • 它将 biWidth 设置为等于表面步幅(以像素为单位)。
  • 它将 VIDEOINFOHEADERVIDEOINFOHEADER2 结构的 rcTarget 成员设置为等于图像宽度(以像素为单位)。
然后,视频呈现器通过在上游引脚上调用 IPin::QueryAccept 来建议修改后的格式。 有关此机制的详细信息,请参阅 动态格式更改

如果图像缓冲区中有填充,则永远不要取消引用已为填充保留的内存中的指针。 如果已在视频内存中分配图像缓冲区,则填充可能不是可读内存。

要求

   
标头 wingdi.h

另请参阅

DirectShow 结构

VIDEOINFOHEADER 结构

VIDEOINFOHEADER2 结构

使用视频帧