BITMAPINFOHEADER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| biSize | DWORD | 4 | +0 | +0 | 構造体に必要なバイト数を指定します。この値には、カラーテーブルのサイズや、構造体の末尾に付加されるカラーマスクのサイズは含まれません。「解説」を参照してください。 | ||||||
| biWidth | INT | 4 | +4 | +4 | ビットマップの幅をピクセル単位で指定します。ビットマップのストライドの計算方法については、「解説」を参照してください。 | ||||||
| biHeight | INT | 4 | +8 | +8 | ビットマップの高さをピクセル単位で指定します。
| ||||||
| biPlanes | WORD | 2 | +12 | +12 | ターゲットデバイスのプレーン数を指定します。この値は 1 に設定しなければなりません。 | ||||||
| biBitCount | WORD | 2 | +14 | +14 | 1 ピクセルあたりのビット数 (bpp) を指定します。非圧縮形式の場合、この値は 1 ピクセルあたりの平均ビット数です。圧縮形式の場合、この値は画像がデコードされた後の非圧縮画像における暗黙のビット深度です。 | ||||||
| biCompression | DWORD | 4 | +16 | +16 | 圧縮されたビデオ形式および YUV 形式の場合、このメンバーは FOURCC コードであり、リトルエンディアン順の DWORD として指定されます。たとえば、YUYV ビデオの FOURCC は 'VYUY' すなわち 0x56595559 です。詳細については、「FOURCC Codes」を参照してください。 非圧縮の RGB 形式の場合、次の値を指定できます。
詳細については「解説」を参照してください。なお、BI_JPG と BI_PNG は有効なビデオ形式ではありません。 16 bpp のビットマップの場合、biCompression が BI_RGB と等しいときは、形式は常に RGB 555 です。biCompression が BI_BITFIELDS と等しいときは、形式は RGB 555 または RGB 565 のいずれかです。具体的な RGB の種類を判別するには、AM_MEDIA_TYPE 構造体のサブタイプ GUID を使用してください。 | ||||||
| biSizeImage | DWORD | 4 | +20 | +20 | 画像のサイズをバイト単位で指定します。非圧縮の RGB ビットマップの場合は 0 に設定できます。 | ||||||
| biXPelsPerMeter | INT | 4 | +24 | +24 | ビットマップのターゲットデバイスの水平解像度を、1 メートルあたりのピクセル数で指定します。 | ||||||
| biYPelsPerMeter | INT | 4 | +28 | +28 | ビットマップのターゲットデバイスの垂直解像度を、1 メートルあたりのピクセル数で指定します。 | ||||||
| biClrUsed | DWORD | 4 | +32 | +32 | カラーテーブル内の色インデックスのうち、実際にビットマップで使用される数を指定します。詳細については「解説」を参照してください。 | ||||||
| biClrImportant | DWORD | 4 | +36 | +36 | ビットマップの表示にとって重要と見なされる色インデックスの数を指定します。この値が 0 の場合は、すべての色が重要です。 |
公式ドキュメント
[このページに関連する機能 DirectShow は、レガシー機能です。この機能は MediaPlayer、IMFMediaEngine、および Audio/Video Capture in Media Foundation に置き換えられました。これらの機能は Windows 10 および Windows 11 向けに最適化されています。Microsoft は、可能な限り DirectShow ではなく MediaPlayer、IMFMediaEngine、Audio/Video Capture in Media Foundation を新しいコードで使用することを強く推奨します。また、レガシー API を使用している既存のコードは、可能であれば新しい API を使用するように書き換えることを推奨します。]
BITMAPINFOHEADER 構造体は、デバイス非依存ビットマップ (DIB) の寸法と色形式に関する情報を格納します。
解説(Remarks)
カラーテーブル
BITMAPINFOHEADER 構造体の後には、パレットエントリまたはカラーマスクの配列が続くことがあります。その規則は biCompression の値によって異なります。- biCompression が BI_RGB と等しく、ビットマップが 8 bpp 以下を使用する場合、そのビットマップは BITMAPINFOHEADER 構造体の直後にカラーテーブルを持ちます。カラーテーブルは RGBQUAD 値の配列で構成されます。配列のサイズは biClrUsed メンバーで指定されます。biClrUsed が 0 の場合、配列には指定されたビット深度で表現できる最大数の色、すなわち 2^biBitCount 個の色が含まれます。
- biCompression が BI_BITFIELDS と等しい場合、ビットマップは 3 つの 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) と等しくならないことに注意してください。インスタンスごとに実際のサイズを計算する必要があります。
サーフェスのストライドの計算
非圧縮のビットマップにおけるストライドとは、あるピクセル行の先頭から次の行の先頭へ移動するために必要なバイト数です。画像形式は、画像に対する最小のストライドを定義します。さらに、グラフィックスハードウェアが、画像を格納するサーフェスに対してより大きなストライドを要求する場合もあります。非圧縮の 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 が画像の幅をピクセル単位で表す形式を提示すべきです。ビデオレンダラーが既定の画像ストライドよりも大きなサーフェスストライドを必要とする場合、レンダラーは次の値を設定して、提示されたメディアタイプを変更します。
- biWidth に、サーフェスのストライドをピクセル単位で設定します。
- VIDEOINFOHEADER 構造体または VIDEOINFOHEADER2 構造体の rcTarget メンバーに、画像の幅をピクセル単位で設定します。
画像バッファーにパディングが含まれている場合、パディング用に予約されたメモリを指すポインターを決して逆参照しないでください。画像バッファーがビデオメモリに割り当てられている場合、パディング部分は読み取り可能なメモリではない可能性があります。
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 Structureimport 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: uint32struct 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