プログラミング/BMPファイル仕様/バイナリ構造 のバックアップ差分(No.2)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
BMPファイルのバイナリ構造の解説。

#contents

*概要 [#about]

BMPファイルのバイナリ構造は、データの先頭から順に以下のような構成要素を持つ。

+[[ファイルヘッダ>#file-header]]
+[[情報ヘッダ>#info-header]]
+[[ビットフィールド>#bitfields]]
+[[カラーパレット>#palette]]
+[[イメージデータ>#image-data]]

このうち、[[ビットフィールド>#bitfields]]と[[カラーパレット>#palette]]については[[情報ヘッダ>#info-header]]の内容次第で存在しないことがある。~
また、[[イメージデータ>#image-data]]は[[情報ヘッダ>#info-header]]の内容によって形式が大きく変わる。

なお、BMPバイナリ中にある2バイト及び4バイトの整数値データのバイトオーダは[[リトルエンディアン>e-words:リトルエンディアン]]であり、符号付き整数値の場合は最上位ビットを符号ビットとする2の補数表現を用いる。~
Windows環境しか考慮しないのであればバイトオーダを気にする必要はないが、プラットフォームに依存しないコードを記述する際には留意すること。

*ファイルヘッダ [#file-header]

''ファイルヘッダ''はBMPファイルのバイナリ構造において最初に現れる必要があり、以下の構成要素を持つ。
@dfn{ファイルヘッダ};はBMPファイルのバイナリ構造において最初に現れる必要があり、以下の構成要素を持つ。

|~要素|~バイト数|h
||RIGHT:|c
|[[ファイルタイプ>#file-header-filetype]]|2|
|[[ファイルサイズ>#file-header-filesize]]|4|
|[[予約1>#file-header-reserved1]]|2|
|[[予約2>#file-header-reserved2]]|2|
|[[イメージデータオフセット>#file-header-offset]]|4|

以下に各構成要素の詳細を述べる。

:@aname(file-header-filetype){ファイルタイプ};(2バイト)|ファイルがBMPファイルであることを示すもので、1バイト目が @code{'B'}; 、2バイト目が @code{'M'}; となる。~
エンコーダは必ずこの値を格納するべきで、デコーダはこの値であるかをチェックするべきである。
:@aname(file-header-filesize){ファイルサイズ};(4バイト)|BMPファイル全体のバイト単位でのサイズが符号無し整数値で入る。~
ただし、厳密でないエンコーダはこの値を計算せずに @code{0}; を格納しても構わない。~
デコーダはこの値を利用する必要はなく、また信用するべきでもない。
:@aname(file-header-reserved1){予約1};(2バイト)|
:@aname(file-header-reserved2){予約2};(2バイト)|これら2要素は将来の拡張用に予約されており、エンコーダは @code{0}; を格納するべきである。~
:@aname(file-header-reserved1){予約1};(2バイト)&br;@aname(file-header-reserved2){予約2};(2バイト)|これら2要素は将来の拡張用に予約されており、エンコーダは @code{0}; を格納するべきである。~
デコーダはこれらの値を無視して構わない。
:@aname(file-header-offset){イメージデータオフセット};(4バイト)|BMPファイルの最初から[[イメージデータ>#image-data]]の先頭までのバイト単位でのオフセットが符号無し整数値で入る。~
ただし、厳密でないエンコーダは @code{0}; を格納しても構わない。~
デコーダは、この値が @code{0}; 以外であった場合は信用するべきである。

Win32 SDK環境では、これらの構成を定義した @code{BITMAPFILEHEADER}; 構造体が存在する。

#code(c){{
typedef struct tagBITMAPFILEHEADER
{
    WORD    bfType;
    DWORD   bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD   bfOffBits;
}
BITMAPFILEHEADER;
}}