BITMAPINFOHEADER 结构 (wingdi.h)
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
BITMAPINFOHEADER 结构包含有关与设备无关的位图的尺寸和颜色格式的信息, (DIB) 。
语法
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 格式,可以使用以下值:
值 | 含义 |
---|---|
|
未压缩的 RGB。 |
|
带颜色掩码的未压缩 RGB。 适用于 16-bpp 和 32-bpp 位图。 |
有关更多信息,请参见备注。 请注意, BI_JPG 和 BI_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 或更低时为颜色表分配空间,即使未使用颜色表也是如此。
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 设置为等于表面步幅(以像素为单位)。
- 它将 VIDEOINFOHEADER 或 VIDEOINFOHEADER2 结构的 rcTarget 成员设置为等于图像宽度(以像素为单位)。
如果图像缓冲区中有填充,则永远不要取消引用已为填充保留的内存中的指针。 如果已在视频内存中分配图像缓冲区,则填充可能不是可读内存。
要求
标头 | wingdi.h |