Win32 API 日本語リファレンス
ホームGraphics.Gdi › BITMAPINFOHEADER

BITMAPINFOHEADER

構造体
サイズx64: 40 バイト / x86: 40 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
biSizeDWORD4+0+0構造体に必要なバイト数を指定します。この値には、カラーテーブルのサイズや、構造体の末尾に付加されるカラーマスクのサイズは含まれません。「解説」を参照してください。
biWidthINT4+4+4ビットマップの幅をピクセル単位で指定します。ビットマップのストライドの計算方法については、「解説」を参照してください。
biHeightINT4+8+8

ビットマップの高さをピクセル単位で指定します。

  • 非圧縮の RGB ビットマップの場合、biHeight が正の値であれば、そのビットマップは原点が左下隅にあるボトムアップ DIB です。biHeight が負の値であれば、そのビットマップは原点が左上隅にあるトップダウン DIB です。
  • YUV ビットマップの場合、biHeight の符号にかかわらず、ビットマップは常にトップダウンです。デコーダーは biHeight が正の値である YUV 形式を提示すべきですが、下位互換性のために、biHeight が正・負のいずれである YUV 形式も受け入れる必要があります。
  • 圧縮形式の場合、画像の向きにかかわらず、biHeight は正の値でなければなりません。
biPlanesWORD2+12+12ターゲットデバイスのプレーン数を指定します。この値は 1 に設定しなければなりません。
biBitCountWORD2+14+141 ピクセルあたりのビット数 (bpp) を指定します。非圧縮形式の場合、この値は 1 ピクセルあたりの平均ビット数です。圧縮形式の場合、この値は画像がデコードされた後の非圧縮画像における暗黙のビット深度です。
biCompressionDWORD4+16+16

圧縮されたビデオ形式および YUV 形式の場合、このメンバーは FOURCC コードであり、リトルエンディアン順の DWORD として指定されます。たとえば、YUYV ビデオの FOURCC は 'VYUY' すなわち 0x56595559 です。詳細については、「FOURCC Codes」を参照してください。

非圧縮の 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 を使用してください。

biSizeImageDWORD4+20+20画像のサイズをバイト単位で指定します。非圧縮の RGB ビットマップの場合は 0 に設定できます。
biXPelsPerMeterINT4+24+24ビットマップのターゲットデバイスの水平解像度を、1 メートルあたりのピクセル数で指定します。
biYPelsPerMeterINT4+28+28ビットマップのターゲットデバイスの垂直解像度を、1 メートルあたりのピクセル数で指定します。
biClrUsedDWORD4+32+32カラーテーブル内の色インデックスのうち、実際にビットマップで使用される数を指定します。詳細については「解説」を参照してください。
biClrImportantDWORD4+36+36ビットマップの表示にとって重要と見なされる色インデックスの数を指定します。この値が 0 の場合は、すべての色が重要です。

公式ドキュメント

[このページに関連する機能 DirectShow は、レガシー機能です。この機能は MediaPlayerIMFMediaEngine、および Audio/Video Capture in Media Foundation に置き換えられました。これらの機能は Windows 10 および Windows 11 向けに最適化されています。Microsoft は、可能な限り DirectShow ではなく MediaPlayerIMFMediaEngineAudio/Video Capture in Media Foundation を新しいコードで使用することを強く推奨します。また、レガシー API を使用している既存のコードは、可能であれば新しい API を使用するように書き換えることを推奨します。]

BITMAPINFOHEADER 構造体は、デバイス非依存ビットマップ (DIB) の寸法と色形式に関する情報を格納します。

メモ この構造体は GDI のドキュメントでも説明されています。ただし、ビデオデータに対するセマンティクスは、GDI で使用されるセマンティクスとはわずかに異なります。この構造体でビデオデータを記述する場合は、ここで示す情報を使用してください。

解説(Remarks)

カラーテーブル

BITMAPINFOHEADER 構造体の後には、パレットエントリまたはカラーマスクの配列が続くことがあります。その規則は biCompression の値によって異なります。 BITMAPINFOHEADER の後にカラーテーブルまたはカラーマスクのセットが続く場合、BITMAPINFO 構造体を使用して、カラーテーブルやカラーマスクを参照できます。BITMAPINFO 構造体は次のように定義されています。
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD          bmiColors[1];
} BITMAPINFO;

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

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

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

非圧縮のビットマップにおけるストライドとは、あるピクセル行の先頭から次の行の先頭へ移動するために必要なバイト数です。画像形式は、画像に対する最小のストライドを定義します。さらに、グラフィックスハードウェアが、画像を格納するサーフェスに対してより大きなストライドを要求する場合もあります。

非圧縮の RGB 形式の場合、最小のストライドは常に、画像の幅をバイト単位で表し、それを直近の DWORD 境界に切り上げた値です。ストライドと画像サイズを計算するには、GDI_DIBWIDTHBYTES マクロや GDI_DIBSIZE マクロ、または次の式を使用できます。

stride = ((((biWidth * biBitCount) + 31) & ~31) >> 3);
biSizeImage = abs(biHeight) * stride;

YUV 形式の場合、最小のストライドを計算するための一般的な規則はありません。対象となる YUV 形式ごとの規則を理解する必要があります。最も一般的な YUV 形式については、「Recommended 8-Bit YUV Formats for Video Rendering」を参照してください。

デコーダーおよびビデオソースは、biWidth が画像の幅をピクセル単位で表す形式を提示すべきです。ビデオレンダラーが既定の画像ストライドよりも大きなサーフェスストライドを必要とする場合、レンダラーは次の値を設定して、提示されたメディアタイプを変更します。

その後、ビデオレンダラーは上流のピンに対して IPin::QueryAccept を呼び出し、変更した形式を提示します。この仕組みの詳細については、「Dynamic Format Changes」を参照してください。

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

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// BITMAPINFOHEADER  (x64 40 / x86 40 バイト)
typedef struct BITMAPINFOHEADER {
    DWORD biSize;
    INT biWidth;
    INT biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    INT biXPelsPerMeter;
    INT biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
} BITMAPINFOHEADER;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct BITMAPINFOHEADER
{
    public uint biSize;
    public int biWidth;
    public int biHeight;
    public ushort biPlanes;
    public ushort biBitCount;
    public uint biCompression;
    public uint biSizeImage;
    public int biXPelsPerMeter;
    public int biYPelsPerMeter;
    public uint biClrUsed;
    public uint biClrImportant;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure BITMAPINFOHEADER
    Public biSize As UInteger
    Public biWidth As Integer
    Public biHeight As Integer
    Public biPlanes As UShort
    Public biBitCount As UShort
    Public biCompression As UInteger
    Public biSizeImage As UInteger
    Public biXPelsPerMeter As Integer
    Public biYPelsPerMeter As Integer
    Public biClrUsed As UInteger
    Public biClrImportant As UInteger
End Structure
import ctypes
from ctypes import wintypes

class BITMAPINFOHEADER(ctypes.Structure):
    _fields_ = [
        ("biSize", wintypes.DWORD),
        ("biWidth", ctypes.c_int),
        ("biHeight", ctypes.c_int),
        ("biPlanes", ctypes.c_ushort),
        ("biBitCount", ctypes.c_ushort),
        ("biCompression", wintypes.DWORD),
        ("biSizeImage", wintypes.DWORD),
        ("biXPelsPerMeter", ctypes.c_int),
        ("biYPelsPerMeter", ctypes.c_int),
        ("biClrUsed", wintypes.DWORD),
        ("biClrImportant", wintypes.DWORD),
    ]
#[repr(C)]
pub struct BITMAPINFOHEADER {
    pub biSize: u32,
    pub biWidth: i32,
    pub biHeight: i32,
    pub biPlanes: u16,
    pub biBitCount: u16,
    pub biCompression: u32,
    pub biSizeImage: u32,
    pub biXPelsPerMeter: i32,
    pub biYPelsPerMeter: i32,
    pub biClrUsed: u32,
    pub biClrImportant: u32,
}
import "golang.org/x/sys/windows"

type BITMAPINFOHEADER struct {
	biSize uint32
	biWidth int32
	biHeight int32
	biPlanes uint16
	biBitCount uint16
	biCompression uint32
	biSizeImage uint32
	biXPelsPerMeter int32
	biYPelsPerMeter int32
	biClrUsed uint32
	biClrImportant uint32
}
type
  BITMAPINFOHEADER = record
    biSize: DWORD;
    biWidth: Integer;
    biHeight: Integer;
    biPlanes: Word;
    biBitCount: Word;
    biCompression: DWORD;
    biSizeImage: DWORD;
    biXPelsPerMeter: Integer;
    biYPelsPerMeter: Integer;
    biClrUsed: DWORD;
    biClrImportant: DWORD;
  end;
const BITMAPINFOHEADER = extern struct {
    biSize: u32,
    biWidth: i32,
    biHeight: i32,
    biPlanes: u16,
    biBitCount: u16,
    biCompression: u32,
    biSizeImage: u32,
    biXPelsPerMeter: i32,
    biYPelsPerMeter: i32,
    biClrUsed: u32,
    biClrImportant: u32,
};
type
  BITMAPINFOHEADER {.bycopy.} = object
    biSize: uint32
    biWidth: int32
    biHeight: int32
    biPlanes: uint16
    biBitCount: uint16
    biCompression: uint32
    biSizeImage: uint32
    biXPelsPerMeter: int32
    biYPelsPerMeter: int32
    biClrUsed: uint32
    biClrImportant: uint32
struct BITMAPINFOHEADER
{
    uint biSize;
    int biWidth;
    int biHeight;
    ushort biPlanes;
    ushort biBitCount;
    uint biCompression;
    uint biSizeImage;
    int biXPelsPerMeter;
    int biYPelsPerMeter;
    uint biClrUsed;
    uint biClrImportant;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; BITMAPINFOHEADER サイズ: 40 バイト(x64)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; biSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; biWidth : INT (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; biHeight : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; biPlanes : WORD (+12, 2byte)  wpoke st,12,値  /  値 = wpeek(st,12)
; biBitCount : WORD (+14, 2byte)  wpoke st,14,値  /  値 = wpeek(st,14)
; biCompression : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; biSizeImage : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; biXPelsPerMeter : INT (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; biYPelsPerMeter : INT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; biClrUsed : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; biClrImportant : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global BITMAPINFOHEADER
    #field int biSize
    #field int biWidth
    #field int biHeight
    #field short biPlanes
    #field short biBitCount
    #field int biCompression
    #field int biSizeImage
    #field int biXPelsPerMeter
    #field int biYPelsPerMeter
    #field int biClrUsed
    #field int biClrImportant
#endstruct

stdim st, BITMAPINFOHEADER        ; NSTRUCT 変数を確保
st->biSize = 100
mes "biSize=" + st->biSize