BMP ファイルフォーマット

BMP フォーマットは,DIB (Device Independent Bitmap) にヘッダを付けた形式になっていて,ヘッダの種類によって の2種類があります。
Windows, OS/2 のフォーマットは,ヘッダサイズのサイズが異なっています。

BMP ファイル全体構造
ファイルヘッダ BITMAPFILEHEADER (14byte)
情報ヘッダ BITMAPINFOHEADER (Windows)
または
BITMAPCOREHEADER (OS/2)
+
カラーパレット(無い場合もある)
画像データ

ファイルヘッダ [BITMAPFILEHEADER]

最初に 14 byte 固定のファイルヘッダ部分があります。最初の 2 byte が 'BM' かどうかで,ビットマップファイルを識別します。

typedef struct tagBITMAPFILEHEADER {
  unsigned short bfType;
  unsigned long  bfSize;
  unsigned short bfReserved1;
  unsigned short bfReserved2;
  unsigned long  bfOffBits;
} BITMAPFILEHEADER
BMPFILEHEADER
bfType 2 byte ファイルタイプ 'BM' - OS/2, Windows Bitmap
bfSize 4 byte ファイルサイズ (byte)  
bfReserved1 2 byte 予約領域 常に 0
bfReserved2 2 byte 予約領域 常に 0
bfOffBits 4 byte ファイル先頭から画像データまでのオフセット (byte)  

情報ヘッダ

情報ヘッダには何種類かあります。
情報ヘッダの最初の 4 Byte に情報ヘッダ部のサイズなので,この値で種類を区別します。
'12' ならば [BITMAPCOREHEADER] (OS/2),'40' ならば [BITMAPINFOHEADER] (Windows) になります。
他にも,Windows NT 4.0 以降で使用可能な "BITMAPV4HEADER" やWindows 98/2000 以降で使用可能な "BITMAPV5HEAER" があるようです。

情報ヘッダの種類
12 byte BITMAPCOREHEADER OS/2 bitmap
40 byte BITMAPINFOHEADER Windows Bitmap

画像の高さは符号付きの値で,正数ならばボトムアップ(左下から右上),負数ならばトップダウン(左上から右下)の順に,データが記録されています。
標準は正数でボトムアップです。

[BITMAPCOREHEADER]

OS/2 Bitmap の情報ヘッダは以下のようになります。

typedef struct tagBITMAPCOREHEADER{
    unsigned long  bcSize;
    short          bcWidth;
    short          bcHeight;
    unsigned short bcPlanes;
    unsigned short bcBitCount;
} BITMAPCOREHEADER;
BMPCOREHEADER
bcSize 4 byte 情報ヘッダのサイズ (byte) 12
bcWidth 2 byte 画像の幅 (ピクセル)  
bcHeight 2 byte 画像の高さ (ピクセル) bcHeight の値が正数なら,画像データは下から上へ
bcHeight の値が負数なら,画像データは上から下へ
bcPlanes 2 byte プレーン数 常に 1
bcBitCount 2 byte 1画素あたりのデータサイズ (bit) 1 - 2 色ビットマップ
4 - 16 色ビットマップ
8 - 256 色ビットマップ
(16 - 65536色(high color)ビットマップ 正式に対応していない)
24 - 1677万色(true color)ビットマップ
32 - 1677万色(true color)ビットマップ

[BITMAPINFOHEADER]

Windows bitmap の情報ヘッダは以下のようになります。
最初の5項目については,OS/2 ヘッダ (BITMAPCOREHEADER) と同じ情報です(ただし,画像の幅,高さについては大きさが違います)。

typedef struct tagBITMAPINFOHEADER{
    unsigned long  biSize;
    long           biWidth;
    long           biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long  biCompression;
    unsigned long  biSizeImage;
    long           biXPixPerMeter;
    long           biYPixPerMeter;
    unsigned long  biClrUsed;
    unsigned long  biClrImporant;
} BITMAPINFOHEADER;
BMPINFOHEADER
biSize 4 byte 情報ヘッダのサイズ (byte) 40
biWidth 4 byte 画像の幅 (ピクセル)  
biHeight 4 byte 画像の高さ (ピクセル) biHeight の値が正数なら,画像データは下から上へ
biHeight の値が負数なら,画像データは上から下へ
biPlanes 2 byte プレーン数 常に 1
biBitCount 2 byte 1 画素あたりのデータサイズ (bit) 1 - 2 色ビットマップ
4 - 16 色ビットマップ
8 - 256 色ビットマップ
(16 - 65536色(high color)ビットマップ 正式に対応していない)
24 - 1677万色(true color)ビットマップ
32 - 1677万色(true color)ビットマップ
biCopmression 4 byte 圧縮形式 0 - BI_RGB (無圧縮)
1 - BI_RLE8 (RunLength 8 bits/pixel)
2 - BI_RLE4 (RunLength 4 bits/pixel)
3 - Bitfields
biSizeImage 4 byte 画像データ部のサイズ (byte) 96dpi ならば3780
0 の場合もある
biXPixPerMeter 4 byte 横方向解像度 (1mあたりの画素数) 96dpi ならば3780
0 の場合もある
biYPixPerMeter 4 byte 縦方向解像度 (1mあたりの画素数) 96dpi ならば3780
0 の場合もある
biClrUsed 4 byte 格納されているパレット数 (使用色数) 0 の場合もある
biCirImportant 4 byte 重要なパレットのインデックス 0 の場合もある

圧縮形式 biCompression 以下の値は 0 の場合もあり,その場合にはデフォルト値が使われます。

圧縮形式 biCompression が 0 ではない場合,画像は圧縮されています。

になっています。
圧縮形式 biCompresson = 3 のビットフィールドの場合は,BITMAPINFOHEADER 直後に RGB の順に 4 * 3 byte (12byte) のビットフィールドマスクがあり,この内容でデータ形式が決まります。
圧縮形式 biCompression が 0 以外の値の場合には,画像のサイズ biSizeImage を 0 にすることはできません。

biBitCount が 1, 4, 8 の場合には,BiClrUsed に実際に使用されているカラーパレットの色数が記録されています。0 の場合には,biBitCount と同じとみなされます。

となります。
計算式で書くと "biClrUsed = 1 << biBitCount" となります。

ランレングス圧縮

ランレングス(Run Length)圧縮(連長圧縮)とは,基本的な圧縮方法です。
例えば,



というデータを,

×5 ×4 ×7

とする圧縮方式です。
ある程度同じ値が連続しなければ圧縮効果が無く,逆にサイズが大きくなることもあるので,通常のベタで記録する部分もあります。

ビットフィールド

ビットフィールドとは,構造体のメンバに割り当てられるメモリをビット単位で制御するしくみです。
例えば,0 と 1 しか入らない変数に 2byte や 4byte もメモリを割り当てるのは,無駄が多くなります。そこで,ビットフィールドを使用して,割り当てるメモリを 1bit とすることで,メモリを節約することができます。
コードの書き方は以下のようにします。
struct BitField {
  unsigned short value1:4;
  unsigned short value2:4;
};
構造体メンバの宣言で ":" をつけて,必要なビット数を書きます。
上の例では,value1 と value2 は 4bit (0〜15)の変数になっています。

カラーパレット

BitCount の値が 1, 4, 8 の場合に存在します。

で1つの色を表現しています。

BitCount が 1, 4, 8 の場合には,画像データにカラーパレットの色番号が記録されていて,色番号が指し示すカラーパレットの色が表示されます。
BitCount が 24, 32 の場合には,画像データに直接色データが記録されています。

[RGBTRIPLE]

OS/2 ビットマップのカラーパレットは以下のようになっています。
typedef struct tagRGBTRIPLE{
    unsigned char rgbBlue;
    unsigned char rgbGreen;
    unsigned char rgbRed;
} RGBTRIPLE;
カラーパレット[RGBTRIPLE]
rgbBlue 0 〜 255
rgbGreen 0 〜 255
rgbRed 0 〜 255

[RGBQUAD]

Windows ビットマップのカラーパレットは以下のようになっています。
typedef struct tagRGBQUAD{
    unsigned char rgbBlue;
    unsigned char rgbGreen;
    unsigned char rgbRed;
    unsigned char rgbReserved;
} RGBQUAD;
カラーパレット[RGBQUAD]
rgbBlue 0 〜 255
rgbGreen 0 〜 255
rgbRed 0 〜 255
rgbReserved 予約領域 0

画像データ

BMP フォーマットの記録方式の特徴に以下のことがあります。 画像データの読み込み方の例は,以下のようになります。
  line = (Width * BitCount) / 8;                       // 1 ラインあたりのデータ数
  if ((line % 4) != 0) {
    line = ((line / 4) + 1) * 4;                       // 4byte 境界にあわせる
  }

  for(i = 0; i < Height; i++) {
    position = OffBits + line * (Height - (i + 1));    // 行の先頭位置
    fseek(fp, position, SEEK_SET);
    fread(buf, line, 1, fp);                           // 値の読み込み
  }

1 bit (2色) Bitmap

2個のカラーパレットが必要になります。
1画素あたり 1bit で記録されていて,0 のときには 1番目の色,1 のときには 2番目の色で表現されます。

例えば,カラーパレットが



で,画像データが 0x5C (2進数で 01011100) のときには,画像は



となります。

このフォーマットでは,1ラインのデータ長は 4 byte 境界にあわせる必要があります。
ソフトによっては,白黒画像として扱うものもあるようです。

4 bit (16色) Bitmap

16個のカラーパレットが必要になります。3色しか使用していなくても16個のカラーパレットが必要です。
1画素あたり 4bit で,カラーパレットの番号が記録されています。

例えば,カラーパレットが



で,画像データが 0x5C のときには,2画素分を表現し,カラーパレットの5番目の色,13番目の色 で,画像は



となります。

このフォーマットでは,1ラインのデータ長は 4 byte 境界にあわせる必要があります。

8 bit (256色) Bitmap

256個のカラーパレットが必要になります。
17色しか使用していなくても256個のカラーパレットが必要です。
1画素あたり 8bit (1byte) で,カラーパレットの番号が記録されています。

例えば,カラーパレットが


















で,画像データが 0x5C のときには,カラーパレットの92番目の色で,画像は



となります。

このフォーマットでは,1ラインのデータ長は 4 byte 境界にあわせる必要があります。

24 bit (1677万色) Bitmap

このフォーマットにはカラーパレットがありません。
1画素あたり 24bit (3byte) で,Blue(8bit), Green(8bit), Red(8bit) の順番で色の値が記録されています。

例えば,画像データが

0x33, 0x00, 0xFF

のとき,画像は



となります。

このフォーマットでは,1ラインのデータ長は 4 byte 境界にあわせる必要があります。

32 bit (1677万色) Bitmap

このフォーマットにはカラーパレットがありません。
1画素あたり 32bit (4byte) で,Blue(8bit), Green(8bit), Red(8bit), Reserved(8bit)の順番で色の値が記録されています。Reserved には '0' が入ります。

例えば,画像データが

0x33, 0x00, 0xFF, 0x00

のとき,画像は



となります。

このフォーマットでは,1画素あたり 4byte なので,4 byte 境界にあわせる必要はありません。

拙作プログラム

RED GREEN BLUE
color image red ingredient green ingredient blue ingredient
graph gray image

関連ドキュメント

The Programmer's File Format Collection

関連リンク


HOME
kondo@kk.iij4u.or.jp