Bitmapファイルフォーマット
トップページ >>
各種ファイルフォーマット >>
完成:2002/11/27
BitmapはWindowsでの標準的な画像フォーマットです。
Bitmapフォーマットは、DIB(Device Independent Bitmap)にヘッダを付けた形式になっていて、ヘッダの種類によって、Windows、OS/2の2種類に分けられます。
Bitmapファイルの大まかな構造は次のようになります。
|
Windows |
OS/2 |
ファイルヘッダ (Bitmap File Header) |
BITMAPFILEHEADER (Windows,OS/2共通) |
情報ヘッダ (Bitmap Information Header) |
BITMAPINFOHEADER |
BITMAPCOREHEADER |
パレットデータ (Palette Data) <存在しない場合もある> |
RGBQUAD |
GBTRIPLE |
| 画像データ |
(Windows,OS/2共通) |
構造のそれぞれについて、以下で解説します。
ファイルヘッダ (Bitmap File Header)
ファイルヘッダ [BITMAPFILEHEADER] -Windows,OS/2共通
| [0] |
bfType |
2byte |
unsigned int |
ファイルタイプ |
'BM' |
| [2] |
bfSize |
4byte |
unsigned long |
ファイルサイズ[byte] |
|
| [6] |
bfReserved1 |
2byte |
unsigned int |
予約領域1 |
常に0 |
| [8] |
bfReserved2 |
2byte |
unsigned int |
予約領域2 |
常に0 |
| [10] |
bfOffBits |
4byte |
unsigned long |
ファイル先頭から画像データまでのオフセット[byte] |
|
- ファイルタイプ'BM'はWindowsでは共通です。
- ファイルヘッダは14byte固定です。最初の2byteが'BM'かどうかで、Bitmapファイルを識別します。
- bfOffBitsは、「画像データ」までのオフセット。パレットデータまでのオフセットではない。
- bfType以外のデータはリトルエンディアン、つまり後ろのバイトデータの方が上位にある形式で記録されます。
情報ヘッダ (Bitmap Information Header)
情報ヘッダ [BITMAPINFOHEADER] -Windows
| [14] |
biSize |
4byte |
unsigned long |
情報ヘッダサイズ[byte] |
40 |
| [18] |
biWidth |
4byte |
long |
画像の幅[ピクセル] |
|
| [22] |
biHeight |
4byte |
long |
画像の高さ[ピクセル] |
|
| [26] |
biPlanes |
2byte |
unsigned int |
プレーン数 |
常に1 |
| [28] |
biBitCount |
2byte |
unsigned int |
色ビット数[bit] |
1,4,8,(16),24,32 |
| [30] |
biCompression |
4byte |
unsigned long |
圧縮形式 |
0,1,2,3 |
| [34] |
biSizeImage |
4byte |
unsigned long |
画像データサイズ[byte] |
|
| [38] |
biXPixPerMeter |
4byte |
long |
水平解像度[dot/m] |
0の場合もある |
| [42] |
biYPixPerMeter |
4byte |
long |
垂直解像度[dot/m] |
0の場合もある |
| [46] |
biClrUsed |
4byte |
unsigned long |
格納パレット数[使用色数] |
0の場合もある |
| [50] |
biCirImportant |
4byte |
unsigned long |
重要色数 |
0の場合もある |
情報ヘッダ [BITMAPCOREHEADER] -OS/2
| [14] |
bcSize |
4byte |
unsigned long |
情報ヘッダサイズ[byte] |
12 |
| [18] |
bcWidth |
2byte |
int |
画像の幅[ピクセル] |
|
| [20] |
bcHeight |
2byte |
int |
画像の高さ[ピクセル] |
|
| [22] |
bcPlanes |
2byte |
unsigned int |
プレーン数 |
常に1 |
| [24] |
bcBitCount |
2byte |
unsigned int |
色ビット数[bit] |
1,4,8,(16),24,32 |
- データはリトルエンディアン、つまり後ろのバイトデータの方が上位にある形式で記録されます。
- 情報ヘッダには何種類かあるが、最初の4byteに「情報ヘッダサイズ」があるので、この値で区別する。
- '40' - Windowsフォーマット(BITMAPINFOHEADER)
- '12' - OS/2フォーマット(BITMAPCOREHEADER)
- 他にも、'BITMAPV4HEADER'(Windows95)や、'BITMAPV5HEAER'(Windows98/2000)があります。
これらは、色情報の付加や、圧縮コードにJPEGが追加されるなどされています。
- 「画像の高さ」は符号付きの値である。ただし、負数は一般的でない。
- 正数 - ボトムアップ(左下から右上)の順に、画像データは記録される。
- 負数 - トップダウン(左上から右下)の順に、画像データは記録される。
- 「色ビット数」
- 1 - 2 色ビットマップ
- 4 - 16 色ビットマップ
- 8 - 256 色ビットマップ
- (16 - 65536色(high color)ビットマップ 正式に対応していない)
- 24 - 1677万色(true color)ビットマップ
- 32 - 1677万色(true color)ビットマップ
- 「圧縮形式」
「圧縮形式」が0以外の値の場合には、「画像データサイズ」を0にすることはできない。
- 0 - BI_RGB(無圧縮)
- 1 - BI_RLE8(Run-Length-Encoded 8bits/pixel)
- 2 - BI_RLE4(Run-Length-Encoded 4bits/pixel)
- 3 - BI_BITFIELDS
- 「解像度」は96dpiのとき、3780となる。
- 「色ビット数」が1,4,8の場合には、「格納パレット数」に実際に使用されているカラーパレットの色数が記録されている。通常'0'に設定しても問題ない。0の場合は、「色ビット数」に相当するものとみなされる。
- 色ビット数:1 の場合 格納パレット数:2
- 色ビット数:4 の場合 格納パレット数:16
- 色ビット数:8 の場合 格納パレット数:256
パレットデータ (Palette Data)
パレットデータ [RGBQUAD] -Windows
| rgbBlue |
1byte |
unsigned char |
青 |
0〜255 |
| rgbGreen |
1byte |
unsigned char |
緑 |
0〜255 |
| rgbRed |
1byte |
unsigned char |
赤 |
0〜255 |
| rgbReserved |
1byte |
unsigned char |
予約領域 |
常に0 |
パレットデータ [RGBTRIPLE] -OS/2
| rgbBlue |
1byte |
unsigned char |
青 |
0〜255 |
| rgbGreen |
1byte |
unsigned char |
緑 |
0〜255 |
| rgbRed |
1byte |
unsigned char |
赤 |
0〜255 |
- 「パレットデータ」は「色ビット数」が1,4,8の場合に存在し、「画像データ」にはパレット番号が記録される。
- パレットは使用色数に関わらず、「色ビット数」に応じて、2,16,256個必要です。
- 「色ビット数」が24,32の場合は、「画像データ」には直接、色データが記録される。
画像データ
- 通常画像データは左下から右上に記録されています。つまり、上下が反転しています。
(「画像の高さ」に負数ならば、左上から右下に記録できるが、一般的ではない。)
例:記録される際のイメージ
<元データ>
| 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| --->  |
<画像データ>
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
|
|---|
- 画像データは行単位で記録され、行データはlong(4byte)の境界に揃えなければいけない。
揃わない場合は詰物(padding)をする。通常0を入れる。
(32bitビットマップの場合は、1画素あたり4byteなので、この問題はない。)
例:1画素1bitとしたとき
<元データ>
| 2 | 2 | 2 | 1 | 2 | 2 | 2 |
| 2 | 2 | 1 | 2 | 1 | 2 | 2 |
| 2 | 2 | 1 | 2 | 1 | 2 | 2 |
| 2 | 2 | 1 | 2 | 1 | 2 | 2 |
| 2 | 1 | 2 | 2 | 2 | 1 | 2 |
| 2 | 1 | 1 | 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 2 | 2 | 1 | 2 |
| 1 | 2 | 2 | 2 | 2 | 2 | 1 |
| --->  |
<画像データ>
| 1 | 2 | 2 | 2 | 2 | 2 | 1 | 0 |
| 2 | 1 | 2 | 2 | 2 | 1 | 2 | 0 |
| 2 | 1 | 1 | 1 | 1 | 1 | 2 | 0 |
| 2 | 1 | 2 | 2 | 2 | 1 | 2 | 0 |
| 2 | 2 | 1 | 2 | 1 | 2 | 2 | 0 |
| 2 | 2 | 1 | 2 | 1 | 2 | 2 | 0 |
| 2 | 2 | 1 | 2 | 1 | 2 | 2 | 0 |
| 2 | 2 | 2 | 1 | 2 | 2 | 2 | 0 |
|
|---|
- 画像データのサイズは、((((色ビット数 × 画像の幅) + 詰物) × 画像の高さ) / 8)となる。
- 色ビット数ごとには次のようになる。
- 1bitビットマップ
2個のパレットが必要です。
1画素あたり1bitで、パレット番号(0,1)が記録される。
例:パレットが(■■)のとき、画像データ(0x31)=(00110001(2))は8画素分を表現し、<■■■■■■■■>となる。
- 4bitビットマップ
使用色数に関わらず、16個のパレットが必要です。
1画素あたり4bitで、パレット番号(0〜15)が記録される。
例:パレットが(■■■■■■■■■■■■■■■■)のとき、画像データ(0x31)は2画素分を表現し、<■■>となる。
- 8bitビットマップ
使用色数に関わらず、256個のパレットが必要です。
1画素あたり8bit(1byte)で、パレット番号(0〜255)が記録される。
例:画像データ(0x31)のとき49番パレット(50番目)の値が使用される。
- 24bitビットマップ
1画素あたり24bit(3byte)で、Blue(8bit)、Green(8bit)、Red(8bit)の順番で色の値が記録される。
例:画像データ(0x99,0x00,0xFF)のとき■
- 32bitビットマップ
1画素あたり32bit(4byte)で、Blue(8bit)、Green(8bit)、Red(8bit)、Resered(8bit)の順番で色の値が記録される。Reseredには'0'が入る。
例:画像データ(0x99,0x00,0xFF,0x00)のとき■
圧縮形式
BI_RLE8(Run-Length-Encoded 8bits/pixel)
動作概要
| 第1バイト | 第2バイト | 意味 |
| 0x01〜0xFF | 0x00〜0xFF | コード化モード |
| 0x00 | 0x03〜0xFF | 絶対モード |
| 0x00 | 0x02 | データのオフセット |
| 0x00 | 0x01 | イメージの終端 |
| 0x00 | 0x00 | 行の終端 |
- 「色ビット数」が'8'、256色の圧縮方法。
- 「コード化モード」と「絶対モード」は必要に応じ、混在して使用される。
- 無圧縮データのように4byte境界に揃える必要はないが、各データごとにint(2byte)境界に揃える必要がある。
- コード化モード
-
第1バイト:連続する数(1〜255)
第2バイト:カラーインデックスコード
- 同じカラーインデックスコードが256以上連続しているときは、255単位で切り取る。
- 展開例:(展開後の16進数はパレット番号)
- 0x04 0xE5 -> 0xE5 0xE5 0xE5 0xE5
- 0x03 0xC8 -> 0xC8 0xC8 0xC8
- 0x02 0x9C -> 0x9C 0x9C
- 0x01 0x2F -> 0x2F
- 絶対モード
-
第1バイト:'0'
第2バイト:連続しないデータの数(3〜255)
第3バイト以降:カラーインデックスコード
- 第3バイト以降が奇数バイトの場合、詰物として'0'を入れる。
- 連続しないデータの数が2以下のときは、コード化モードで記録する。(エスケープコードと重なるため)
- 展開例:(展開後の16進数はパレット番号)
- 0x00 0x03 0x0A 0x11 0xFE 0x00 -> 0x0A 0x11 0xFE
- 0x00 0x04 0x0A 0x11 0xFE 0x00 -> 0x0A 0x11 0xFE 0x00
- データのオフセット
-
第1バイト:'0'
第2バイト:'2'
第3バイト:水平移動値(-128〜127)
第4バイト:垂直移動値(-128〜127)
- ピクセルのカラーインデックスの'0'が2段以上にわたって存在するとき、座標を移動する。
- イメージの終端・行の終端
-
第1バイト:'0'
第2バイト:'0'or'1'
- イメージの終端の直前の行の終端は省略されることもある。
BI_RLE4(Run-Length-Encoded 4bits/pixel)
- 「色ビット数」が'4'、16色の圧縮方法。
- BI_RLE8と構造は同じであり、当然int(2byte)境界に揃える必要がある。
- コード化モード展開例:(展開後の数字はパレット番号)
- 0x04 0xE5 -> E 5 E 5
- 0x03 0xC8 -> C 8 C
- 0x02 0x9C -> 9 C
- 0x01 0x20 -> 2
- 絶対モード展開例:(展開後の数字はパレット番号)
- 0x00 0x03 0x0A 0x10 -> 0 A 1
- 0x00 0x04 0x0A 0x11 -> 0 A 1 1
- 0x00 0x06 0x45 0x56 0x67 0x00 -> 4 5 5 6 6 7
Bitfields
- 16,32ビットビットマップに使用されるようだ。
- 使用する際は、「BITMAPINFOHEADER」直後に、RGB順に4*3(=12)byteのビットフィールドマスクが必要。
例:16bit 5-6-6の場合、(0x0000F800 0x000007E0 0x0000001F)
administrated by umekkii -> admin@umekkii.jp