BITMAPINFOHEADER 結構 (wingdi.h)

[與此頁面相關的功能 DirectShow 是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft 強烈建議新程式代碼盡可能使用 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 格式,此成員是以小數端順序指定為 DWORD 的 FOURCC 程式代碼。 例如,YUYV 影片具有FOURCC 'V YUY' 或 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 等於圖元的表面步進。
  • 它會以像素為單位,設定 VIDEOINFOHEADERrcTarget 成員或VIDEOINFOHEADER2結構等於影像寬度。
然後,影片轉譯器會在上游釘選上呼叫 IPin::QueryAccept 來建議修改的格式。 如需此機制的詳細資訊,請參閱 動態格式變更

如果影像緩衝區中有填補,則永遠不會將指標取值到已保留給填補的記憶體中。 如果影像緩衝區已配置於視訊記憶體中,填補可能無法讀取記憶體。

規格需求

   
標頭 wingdi.h

另請參閱

DirectShow 結構

VIDEOINFOHEADER 結構

VIDEOINFOHEADER2結構

使用視訊畫面