読者です 読者をやめる 読者になる 読者になる

bmpフォーマット

横のデータ長を 4 byte 境界にあわせる点が重要です。

全体構造
ファイルヘッダ
情報ヘッダ 新(Windows)、旧(OS/2) の2タイプがある
カラーパレット
画像データ

ファイルヘッダ
2 byte ファイルタイプ 'BM'
4 byte ファイルサイズ (byte)
2 byte --- 常に0
2 byte --- 常に0
4 byte ファイル先頭から画像データまでのオフセット (byte)

OS/2 情報ヘッダ
4 byte 情報ヘッダのサイズ (byte) 12
2 byte 画像の幅 (ピクセル)
2 byte 画像の高さ (ピクセル) 正数なら下から上、
負数なら上から下へ画像データが並ぶ
2 byte 平面数 常に 1
2 byte 1画素あたりのビット数 1 - 2 色ビットマップ
4 - 16 色ビットマップ
8 - 256 色ビットマップ
16 - 65536色(high color)ビットマップ (正式には対応していない)
24 - 1677万色(true color)ビットマップ
32 - 1677万色(true color)ビットマップ
Windows 情報ヘッダ
4 byte 情報ヘッダのサイズ (byte) 40
4 byte 画像の幅 (ピクセル)
4 byte 画像の高さ (ピクセル) 正数なら下から上、
負数なら上から下へ画像データが並ぶ
2 byte 平面数 常に 1
2 byte 1画素あたりのビット数 1 - 2 色ビットマップ
4 - 16 色ビットマップ
8 - 256 色ビットマップ
16 - 65536色(high color)ビットマップ (正式には対応していない)
24 - 1677万色(true color)ビットマップ
32 - 1677万色(true color)ビットマップ
4 byte 画像データ部のサイズ (byte) 0でも構わない
4 byte 横方向解像度 (1mあたりの画素数) 0でも構わない
4 byte 縦方向解像度 (1mあたりの画素数) 0でも構わない
4 byte 格納されているパレット数 (使用色数) パレットを使用しない場合 0
4 byte 重要なパレットのインデックス アプリケーションによって抜き色などに使用されることがあり、
この色が画像変換処理などの後でも
変更されず保持されることを想定する場合がある

1画素あたりのビット数が 1, 4, 8 の場合に存在します。
それ以外の場合でも、カラーパレットがある場合があります。

OS/2 カラーパレット
1 byte 0〜255
1 byte 0〜255
1 byte 0〜255
Windows カラーパレット
1 byte 0〜255
1 byte 0〜255
1 byte 0〜255
1 byte ---

カラーパレットの下、もしくは情報ヘッダのすぐ下に画像データがあることは保障されないので、
ファイル先頭から画像データまでのオフセットを使用してデータ位置までシークする必要があります。
横のデータ長は 4 byte 境界にあわせる必要があります。

1 bit (2色) 画像データ (パレット画像)
1 byte パレットのインデックス 0, 1
...
4 bit (16色) 画像データ (パレット画像)
4 bit パレットのインデックス 0〜15
...
8 bit (256色) 画像データ (パレット画像)
8 bit パレットのインデックス 0〜255
...
24 bit (1677万色) 画像データ (ダイレクト画像)
1 byte 0〜255
1 byte 0〜255
1 byte 0〜255
...
32 bit (1677万色) 画像データ (ダイレクト画像)
1 byte 0〜255
1 byte 0〜255
1 byte 0〜255
1 byte ---
...