BITMAPINFOHEADER 構造体 (wingdi.h)

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 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 ビットマップの場合、 biCompressionBI_RGB と等しい場合、形式は常に RGB 555 になります。 biCompressionBI_BITFIELDS に等しい場合、形式は RGB 555 または RGB 565 のいずれかになります。 特定の RGB 型を決定するには、 AM_MEDIA_TYPE 構造体のサブタイプ GUID を使用します。

biSizeImage

イメージのサイズをバイト単位で指定します。 これは、非圧縮 RGB ビットマップの場合は 0 に設定できます。

biXPelsPerMeter

ビットマップのターゲット デバイスの水平方向の解像度をメートルあたりのピクセル単位で指定します。

biYPelsPerMeter

ビットマップのターゲット デバイスの垂直方向の解像度をメートルあたりのピクセル単位で指定します。

biClrUsed

ビットマップで実際に使用されるカラー テーブル内のカラー インデックスの数を指定します。 詳細については、「解説」を参照してください。

biClrImportant

ビットマップを表示するために重要と見なされるカラー インデックスの数を指定します。 この値が 0 の場合、すべての色が重要です。

注釈

カラー テーブル

BITMAPINFOHEADER 構造体の後に、パレット エントリまたはカラー マスクの配列が続く場合があります。 ルールは 、biCompression の値によって異なります。
  • biCompressionBI_RGBに等しく、ビットマップで 8 bpp 以下が使用されている場合、ビットマップには BITMAPINFOHEADER 構造体のすぐ後にカラー テーブルがあります。 カラー テーブルは 、RGBQUAD 値の配列で構成されます。 配列のサイズは、 biClrUsed メンバーによって指定されます。 biClrUsed が 0 の場合、配列には指定された bitdepth の色の最大数が含まれます。つまり、2^biBitCount の色です。
  • biCompressionBI_BITFIELDSの場合、ビットマップは 3 つの DWORD カラー マスク (それぞれ赤、緑、青) を使用し、ピクセルのバイト レイアウトを指定します。 各マスクの 1 ビットは、ピクセル内のその色のビットを示します。
  • biCompression がビデオ FOURCC の場合、カラー テーブルの存在はビデオ形式によって暗黙的に指定されます。 ビット深度が 8 bpp 以下の場合は、カラー テーブルが存在すると想定しないでください。 ただし、一部のレガシ コンポーネントでは、カラー テーブルが存在すると想定される場合があります。 したがって、 BITMAPINFOHEADER 構造体を割り当てる場合は、カラー テーブルが使用されていない場合でも、ビット深度が 8 bpp 以下の場合は、カラー テーブルの領域を割り当てることをお勧めします。
BITMAPINFOHEADER の後にカラー テーブルまたはカラー マスクのセットが続く場合は、BITMAPINFO 構造体を使用してカラー マスクのカラー テーブルを参照できます。 BITMAPINFO 構造体は次のように定義されます。
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD          bmiColors[1];
} BITMAPINFO;

BITMAPINFOHEADERBITMAPINFO にキャストすると、bmiHeader メンバーは BITMAPINFOHEADER を参照し、bmiColors メンバーはカラー テーブルの最初のエントリ、または最初のカラー マスクを参照します。

ビットマップでカラー テーブルまたはカラー マスクを使用する場合、書式構造全体 (BITMAPINFOHEADER と色情報) のサイズが または sizeof(BITMAPINFO)と等sizeof(BITMAPINFOHEADER)しくないことに注意してください。 各インスタンスの実際のサイズを計算する必要があります。

サーフェスストライドの計算

圧縮されていないビットマップでは、ストライドは 1 行のピクセルの先頭から次の行の先頭に移動するために必要なバイト数です。 イメージ形式では、イメージの最小ストライドを定義します。 さらに、グラフィックス ハードウェアでは、イメージを含むサーフェスに対してより大きなストライドが必要になる場合があります。

非圧縮 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 メンバーを、イメージの幅と同じピクセル単位で設定します。
次に、アップストリーム ピンで IPin::QueryAccept を呼び出して、ビデオ レンダラーによって変更された形式が提案されます。 このメカニズムの詳細については、「 動的形式の変更」を参照してください。

イメージ バッファーにパディングがある場合は、埋め込み用に予約されているメモリにポインターを逆参照しないでください。 イメージ バッファーがビデオ メモリに割り当てられている場合は、埋め込みが読み取り可能なメモリではない可能性があります。

要件

   
Header wingdi.h

こちらもご覧ください

DirectShow 構造体

VIDEOINFOHEADER 構造体

VIDEOINFOHEADER2構造体

ビデオ フレームの操作