ツムラ_メモ

大失敗を繰り返す。

BMP画像の解析

サンプルで用意した比較画像はGIMPで作成した以下の2ファイル.

  • test1.bmp
    • 640x380 pixel
  • test2.bmp
    • 320x240 pixel

test3.bmpはWindowsVistaで作成した4pixelのビットマップ画像.
イメージとしては

こういう画像.


bviで両方のファイルの先頭部分を表示したもの.

test1.bmp
00000000 42 4D 36 B8 0B 00 00 00 00 00 36 00 00 00 28 00 BM6.......6...(.
00000010 00 00 80 02 00 00 90 01 00 00 01 00 18 00 00 00 ................
00000020 00 00 00 B8 0B 00 13 0B 00 00 13 0B 00 00 00 00 ................
00000030 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF ................

test2.bmp
00000000 42 4D 36 EE 02 00 00 00 00 00 36 00 00 00 28 00 BM6.......6...(.
00000010 00 00 40 01 00 00 C8 00 00 00 01 00 18 00 00 00 ..@.............
00000020 00 00 00 EE 02 00 13 0B 00 00 13 0B 00 00 00 00 ................
00000030 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF ................

test3.bmp
00000000 42 4D 46 00 00 00 00 00 00 00 36 00 00 00 28 00 BMF.......6...(.
00000010 00 00 02 00 00 00 02 00 00 00 01 00 18 00 00 00 ................
00000020 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 ................
00000040 00 FF FF FF 00 00 ......

Windows 98以降のBMP形式のデータ構造

Windows bitmap - Wikipedia http://ja.wikipedia.org/wiki/Windows_bitmap

BITMAPFILEHEADER構造体
BITMAPV5HEADER構造体
RGBQUAD構造体(インデックスカラー時)
画像データ

BITMAPFILEHEADER構造体

BITMAPFILEHEADER
14byteからなる、ビットマップファイルのファイルヘッダである。
バイト数 情報 値・備考
2 byte 識別子 BM
4 byte ファイルサイズ 単位 byte
2 byte 予約領域1 0
2 byte 予約領域2 0
4 byte オフセット ビットマップデータの開始位置(byte)
4 byte 情報ヘッダのヘッダサイズ

情報ヘッダのサイズとOSの関係

40 - Windows V3
108 - Windows V4
124 - Windows V5
12 - OS/2 V1
64 - OS/2 V2

BITMAPINFOHEADERの構成

Windowsのビットマップで使われる情報ヘッダで、40バイトある。多くのビットマップがこの形式で保存されている。
バイト数 情報 値・備考
4 byte ヘッダサイズ 40
4 byte 画像の横幅 単位 pixel
4 byte 画像の縦幅 単位 pixel
2 byte プレーン数 1
2 byte ビット数 0,1,4,8,16,24,32
4 byte 圧縮形式 0,1,2,3,4,5※1
4 byte 画像データサイズ 画像データ部分のサイズ(byte)
4 byte 水平方向の解像度 単位:pixel / m
4 byte 垂直方向の解像度 単位:pixel / m
4 byte 使用する色数
4 byte 重要な色数

実際に4pixelのBMP画像ファイルtest3.bmpの中身を見てみる.
42
4d 識別子 BM
46
00
00
00 サイズ 0x00000046 = 70Byte
00
00 予備領域1
00
00 予備領域2
36
00
00
00 BMPデータの開始位置 0x00000036
28
00
00
00 情報ヘッダのサイズ 0x00000028=40
02
00
00
00 画像の横幅 0x00000002=2
02
00
00
00 画像の縦幅 0x00000002=2
01
00 プレーン数 0x0001=1
18
00 ビット数 0x0018=24 24bitカラー
00
00
00
00 圧縮形式 0x00000000=0 無圧縮
10 
00
00
00 画像データサイズ 0x00000010 16Byte (24bit=3Byte)*4pixel=12Byte 4Byteは水平方向のバイト数を4の倍数にするために埋められたヌル
00
00
00
00 水平方向の解像度 0
00
00
00
00 垂直方向の解像度 0
00
00
00
00 使用する色数 0
00
00
00
00 重要な色の数 0
ff 左下の画素の色Red  
ff 左下の画素の色Green
ff 左下の画素の色Blue RGB(255,255,255)=白 
00
00
00 右下の画素の色 RGB(0,0,0)=黒
00
00 あまり 横2pixelで24bit(3Byte)なので2*3=6Byte 4の倍数とある8Byteには2Byte足りないので2Byte分のnullを足す.
00
00
00 左上の画素の色 RGB(0,0,0)=黒
ff
ff
ff 右上の画素の色 RGB(255,255,255)=白
00
00 あまり