Windowsビットマップ形式概説


1.ファイルの構造

 BMP形式のファイルは,バイナリファイルである.その内容は,ファイルの先頭から順に大きく分けて,ヘッダ,カラーテーブル(フルカラーでは不要),データの3つの部分からなる.
 表1はファイルの構造を示したもので,項番の順に書き込まれる.数値はリトルエンディアンで書き込まれる.なお,項番1から16までがヘッダ,項番17がカラーテーブル,項番18がデータである.

表1 BMP形式のファイル構造
項番 オフセット
(16進)
記号 内容 備考
1 00 unsigned short bfType ファイルの先頭から42h,4dh("BM")の順で書き込まれているようにする.リトルエンディアンを用いている場合は,bfType=4d42hとなる.
2 02 unsigned long bfSize ファイルサイズ 単位は[byte]
3 06 unsigned short bfReserved1 予約1 0にする
4 08 unsigned short bfReserved2 0にする
5 0A unsigned long bfOffBits データ部の先頭位置 単位は[byte]
6 0E unsigned long biSize 項番6から16までのサイズ 40になる
7 12 long biWidth 横画素数
8 16 long biHeight 縦画素数
9 1A unsigned short biPlanes 1にする
10 1C unsigned short biBitCount 色数 単位は[bit]
1,4,8,24のいずれか
11 1E unsigned long biCompression 圧縮タイプ 圧縮しない場合は0
12 22 unsigned long biSizeImage データ部のサイズ 単位は[byte]
13 26 long biXPixPerMeter 水平解像度 1[m]あたりの横画素数(0でよい)
14 2A long biYPixPerMeter 垂直解像度 1[m]あたりの縦画素数(0でよい)
15 2E unsigned long biClrUsed 実際に使用されているカラーテーブルの色数 0でよい
0の場合は,biBitCountで指定された色数が使用されていると扱われる.
16 32 unsigned long biClrImportant カラーテーブル内の重要な色数 0でよい
項番17(カラーテーブル)はbiBitCount=1,4,8のときのみ必要
*17 36 unsigned char rgbBlue カラーテーブル[0]のb座標値 biBitCount=1,4,8のときのみ
37 unsigned char rgbGreen カラーテーブル[0]のg座標値 biBitCount=1,4,8のときのみ
38 unsigned char rgbRed カラーテーブル[0]のr座標値 biBitCount=1,4,8のときのみ
39 unsigned char rgbReserved カラーテーブル[0]の予約 0にする
biBitCount=1,4,8のときのみ












biBitCoout=1(2色)のときは[1]まで
biBitCoout=4(16色)のときは[15]まで
biBitCoout=8(256色)のときは[255]まで
上記の4項目が必要
項番18(データ)の書き込み方はbiBitCountによって異なる
18 3E(1)
76(4)
436(8)
36(24)
データ
オフセットはbiBitCountによって異なる
(オフセットのかっこ内数字はbiBitCountの値)

2.カラーテーブル

 ヘッダ部で指定した色数が1[bit](2色),4[bit](16色),8[bit](256色)のときに必要であり, 24[bit](フルカラー)では不要である.
 使用され得る色のrgb座標値を,色ごとにすべて書きこむ.それぞれの色については,表2の形式を用いる.表2の形式の数値の並びを2色の画像では2回,16色では16回,256色では256回繰り返して書き込む.
 従って,表1のヘッダ部の後に書き込まれるカラーテーブルのサイズは,色数によって表3のようになる.

表2 カラーテーブルにおける1色ごとの形式
項番 記号 内容 備考
1 unsigned char rgbBlue b座標値
2 unsigned char rgbGreen g座標値
3 unsigned char rgbRed r座標値
4 unsigned char rgbReserved 予約 0にする
表3 カラーテーブルのサイズ
biBitCount 色数 サイズ[byte]
1 2 8
4 16 64
8 256 1024
24 16777216 0

3.データ

3.1 データ書き込みの概要

 データは,下から順にラインごと,各ラインでは左の画素から順に,画素ごとに書き込む.8×8画素の画像を例にとると,画素ごとの書き込む順序は図1のようになる.

図1 データを書き込む順序
5758 5960 6162 6364
4950 5152 5354 5556
4142 4344 4546 4748
3334 3536 3738 3940
2526 2728 2930 3132
1718 1920 2122 2324
910 1112 1314 1516
1 2 3 4 5 6 7 8

 各ライン及び各画素における書き込み方は以下の通りである.

3.2 各画素における書き込み

(1)フルカラー画像の場合

 rgb各座標値をb,g,rの順に,それぞれunsigned char型で書き込む.すなわち,画素ごとでは,項番4がないことを除いて表2と同じ形式となる.

(2)フルカラー画像ではない場合

 各画素の色と同じ色がカラーテーブル部に書き込まれているので,その色が書き込まれた順番を0から数えた数で書き込む.8[bit]カラーの場合は0から255までの数値を,4[bit]カラーの場合は0から15までの数値を,2[bit]カラーの場合は0または1を,それぞれの色数と同じビット数で書き込む.C言語では,最も小さい場合でも変数のサイズは1[byte]であるが,このサイズで8[bit]カラーの場合は1画素,4[bit]では2画素,1[bit]では8画素分の数値を書き込むことになる.8[bit]の場合はそのまま画素ごとにunsigned char型で書き込めばよいが,それ以外の場合にはビット演算が必要となる.

3.3 各ラインにおける書き込み

 基本的には,各画素ごとに4.2の方法で,左の画素から書き込むが,各ラインのサイズが4[byte]の倍数になるようにする.そのサイズに満たない場合は,ラインごとにデータのない末尾に0を書き込む.例えば,横画素数が97画素の画像の場合,1ラインごとのサイズは表4のようにする.

表4 1ライン当りの書き込みサイズ(横画素数が97の場合)
biBitCount 計算上のサイズ[byte] 実際に書き込むサイズ[byte]
1 12.125
(12[byte]+1[bit])
16
4 48.5
(48[byte]+4[bit])
52
8 97 100
24 291 292

 すなわち,色数が24[bit]では1[byte],8[bit]では3[byte],4[bit]では3[byte]+4[bit],1[bit]では3[byte]+7[bit]分,それぞれ末尾に0を書き込まなければならない.

参考資料

このページは,八城年伸(Contrail)氏 のまとめによる「DIB フォーマット概要 1.0.2」(1995)を参考にして作成しました.