BITMAPINFOHEADER 結構 (wingdi.h)
[與此頁面相關的功能 DirectShow 是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft 強烈建議新程式代碼盡可能使用 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 格式,此成員是以小數端順序指定為 DWORD 的 FOURCC 程式代碼。 例如,YUYV 影片具有FOURCC 'V YUY' 或 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 的 rcTarget 成員或VIDEOINFOHEADER2結構等於影像寬度。
如果影像緩衝區中有填補,則永遠不會將指標取值到已保留給填補的記憶體中。 如果影像緩衝區已配置於視訊記憶體中,填補可能無法讀取記憶體。
規格需求
標頭 | wingdi.h |