Windows bitmap
| 拡張子 | .bmp |
|---|---|
| MIME Type | image/x-ms-bmp(非公式) |
| タイプコード | 'BMP ' 'BMPf' 'BMPp' |
| UTI | com.microsoft.bmp |
| マジックナンバー | BM |
| 開発者 | マイクロソフト |
| 種別 | ビットマップ画像 |
BMP(ビーエムピー、Microsoft Windows Bitmap Image)またはDIB(ディーアイビー、Device Independent Bitmap、デバイス独立ビットマップ)は、マイクロソフトとIBMがWindowsとOS/2にわかれる前のOSを共同で開発していた頃に作られた画像ファイル形式。圧縮の方法についても定義されているが、Windowsが標準では無圧縮のファイルを生成するため、他のアプリケーションにおいても無指定時は、圧縮はされていない場合が多い。
ファイル形式の細部の変更が何度か行われており、その結果としてWindowsとOS/2で多少ファイル形式が異なることがある。
機械独立のファイル形式として設計されたため、実際に存在する画像表示装置や、印刷装置が、画像を上方から処理するものがほぼ全てであるにもかかわらず、幾何学的なX軸、Y軸方向に座標を指定する形式となっている。その結果、画像を下から上に向かって記録している (Bottom up)のが特徴であるが、後に高さに負の値を指定することでその他大多数の画像ファイル形式と同じように画像を上から下へ向かって記録する (Top down)こともできるようになった。しかし互換性の面からProgramming Windowsではトップダウン形式のビットマップの作成を推奨していない。
なお、ビットマップという呼称は画像データの表現方式のひとつであり、本項で述べているマイクロソフト独自のファイル形式を必ずしも指すわけではない[1]。
目次 |
ファイル構造[編集]
ビットマップファイルは、以下のブロックに分かれている。
- ファイルヘッダ
- ビットマップファイルについての一般的な情報が格納されている。
- 情報ヘッダ
- ビットマップイメージについての詳細な情報が格納されている。
- カラーパレット
- インデックスカラービットマップの場合に使用される色の定義が格納されている。
- ビットマップデータ
- 実際のイメージがピクセルごとに格納されている。
主な構造[編集]
OS/2 1.1[編集]
| BITMAPFILEHEADER構造体 |
| BITMAPCOREHEADER構造体 |
| RGBTRIPLE構造体(インデックスカラー時) |
| 画像データ |
OS/2 2.x[編集]
| BITMAPFILEHEADER2構造体 |
| BITMAPINFOHEADER2構造体 |
| (要加筆)[4](インデックスカラー時) |
| 画像データ |
Windows 3.0以降[編集]
| BITMAPFILEHEADER構造体 |
| BITMAPINFOHEADER構造体 |
| RGBQUAD構造体(インデックスカラー時) |
| 画像データ |
Windows 95以降採用[編集]
| BITMAPFILEHEADER構造体 |
| BITMAPV4HEADER構造体 |
| RGBQUAD構造体(インデックスカラー時) |
| 画像データ |
Windows 98以降採用[編集]
| BITMAPFILEHEADER構造体 |
| BITMAPV5HEADER構造体 |
| RGBQUAD構造体(インデックスカラー時) |
| 画像データ |
ファイルヘッダ[編集]
BITMAPFILEHEADER[編集]
14byteからなる、ビットマップファイルのファイルヘッダである。
| オフセット | サイズ | 格納する情報 | 値・備考 |
| 0x0000 | 2 バイト | ファイルタイプ | 常にBM(0x42,0x4d)(マジックナンバー) |
| 0x0002 | 4 バイト | ファイルサイズ | ビットマップファイルのサイズを格納する(単位はバイト)。 |
| 0x0006 | 2 バイト | 予約領域1 | 常に0 |
| 0x0008 | 2 バイト | 予約領域2 | 常に0 |
| 0x000a | 4 バイト | オフセット | ファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット(単位はバイト)。 |
参考URL http://msdn.microsoft.com/en-us/library/dd183374(VS.85).aspx
情報ヘッダ[編集]
このブロックは、アプリケーションが画像を描画するための画像の詳細な情報が書かれており、14バイト目から始まる。
- 14-17(eh-11h)バイト目は、ヘッダのサイズが書かれている。値は、
40 - Windows V3 108 - Windows V4 124 - Windows V5 12 - OS/2 V1 64 - OS/2 V2
BITMAPCOREHEADER[編集]
OS/2のビットマップで使われる情報ヘッダで、12バイトある。
| オフセット | サイズ | 格納する情報 | 値・備考 |
| 0x000e | 4 バイト | ヘッダサイズ | 12 |
| 0x0012 | 2 バイト | ビットマップの横幅 | 単位はピクセル |
| 0x0014 | 2 バイト | ビットマップの縦幅 | 単位はピクセル |
| 0x0016 | 2 バイト | プレーン数※昔、EGAやVGAディスプレイカードで使われていた概念で、現在は全く使われない。 | 常に1 |
| 0x0018 | 2 バイト | 1ピクセルあたりのビット数 | 1,4,8,24 |
参考URL http://msdn.microsoft.com/en-us/library/dd183372(VS.85).aspx http://www.programmers@heaven.com/mb/graphics/148346/152845/re-planes/?S=B20000 (スパムフィルターに引っかかるためアドレスに@を入れています。@を除くこと)
BITMAPINFOHEADER[編集]
Windowsのビットマップで使われる情報ヘッダで、40バイトある。多くのビットマップがこの形式で保存されている。
| オフセット | サイズ | 格納する情報 | 値・備考 |
| 0x000e | 4 バイト | ヘッダサイズ | 40 |
| 0x0012 | 4 バイト | ビットマップの横幅 | 単位はピクセル |
| 0x0016 | 4 バイト | ビットマップの縦幅 | 単位はピクセル |
| 0x001a | 2 バイト | プレーン数 | 常に1 |
| 0x001c | 2 バイト | 1ピクセルあたりのビット数 | 0,1,4,8,16,24,32 |
| 0x001e | 4 バイト | 圧縮形式 | 0,1,2,3,4,5※1 |
| 0x0022 | 4 バイト | 画像データサイズ | 単位はバイト |
| 0x0026 | 4 バイト | 水平方向の解像度 | 単位はピクセル/m |
| 0x002a | 4 バイト | 垂直方向の解像度 | 単位はピクセル/m |
| 0x002e | 4 バイト | 使用する色数 | ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。 |
| 0x0032 | 4 バイト | 重要な色数 | ビットマップを表示するために必要なカラーインデックスの数。 |
参考URL http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx
BITMAPINFOHEADER2[編集]
OS/2 V2以降対応した、新しい情報ヘッダで、64byteある。 [5]
| オフセット | サイズ | 格納する情報 | 値・備考 |
| 0x000e | 4 バイト | ヘッダサイズ | 64 |
| 0x0012 | 4 バイト | ビットマップの横幅 | 単位はピクセル |
| 0x0016 | 4 バイト | ビットマップの縦幅 | 単位はピクセル |
| 0x001a | 2 バイト | プレーン数 | 常に1 |
| 0x001c | 2 バイト | 1ピクセルあたりのビット数 | 0,1,4,8,16,24,32 |
| 0x001e | 4 バイト | 圧縮形式 | 0,1,2,3,4,5※1 |
| 0x0022 | 4 バイト | 画像データサイズ | 単位はバイト |
| 0x0026 | 4 バイト | 水平方向の解像度 | 単位はピクセル/m |
| 0x002a | 4 バイト | 垂直方向の解像度 | 単位はピクセル/m |
| 0x002e | 4 バイト | 使用する色数 | ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。 |
| 0x0032 | 4 バイト | 重要な色数 | ビットマップを表示するために必要なカラーインデックスの数。 |
| 0x0036 | 2 バイト | 解像度の単位 | |
| 0x0038 | 2 バイト | 予約領域 | 常に0 |
| 0x003a | 2 バイト | ||
| 0x003c | 2 バイト | ||
| 0x003e | 4 バイト | サイズ値領域1 | |
| 0x0042 | 4 バイト | サイズ値領域2 | |
| 0x0046 | 4 バイト | ||
| 0x004a | 4 バイト | 予約領域 |
BITMAPV4HEADER[編集]
Windows 95、Windows NT 4.0から対応した新しい情報ヘッダ。
| オフセット | サイズ | 格納する情報 | 値・備考 |
| 0x000e | 4 バイト | ヘッダサイズ | 108 |
| 0x0012 | 4 バイト | ビットマップの横幅 | 単位はピクセル |
| 0x0016 | 4 バイト | ビットマップの縦幅 | 単位はピクセル |
| 0x001a | 2 バイト | プレーン数 | 常に1 |
| 0x001c | 2 バイト | 1ピクセルあたりのビット数 | 0,1,4,8,16,24,32 |
| 0x001e | 4 バイト | 圧縮形式 | 0,1,2,3,4,5※1 |
| 0x0022 | 4 バイト | 画像データサイズ | 単位はバイト |
| 0x0026 | 4 バイト | 水平方向の解像度 | 単位はピクセル/m |
| 0x002a | 4 バイト | 垂直方向の解像度 | 単位はピクセル/m |
| 0x002e | 4 バイト | 使用する色数 | ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。 |
| 0x0032 | 4 バイト | 重要な色数 | ビットマップを表示するために必要なカラーインデックスの数。 |
| 0x0036 | 4 バイト | 赤成分のカラーマスク | |
| 0x003a | 4 バイト | 緑成分のカラーマスク | |
| 0x003e | 4 バイト | 青成分のカラーマスク | |
| 0x0042 | 4 バイト | α成分のカラーマスク | |
| 0x0046 | 4 バイト | 色空間 | 0 |
| 0x004a | 36 バイト | CIEXYZTRIPLE構造体 | |
| 0x006e | 4 バイト | 赤成分のガンマ値 | |
| 0x0072 | 4 バイト | 緑成分のガンマ値 | |
| 0x0076 | 4 バイト | 青成分のガンマ値 |
参考URL http://msdn.microsoft.com/en-us/library/dd183380(VS.85).aspx
BITMAPV5HEADER[編集]
Windows 98、Windows 2000から対応した新しい情報ヘッダ。
| オフセット | サイズ | 格納する情報 | 値・備考 |
| 0x000e | 4 バイト | ヘッダサイズ | 124 |
| 0x0012 | 4 バイト | ビットマップの横幅 | 単位はピクセル |
| 0x0016 | 4 バイト | ビットマップの縦幅 | 単位はピクセル |
| 0x001a | 2 バイト | プレーン数 | 常に1 |
| 0x001c | 2 バイト | 1ピクセルあたりのビット数 | 0,1,4,8,16,24,32 |
| 0x001e | 4 バイト | 圧縮形式 | 0,1,2,3,4,5※1 |
| 0x0022 | 4 バイト | 画像データサイズ | 単位はバイト |
| 0x0026 | 4 バイト | 水平方向の解像度 | 単位はピクセル/m |
| 0x002a | 4 バイト | 垂直方向の解像度 | 単位はピクセル/m |
| 0x002e | 4 バイト | 使用する色数 | ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。 |
| 0x0032 | 4 バイト | 重要な色数 | ビットマップを表示するために必要なカラーインデックスの数。 |
| 0x0036 | 4 バイト | 赤成分のカラーマスク | |
| 0x003a | 4 バイト | 緑成分のカラーマスク | |
| 0x003e | 4 バイト | 青成分のカラーマスク | |
| 0x0042 | 4 バイト | α成分のカラーマスク | |
| 0x0046 | 4 バイト | 色空間 | 0,0x73524742,0x57696e20,0x4c494e4b,0x4d424544 |
| 0x006a | 36 バイト | CIEXYZTRIPLE構造体 | |
| 0x006e | 4 バイト | 赤成分のガンマ値 | |
| 0x0072 | 4 バイト | 緑成分のガンマ値 | |
| 0x0076 | 4 バイト | 青成分のガンマ値 | |
| 0x007a | 4 バイト | レンダリングの意図 | 1,2,4,8 |
| 0x007e | 4 バイト | プロファイルデータのオフセット | 情報ヘッダの先頭アドレスからプロファイルデータの先頭アドレスまでのオフセット。単位はバイト |
| 0x0082 | 4 バイト | プロファイルデータのサイズ | 単位はバイト |
| 0x0086 | 4 バイト | 予約領域 | 常に0 |
参考URL http://msdn.microsoft.com/en-us/library/dd183381(VS.85).aspx
※1 数字と定義されている圧縮形式の関係は以下の通り
0 - 無圧縮 (識別子はBI_RGB) 1 - 8ビット/ピクセル RLE (識別子はBI_RLE8) 2 - 4ビット/ピクセル RLE (識別子はBI_RLE4) 3 - ビットフィールド (識別子はBI_BITFIELDS) 4 - JPEG画像 (識別子はBI_JPEG) 5 - PNG画像 (識別子はBI_PNG)
カラーパレット[編集]
このブロックは、画像内で使用される色を定義している。上述の通り、ビットマップ画像はピクセルごとに保存されている。各ピクセルは、1バイト以上を使用して値を保持している。したがって、各値と実際の色の関係を、アプリケーションに教えることがカラーパレットの目的である。
典型的なビットマップファイルはRGBカラーモデルを使用している。このモデルにおいて、色は赤(R)、緑(G)、青(B)のそれぞれの強さ(0-255)で表される。
RGBTRIPLE[編集]
1色3バイトで表記する形式
| バイト数 | 情報 | 値・備考 |
| 1 byte | 青 | 0-255 |
| 1 byte | 緑 | 0-255 |
| 1 byte | 赤 | 0-255 |
RGBQUAD[編集]
1色4バイトで表記する形式
| バイト数 | 情報 | 値・備考 |
| 1 byte | 青 | 0-255 |
| 1 byte | 緑 | 0-255 |
| 1 byte | 赤 | 0-255 |
| 1 byte | 予約領域 |
ビットマップデータ[編集]
このブロックは、イメージを各ピクセルごとに記述する。ピクセルは通常左から右へ、下から上に向かって保存されている。各ピクセルは1バイト以上で記述されている。もし水平方向のバイト数が4の倍数ではないときは、Null(0x00)で埋めて4の倍数にする。
BMPを読み書きするマクロ(Excel VBA)の例[編集]
BMP画像の詳細なファイル構造は、例えば、BMP画像をバイナリエディタで開くことで調べることができる。 また、多くのプログラミング言語は、バイナリデータを取得/編集するための関数や、メソッドを 備えているため、それらのものを使うことで、BMPのバイナリデータから、 ヘッダ情報や、画素情報を取得し、編集することが可能である。
BMPのバイナリデータを理解/解説するにあたり、特に、「走査線の切り上げ」、「リトルエンディアン」に関する説明は、 簡単なプログラムで例示するのが容易である。そこで、「走査線の切り上げ」、「リトルエンディアン」等の概念の理解を補助するために、 以下に、Excel VBAを用いた、マクロプログラムを例示する。[2][3]
- 簡易な画素情報取得(読み込み)用マクロ”Sub BMP_read”
- 簡易な画素情報出力(書き出し)用マクロ”Sub BMP_write”
Sub BMP_readの解説[編集]
”Sub BMP_read”の機能を説明する。本マクロは、Windows BMP画像をExcelのワークシート上に読み込む機能を有する。具体的には、
- 24BitのWindows bitmapファイルの画素データをExcelのワークシート上のセルそれぞれに"R1XXXG1YYYBZZZ"のように、テキストとして書き出す機能と、
- Excelのワークシート上のセルそれぞれを、前記の"R1XXXG1YYYBZZZ"に対応した色で塗りつぶす機能と、
を備える。さらに、
- 所謂「走査線の切り上げ」の機能をも供える。
即ち、通常のBMP画像では、「3*width mod 4 <>0」の場合には、1行あたりのバイト数(Line)にダミーのデータが、
- Offs = 4 - ((3 * Width) Mod 4)
だけ乗っているがそのデータを読み飛ばす機能を備える。
Sub BMP_readのソースコード[編集]
Sub BMP_writeの解説[編集]
”Sub BMP_Write”は、 ”Sub BMP_READ”による画像読み込み結果と同様のルールで記載された画像データから、 画像の幅、画像の高さ及び個々の画素情報を読み出し、BMP画像として出力する機能を備えるExcel VBAのマクロである。
本マクロの主な仕様は下記の通りである。
- Excel上の特定のセルに、「R1XXXG1YYYB1ZZZ」の形で記載された情報をそれぞれ判読する機能(Sub cell_analys(charac, cel_rep))を備える。
- 幅(Width)をピクセル数として取得する幅取得機能を備え、前記の幅取得機能は、「第1行目を左から右へスキャンして、Sub cell_analys(charac, cel_rep)にて、それぞれのセルの内容を判読し、最初にデータが切れたところでカウントを止める」ことを特徴とする。
- 高さ(Height)をピクセル数として取得する高さ取得機能を備え、前記の高さ取得機能は、「第1列目を上から下へスキャンし、Sub cell_analys(charac, cel_rep)にて、それぞれのセルの内容を判読し、最初にデータが切れたところでカウントを止める」ことを特徴とする。
- 前記の方法で指定されたワークシート上の幅Width,高さHeightの領域内のすべてのセルを、Sub cell_analys(charac, cel_rep)にて、それぞれのセルの内容を判読する機能を備え、前記の領域内に空白あるいは、判読不能のセルがあった場合には、とりあえずの値(R1000G1000B1000)を判読結果として採用することを特徴とする。
Sub BMP_write のソースコード[編集]
注記[編集]
- ^ より一般的な意味合いについてはビットマップ画像の項を参考。
- ^ これらのマクロは、Excel2010を用いて作成/検証した。また、 画像の入出力の結果については、バイナリエディタ(記事バイナリエディタ記載のVBAマクロ及び、Stirling)画像ソフト (ImageJおよびIrfanView)との比較にて検証した。但し、本マクロは、飽くまで、Bitmap画像の仕様の理解を補助する ことを目的としたものであるため、エラー排除(たとえばMod関数INT関数のオーバーフロー等)対策は、最低限度しか備えない。 さらに、上記マクロはExcelのマクロであるためExcelの仕様限界の制限をうける。また、特に色で塗りつぶす機能を有効にした場合、 一つの画像を開くのに相応の時間を要することになる。 (Intel Core i5を搭載したパソコンを用いた場合で、Height 256 ピクセル Width 256ピクセルの 画像を読み込んだ場合、読み込みに5分程度の時間を要す。) アルゴリズムの解説、参考とした記事については、ソースコード中にコメントとして記載する。
- ^ ExcelVBA(Access VBA)を用いた画像処理用マクロとして、上記マクロとは別に、ExcelVBA用画像処理クラスclGdiPlusが既に開示されている。 [1] [2] また、さらに別のマクロとして、他にも例えば [3] 等が開示されている。
関連項目[編集]
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||