« 2006年07月 | メイン | 2006年09月 »

2006年08月29日

ビットマップについて (パクリ)

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 データを書き込む順序 57 58 59 60 61 62 63 64
49 50 51 52 53 54 55 56
41 42 43 44 45 46 47 48
33 34 35 36 37 38 39 40
25 26 27 28 29 30 31 32
17 18 19 20 21 22 23 24
9 10 11 12 13 14 15 16
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)を参考にして作成しました.

投稿者 muuming : 13:16 | コメント (1)