Windows bitmap
拡張子 | .bmp, .dib[1][2] |
---|---|
MIMEタイプ | image/bmp[3] |
タイプコード | 'BMP ' 'BMPf' 'BMPp' |
UTI | com.microsoft.bmp |
マジック ナンバー | BM |
開発者 | マイクロソフト |
種別 | ビットマップ画像 |
英: Microsoft Windows bitmap image)または (ディーアイビー、英: device independent bitmap、デバイス独立ビットマップ)は、マイクロソフトとIBMがWindowsとOS/2にわかれる前のオペレーティングシステムを共同で開発していた頃に作られた画像ファイル形式。圧縮の方法についても定義されているが、Windowsが標準では無圧縮のファイルを生成するため、他のアプリケーションにおいても無指定時は、圧縮はされていない場合が多い。
(ビーエムピー、ファイル形式の細部の変更が何度か行われており、その結果としてWindowsとOS/2で多少ファイル形式が異なることがある。
機械独立のファイル形式として設計されたため、実際に存在する画像表示装置(ディスプレイ)や印刷装置(プリンター)が、画像を上方から処理するものがほぼ全てであるにもかかわらず、幾何学的なX軸、Y軸方向に座標を指定する形式となっている。その結果、画像を下から上に向かって記録するボトムアップ形式となっていることが特徴であるが、後に高さに負の値を指定することでその他大多数の画像ファイル形式と同じように画像を上から下へ向かって記録するトップダウン形式を使用することもできるようになった。しかし互換性の面からマイクロソフトはトップダウン形式のビットマップの作成を推奨していない。また、トップダウン形式では後述の圧縮をすることができない。
なお、ビットマップという呼称は画像データの表現方式のひとつであり、本項で述べているマイクロソフト独自のファイル形式を必ずしも指すわけではない[4]。
ファイル構造
ビットマップファイルは、以下のブロックに分かれている。
- ファイルヘッダ
- ビットマップファイルについての一般的な情報が格納されている。
- 情報ヘッダ
- ビットマップイメージについての詳細な情報が格納されている。
- カラーマスク
- ビットフィールド形式のビットマップで使用されるデータが格納される。
- カラーパレット
- インデックスカラービットマップの場合に使用される色の定義が格納されている。
- ダイレクトカラービットマップの場合は減色時に優先される色が格納される。
- ビットマップデータ
- 実際のイメージがピクセルごとに格納されている。
- カラープロファイル
- ICCプロファイルデータそのものか、プロファイルデータのファイルパスが格納される。
主な構造
OS/2 1.1
BITMAPFILEHEADER
構造体BITMAPCOREHEADER
構造体- カラーパレット(
RGBTRIPLE
構造体) - 画像データ
OS/2 2.x
BITMAPFILEHEADER
2構造体BITMAPINFOHEADER2
構造体- カラーパレット(RGB2構造体)
- 画像データ
Windows 3.0以降
BITMAPFILEHEADER
構造体BITMAPINFOHEADER
構造体- カラーマスク(ビットフィールド形式のみ)
- カラーパレット(
RGBQUAD
構造体) - 画像データ
Windows 95以降採用
BITMAPFILEHEADER
構造体BITMAPV4HEADER
構造体- カラーパレット(
RGBQUAD
構造体) - 画像データ
Windows 98以降採用
BITMAPFILEHEADER
構造体BITMAPV5HEADER
構造体- カラーパレット(
RGBQUAD
構造体) - 画像データ
- カラープロファイル
ファイルヘッダ
BITMAPFILEHEADER
14バイトからなる、ビットマップファイルのファイルヘッダである。
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000016 | 2バイト | ファイルタイプ | 常に4216, 4D16(マジックナンバー) |
000216 | 4バイト | ファイルサイズ | ビットマップファイルのサイズを格納する(単位はバイト)。 |
000616 | 2バイト | 予約領域1 | 常に 0016, 0016 |
000816 | 2バイト | 予約領域2 | 常に 0016, 0016 |
000A16 | 4バイト | オフセット | ファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット(単位はバイト)。 |
参考URL
BITMAPFILEHEADER
2
OS/2 2.xで使用されたファイルヘッダ。BITMAPFILEHEADER
を拡張したものだがサイズは同じ。
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000016 | 2バイト | ファイルタイプ | 4216, 4D16(ビットマップ) 4916, 4316(モノクロアイコン) 4316, 4916(カラーアイコン) 5016, 5416(モノクロポインタ) 4316, 5016(カラーポインタ) |
000216 | 4バイト | ヘッダサイズ | ファイルヘッダと情報ヘッダの合計サイズを格納する。単位はバイト。 |
000616 | 2バイト | ホットスポットx | ポインタのホットスポットのx座標 |
000816 | 2バイト | ホットスポットy | ポインタのホットスポットのy座標 |
000A16 | 4バイト | オフセット | ファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット。単位はバイト。 |
- モノクロアイコン、モノクロポインタは1bitモノクロ画像のみサポートしている。
- カラーアイコン、カラーポインタは1ファイル内に透過位置を示す1bitモノクロ画像とカラー情報を表す画像を併せ持つ特殊なファイル構造をしている。
情報ヘッダ
このブロックは、アプリケーションが画像を描画するための画像の詳細な情報が書かれており、14バイト目から始まる。
14-17 (0E16-1116) バイト目は、ヘッダのサイズが書かれている。最大値は、
- 40 -
BITMAPFILEHEADER
- 108 -
BITMAPV4HEADER
- 124 -
BITMAPV4HEADER
- 12 -
BITMAPCOREHEADER
- 64 - OS/2 V2
BITMAPCOREHEADER
OS/2のビットマップで使われる情報ヘッダで、12バイトある。coreヘッダと呼ばれる。
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000E16 | 4バイト | ヘッダサイズ | 12 |
001216 | 2バイト | ビットマップの横幅 | 単位はピクセル |
001416 | 2バイト | ビットマップの縦幅 | 単位はピクセル |
001616 | 2バイト | プレーン数 | 常に1 |
001816 | 2バイト | 1ピクセルあたりのビット数 | 1,4,8,24 |
参考URL
BITMAPCOREHEADER
(wingdi.h) - Win32 apps | Microsoft Docs- http://www.programmers@heaven.com/mb/graphics/148346/152845/re-planes/?S=B20000
(スパムフィルターに引っかかるためアドレスに@を入れています。@を除くこと)
BITMAPINFOHEADER
Windowsのビットマップで使われる情報ヘッダで、40バイトある。多くのビットマップがこの形式で保存されている。infoヘッダと呼ばれる。
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000E16 | 4バイト | ヘッダサイズ | 40(2816, 0016, 0016, 0016) |
001216 | 4バイト | ビットマップの横幅 | 単位はピクセル |
001616 | 4バイト | ビットマップの縦幅 | 単位はピクセル。値が負の場合はトップダウン画像となる |
001A16 | 2バイト | プレーン数 | 常に1(0116, 0016) |
001C16 | 2バイト | 1ピクセルあたりのビット数 | 0,1,4,8,16,24,32 |
001E16 | 4バイト | 圧縮形式 | 0,1,2,3,4,5 ※1 |
002216 | 4バイト | 画像データサイズ | 単位はバイト |
002616 | 4バイト | 水平方向の解像度 | 単位はピクセル/m |
002A16 | 4バイト | 垂直方向の解像度 | 単位はピクセル/m |
002E16 | 4バイト | 使用する色数 | ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。 |
003216 | 4バイト | 重要な色数 | ビットマップを表示するために必要なカラーインデックスの数。 |
参考URL
BITMAPINFOHEADER2
OS/2 V2以降対応した情報ヘッダである。サイズは可変であり、最大64バイト。Windowsでは対応していない。 [1]
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000E16 | 4バイト | ヘッダサイズ | 16~64(可変長) |
001216 | 4バイト | ビットマップの横幅 | 単位はピクセル |
001616 | 4バイト | ビットマップの縦幅 | 単位はピクセル |
001A16 | 2バイト | プレーン数 | 常に1 |
001C16 | 2バイト | 1ピクセルあたりのビット数 | 1,4,8,24 |
001E16 | 4バイト | 圧縮形式 | 0(非圧縮),1(8bit RLE),2(4bit RLE),3(1bitハフマン符号圧縮),4(24bit RLE) |
002216 | 4バイト | 画像データサイズ | 単位はバイト。非圧縮の場合は0を入れても良い |
002616 | 4バイト | 水平方向の解像度 | 単位は「解像度の単位」で指定される |
002A16 | 4バイト | 垂直方向の解像度 | |
002E16 | 4バイト | 使用する色数 | ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。 |
003216 | 4バイト | 重要な色数 | ビットマップを表示するために必要なカラーインデックスの数。 |
003616 | 2バイト | 解像度の単位 | 0(ピクセル/m) |
003816 | 2バイト | 予約領域 | 常に0 |
003A16 | 2バイト | 記録方式 | 0(ボトムアップ) |
003C16 | 2バイト | ハーフトーンの方式 | 0(ハーフトーンなし), 1(誤差拡散法), 2(PANDA), 3(Super Circle) |
003E16 | 4バイト | ハーフトーン時のパラメータ1 | |
004216 | 4バイト | ハーフトーン時のパラメータ2 | 誤差拡散法の場合は無視される |
004616 | 4バイト | 符号化方式 | 0(RGB2、RGBQUAD に相当)
|
004A16 | 4バイト | 識別子 | アプリケーションが独自に使用してもよい領域 |
この節の加筆が望まれています。 |
BITMAPV3INFOHEADER
Adobe Photoshopで使用されていた情報ヘッダ。infoヘッダにRGBとα成分のカラーマスクを取り込んだ56バイトのヘッダで、便宜上V3ヘッダと呼ばれる。
Adobe社によると、V3ヘッダの仕様は、過去にMicrosoftから取り寄せた文書に記載されていたそうである[5]。
BITMAPV4HEADER
Windows 95、Windows NT 4.0から対応した情報ヘッダ。V4ヘッダと呼ばれる。
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000E16 | 4バイト | ヘッダサイズ | 108 |
001216 | 4バイト | ビットマップの横幅 | BITMAPINFOHEADER と同等
|
001616 | 4バイト | ビットマップの縦幅 | |
001A16 | 2バイト | プレーン数 | |
001C16 | 2バイト | 1ピクセルあたりのビット数 | |
001E16 | 4バイト | 圧縮形式 | |
002216 | 4バイト | 画像データサイズ | |
002616 | 4バイト | 水平方向の解像度 | |
002A16 | 4バイト | 垂直方向の解像度 | |
002E16 | 4バイト | 使用する色数 | |
003216 | 4バイト | 重要な色数 | |
003616 | 4バイト | 赤成分のカラーマスク | |
003A16 | 4バイト | 緑成分のカラーマスク | |
003E16 | 4バイト | 青成分のカラーマスク | |
004216 | 4バイト | α成分のカラーマスク | |
004616 | 4バイト | 色空間 | 0(ヘッダ内で定義) |
004A16 | 36バイト | CIEXYZTRIPLE構造体 | 色空間が0の場合のみ有効 |
006E16 | 4バイト | 赤成分のガンマ値 | 色空間が0の場合のみ有効 整数部を16ビットとし指数部を16ビットとする固定小数点数 |
007216 | 4バイト | 緑成分のガンマ値 | |
007616 | 4バイト | 青成分のガンマ値 |
参考URL
BITMAPV5HEADER
Windows 98、Windows 2000から対応した情報ヘッダ。V5ヘッダと呼ばれる。
オフセット | サイズ | 格納する情報 | 値・備考 |
---|---|---|---|
000E16 | 4バイト | ヘッダサイズ | 124 |
001216 | 4バイト | ビットマップの横幅 | BITMAPINFOHEADER と同じ定義
|
001616 | 4バイト | ビットマップの縦幅 | |
001A16 | 2バイト | プレーン数 | |
001C16 | 2バイト | 1ピクセルあたりのビット数 | |
001E16 | 4バイト | 圧縮形式 | |
002216 | 4バイト | 画像データサイズ | |
002616 | 4バイト | 水平方向の解像度 | |
002A16 | 4バイト | 垂直方向の解像度 | |
002E16 | 4バイト | 使用する色数 | |
003216 | 4バイト | 重要な色数 | |
003616 | 4バイト | 赤成分のカラーマスク | BITMAPV4HEADER と同じ定義
|
003A16 | 4バイト | 緑成分のカラーマスク | |
003E16 | 4バイト | 青成分のカラーマスク | |
004216 | 4バイト | α成分のカラーマスク | |
004616 | 4バイト | 色空間 | 0(ヘッダ内で定義), 7352474216('sRGB'), 57696E2016('Win '), 4C494E4b16('LINK'), 4D42454416('MBED') |
006A16 | 36バイト | CIEXYZTRIPLE構造体 | BITMAPV4HEADER と同じ定義
|
006E16 | 4バイト | 赤成分のガンマ値 | |
007216 | 4バイト | 緑成分のガンマ値 | |
007616 | 4バイト | 青成分のガンマ値 | |
007A16 | 4バイト | レンダリングの意図 | 1,2,4,8 |
007E16 | 4バイト | プロファイルデータのオフセット | 情報ヘッダの先頭アドレスからプロファイルデータの先頭アドレスまでのオフセット。単位はバイト |
008216 | 4バイト | プロファイルデータのサイズ | 単位はバイト |
008616 | 4バイト | 予約領域 | 常に0 |
参考URL
各フィールドの詳細
プレーン数
過去に、EGAやVGAディスプレイカードで使われていた概念で、現在は全く使われない。
この概念が使われていた頃は、実際の色深度を「1ピクセルあたりのビット数×プレーン数」で算出する必要があった。
圧縮形式
※1 数値と定義されている圧縮形式の関係は以下の通り[6]
- 0 - 無圧縮(識別子はBI_RGB)
- 1 - 8ビット/ピクセル RLE(識別子はBI_RLE8)
- 2 - 4ビット/ピクセル RLE(識別子はBI_RLE4)
- 3 - ビットフィールド(識別子はBI_BITFIELDS)
- 4 - JPEG画像(識別子はBI_JPEG)
- 5 - PNG画像(識別子はBI_PNG)
上記以外の圧縮形式は以下の通り
- 3 - 1ビットハフマン符号化(OS/2 2.x、識別子はHUFFMAN_1D)
- 4 - 24ビット/ピクセル RLE(OS/2 2.x、識別子はRLE_24)
- 6 - アルファチャンネル付きビットフィールド(Windows CE 5.0、識別子はBI_ALPHABITFIELDS)
水平・垂直方向の解像度
画像の表示に適したデバイスの解像度を指定する。この値を設定することで、例えばソフトウェアが画面の解像度に合った最適なサイズの画像を選択できるようになる。
色空間
V4ヘッダで、Win
(スペースを含めた4バイト)とsRGB
が使用できるというドキュメントが存在する。
カラーマスク
カラーマスクはビットフィールド形式が使用されているビットマップから各色成分を取り出す際に使用されるデータである。赤成分、緑成分、青成分の順で書かれており、それぞれ4バイト、合計12バイトである。 Windows CEで圧縮形式に「アルファチャンネル付きビットフィールド」を使用した場合は、この後ろにα成分のカラーマスクが置かれ合計16バイトになる。
カラーマスクブロックは、情報ヘッダがINFOヘッダかつビットフィールド形式が使用されている場合に必ず存在する。 V4、V5ヘッダの場合は、ヘッダ内に値が格納されるためこのブロックは置く必要がない。
1ピクセルあたりのビット数とカラーマスクの組み合わせが以下である場合は、圧縮形式を非圧縮に設定し、カラーマスクブロックを省略できる。
16ビット | 32ビット | |
---|---|---|
赤成分のカラーマスク | 00007C0016 | 00FF000016 |
緑成分のカラーマスク | 000003E016 | 0000FF0016 |
青成分のカラーマスク | 0000001F16 | 000000FF16 |
カラーパレット
このブロックは、画像内で使用される色を定義している。上述の通り、ビットマップ画像はピクセルごとに保存されている。各ピクセルは、1バイト以上を使用して値を保持している。したがって、各値と実際の色の関係を、アプリケーションに教えることがカラーパレットの目的である。
典型的なビットマップファイルはRGBカラーモデルを使用している。このモデルにおいて、色は赤 (R)、緑 (G)、青 (B) のそれぞれの強さ (0-255) で表される。
RGBTRIPLE
1色3バイトで表記する形式。情報ヘッダがcoreヘッダの場合のみ使用される。
バイト数 | 情報 | 値・備考 |
---|---|---|
1バイト | 青 | 0016-FF16 |
1バイト | 緑 | 0016-FF16 |
1バイト | 赤 | 0016-FF16 |
参考:
RGBQUAD
1色4バイトで表記する形式、OS/2ビットマップにおけるRGB2もこちらに相当する。
バイト数 | 情報 | 値・備考 |
---|---|---|
1バイト | 青 | 0016-FF16 |
1バイト | 緑 | 0016-FF16 |
1バイト | 赤 | 0016-FF16 |
1バイト | 予約領域 |
参考:
ビットマップデータ
このブロックは、イメージを各ピクセルごとに記述する。ピクセルは通常、左下から右下へ、これを下から上に向かって保存する。各ピクセルは1バイト以上で記述されている。直接RGBデータが置かれる場合のデータ順は、上項カラーパレットに準ずる。水平方向のバイト数が4の倍数ではないときは、0016で埋めて4の倍数にする。
カラープロファイル
このブロックは、情報ヘッダの「色空間」が'LINK'の場合はカラープロファイルデータのファイルパスが、'MBED'の場合はデータそのものが格納される。 ファイルヘッダの「オフセット」の値によってはビットマップデータよりも前に格納することも出来る。
BMPを取り扱うプログラムライブラリ
プログラムでBMP画像を平易に扱うためのライブラリも数多く存在している。
- Windows API (GDI), HBITMAP[7]
- ビットマップデータを管理するオブジェクトハンドル。BMP形式画像をファイルやリソースから読み込んでHBITMAPを生成することのできる各種C言語形式関数が用意されている。Windowsデスクトップアプリケーション専用。
- Microsoft Foundation Class (MFC), CBitmapクラス[8]
- マイクロソフトが提供している開発環境であるVisual C++に付属する、ビットマップ操作クラス。Win32 APIのラッパー。Windowsデスクトップアプリケーション専用。
- Active Template Library (ATL), ATL::CImageクラス[9]
- マイクロソフトが提供している開発環境であるVisual C++に付属する、ビットマップ操作クラス。Win32 APIおよびGDI+のラッパー。Windowsデスクトップアプリケーション専用。
- Windows SDKに付属する、C++言語専用のビットマップ操作クラス。Windowsデスクトップアプリケーション専用。
- COMベースの画像ライブラリ。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。
- .NET Framework, System.Drawing[11]
- .NET Framework, System.Windows.Media.Imaging[13]
- WICのマネージラッパー。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。
サードパーティ製のライブラリに関しての各詳細は、外部リンクの項に記載している。
脚注
- ^ DIB(Device Independent Bitmap)とは - IT用語辞典 e-Words
- ^ 例えばMicrosoft Paintのファイルダイアログの拡張子フィルターでは.bmpのほかに.dibもサポートしている。
- ^ Windows Bitmap Media Type Registration Application
- ^ より一般的な意味合いについてはビットマップ画像の項を参考。
- ^ Invalid BMP Format with Alpha channel
- ^ [MS-WMF]: Compression Enumeration | Microsoft Docs
- ^ Windows Data Types - Windows applications | Microsoft Docs
- ^ CBitmap Class | Microsoft Docs
- ^ CImage Class | Microsoft Docs
- ^ Bitmap (gdiplusheaders.h) | Microsoft Docs
- ^ System.Drawing Namespace | Microsoft Docs
- ^ Drawing | Mono
- ^ System.Windows.Media.Imaging Namespace | Microsoft Docs