BMP(DIB)フォーマット解説

拡張子について

拡張子は、「.BMP」「.RLE」「.DIB」などが存在します。


データの構成

DIB(Device Independent Bitmaps)フォーマットは、以下のようなデータで構成されています。

BITMAPFILEHEADER
アドレスデータ長データの種類説明
00 2byte BM 必ずBM
02 4byte ファイルサイズ ファイル全体のサイズ
06 2byte リザーブ1 0で問題無し
08 2byte リザーブ2 0で問題無し
0A 4byte イメージまでのオフセット  

BITMAPINFOHEADER(Windows形式で使用される)
アドレスデータ長データの種類説明
0E 4byte ヘッダのサイズ 28h
12 4byte 横サイズ ピクセル単位
16 4byte 縦サイズ ピクセル単位
1A 2byte biPlanes 必ず1
1C 2byte 色数 ピクセル当たりのビット数
1h : モノクロ
4h : 16色
8h : 256色
16h : ハイカラー
24h : フルカラー(1677万色)
1E 4byte 圧縮タイプ 0h : 非圧縮
1h : BitCount=8のランレングス圧縮
2h : BitCount=4のランレングス圧縮
22 4byte イメージのサイズ 非圧縮の場合は0
26 4byte 水平解像度 メートル当たりの解像度。普通は0
2A 4byte 垂直解像度 メートル当たりの解像度。普通は0
2E 4byte biClrUsed RGBQUAD(パレット)の数。普通は0。
(ClrUsed!=0)&&(BitCount==24)が成立する場合は、
フルカラーフォーマットだが、パレットがbiClrUsed分存在する事を示す。
32 4byte biClrImporant カラーテーブル内の幾つの色が重要なのかが格納される。普通は0

BITMAPCOREHEADER(OS/2形式で使用される)
アドレスデータ長データの種類説明
0E 4byte ヘッダのサイズ 0Ch
12 2byte 横サイズ ピクセル単位
14 2byte 縦サイズ ピクセル単位
16 2byte bcPlanes 必ず1
18 2byte 色数 ピクセル当たりのビット数
1h : モノクロ
4h : 16色
8h : 256色
18h : フルカラー(1677万色)

RGBQUAD
アドレスデータ長データの種類説明
  1byte 青の輝度  
  1byte 緑の輝度  
  1byte 赤の輝度  
  1byte リザーブ 必ず0

RGBTRIPLE
アドレスデータ長データの種類説明
  1byte 青の輝度  
  1byte 緑の輝度  
  1byte 赤の輝度  


詳しい説明

まず、BITMAPFILEHEADERがファイルの先頭にあり、
Windows形式の場合はBITMAPINFOHEADER、OS/2形式の場合はBITMAPCOREHEADERが、その後ろにあります。
その後ろにカラーインデックス(パレット)、最後にイメージデータが保存されています。

○Windows形式の場合
    BITMAPFILEHEADER
        ↓
    BITMAPINFOHEADER
        ↓
    RGBQUAD[n](カラーインデックス)
        ↓
    実際のイメージ

○OS/2形式の場合
    BITMAPFILEHEADER
        ↓
    BITMAPCOREHEADER
        ↓
    RGBTRIPLE[n](カラーインデックス)
        ↓
    実際のイメージ

カラーインデックスと実際のイメージは、
色数によってサイズが違い、以下のようになっています。

    モノクロ
        カラーインデックスは2個存在し、
        イメージは、1ピクセルにつき1bit使用する。(0〜1)
    16色
        カラーインデックスは16個存在し、
        イメージは、1ピクセルにつき4bit使用する。(0h〜Fh)
    256色
        カラーインデックスは256個存在し、
        イメージは、1ピクセルにつき1byte使用する。(0h〜FFh)
    16万色
        カラーインデックスは存在しない。
        イメージは、以下の3byteで構成される。
            1byte  青の輝度(0h〜FFh)
            1byte  緑の輝度(0h〜FFh)
            1byte  赤の輝度(0h〜FFh)

圧縮について

圧縮には、以下のような種類があります。

○BI_RLE8
    256色用の圧縮方法。
    コード化モードと絶対モードが存在し、混在して使用されます。

    □コード化モード
        以下の例を見れば分かる通り、第1バイトに連続するデータの数、
        第2バイトにカラーインデックスが格納されています。

        01 23      →   23
        02 46      →   46 46
        03 69      →   69 69 69

        また、00から始まるコードは、以下のような意味があります。

        00 00      →   行の終端を意味する
        00 01      →   イメージそのものの終端を意味する
        00 02 xx yy  →   現在位置から横xx,縦yyのオフセットで次のデータが始まる事を意味する

    □絶対モード

        絶対モードとは、コード化モードで圧縮できなかった部分を
        そのまま格納するもので、第2バイト(03h〜FFh)が連続するデータの数、
        その次からは、カラーインデックスが格納されます。

        00 03 45 60   →   456
        00 04 56 78   →   5678

○BI_RLE4
    16色用の圧縮方法。
    以下のような感じで、1バイト目にデータの数、
    2バイト目からは、カラーインデックスとなります。

    03 45               →   454
    09 12 34 56 78 90        →   123456789
    05 12 34 50 00 00        →   12345
Windows/iPhoneアプリ、ゲーム用フリー音源、ヒーリングミュージックのMeteoric Stream -> 資料室 -> BMP(DIB)フォーマット解説
▲Top