BITMAPINFOHEADER 结构 (wingdi.h)

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 格式,可以使用以下值:

Value 含义
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 成员引用 BITMAPINFOHEADERbmiColors 成员引用颜色表中的第一个条目或第一个颜色掩码。

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

计算 Surface Stride

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

对于未压缩的 RGB 格式,最小步幅始终为图像宽度(以字节为单位)向上舍入到最近的 DWORD。 可以使用以下公式来计算步幅:

stride = ((((biWidth * biBitCount) + 31) & ~31) >> 3)

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

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

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

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

要求

   
标头 wingdi.h

请参阅

DirectShow 结构

VIDEOINFOHEADER 结构

VIDEOINFOHEADER2 结构

使用视频帧