BMPファイル形式、またはビットマップは、特にMicrosoft Windows [ 2 ]およびOS/2 [ 3 ]オペレーティングシステム上で、ディスプレイデバイス(グラフィックアダプタなど)とは独立してビットマップデジタル画像を保存するために使用されるラスターグラフィック画像ファイル形式です。
BMPファイル形式は、さまざまな色深度の2次元デジタル画像を保存でき、オプションでデータ圧縮、アルファチャンネル、カラープロファイルも保存できます。Windowsメタファイル(WMF)仕様はBMPファイル形式をカバーしています。[ 4 ]
マイクロソフトは、さまざまな内部表現を持つデバイスやアプリケーション間でビットマップを交換する際に役立つよう、異なる色深度のカラービットマップの特定の表現方法を定義しました。これをデバイス非依存ビットマップ(DIB)と呼び、そのファイル形式をDIBファイル形式またはBMP画像ファイル形式と呼んでいます。
マイクロソフトのサポートによると:[ 5 ]
デバイス非依存ビットマップ(DIB)は、さまざまな色解像度でデバイス非依存ビットマップを定義するために使用されるフォーマットです。DIBの主な目的は、ビットマップをあるデバイスから別のデバイスに移動できるようにすることです(そのため、名前に「デバイス非依存」という部分があります)。DIBは外部フォーマットであり、システム内でビットマップオブジェクト(アプリケーションによって作成される)として表示されるデバイス依存ビットマップとは対照的です。DIBは通常、メタファイル(通常はStretchDIBits()関数を使用)、BMPファイル、およびクリップボード(CF_DIBデータフォーマット)で転送されます。
以下のセクションでは、BMP ファイルまたは DIB に格納されているデータについて詳しく説明します。これは標準の BMP ファイル形式です。[ 5 ]一部のアプリケーションは、Microsoft のドキュメントに準拠していないビットマップ画像ファイルを作成します。また、すべてのフィールドが使用されるわけではなく、使用されていないフィールドには 0 の値が格納されます。
ビットマップ画像ファイルは、固定サイズの構造体(ヘッダー)と、あらかじめ定められた順序で出現する可変サイズの構造体で構成されています。このファイル形式は長年にわたって進化してきたため、これらの構造体の中には、さまざまなバージョンが存在する可能性があります。
図1を参照すると、ビットマップファイルは以下の順序で構造から構成されている。
メモリにロードされたビットマップ画像ファイルは、Windows GDI API の重要なコンポーネントである DIB データ構造になります。メモリ内の DIB データ構造は、BMP ファイル形式とほぼ同じですが、14 バイトのビットマップファイルヘッダーは含まれておらず、DIB ヘッダーから始まります。メモリにロードされた DIB の場合、カラー テーブルは、明示的な RGB カラー定義の代わりに、現在実現されているパレット[ 7 ]へのインデックスを構成する 16 ビット エントリ(追加の間接レベル) で構成されることもあります。すべての場合において、ピクセル配列は 4 バイトの倍数であるメモリ アドレスから開始する必要があります。メモリにロードされた非パック DIB では、オプションのカラー プロファイル データは、カラー テーブルの直後、ギャップ 1 とピクセル配列[ 6 ]の前に配置する必要があります(図 1 とは異なります)。
gap1 と gap2 のサイズがゼロの場合、メモリ内の DIB データ構造は慣習的に「パック DIB」と呼ばれ、DIB ヘッダーの先頭を指す単一のポインタで参照できます。すべての場合において、ピクセル配列は 4 バイトの倍数であるメモリ アドレスから開始する必要があります。場合によっては、ピクセル配列のメモリ アドレスを 4 バイトの倍数に強制するために、カラー テーブルのエントリ数を調整する必要があるかもしれません。[ 7 ] メモリにロードされた「パック DIB」の場合、オプションのカラー プロファイル データは、図 1 (gap1=0 および gap2=0 の場合) に示すように、ピクセル配列の直後に続く必要があります。[ 6 ] 「パック DIB」は、 Windowsクリップボード API 関数、および一部の Windows パターン ブラシとリソース関数 で必要とされます。 [ 8 ]
このバイトブロックはファイルの先頭にあり、ファイルの識別に使用されます。一般的なアプリケーションでは、まずこのブロックを読み込んで、ファイルが実際にBMPファイルであり、破損していないことを確認します。BMPファイル形式の最初の2バイトは、ASCIIエンコーディングで文字「B」と文字「M」です。すべての整数値はリトルエンディアン形式(最下位バイトが先)で格納されます。
このバイトブロックは、画面に画像を表示するために使用される画像に関する詳細情報をアプリケーションに伝えます。このブロックは、Windows および OS/2 が内部的に使用するヘッダーとも一致し、いくつかの異なるバリアントがあります。それらすべてに、サイズを指定する dword (32 ビット) フィールドが含まれているため、アプリケーションは画像で使用されているヘッダーを簡単に判別できます。異なるヘッダーが存在する理由は、Microsoft が DIB フォーマットを複数回拡張したためです。新しい拡張ヘッダーは、古いヘッダーの代わりに一部の GDI 関数で使用でき、より多くの機能を提供します。GDI はビットマップ ファイルを読み込む関数をサポートしているため、一般的な Windows アプリケーションはその機能を使用します。この結果、そのようなアプリケーションでは、サポートされる BMP フォーマットが、実行中の Windows バージョンでサポートされているフォーマットと一致します。詳細については、以下の表を参照してください。
Windows 2.x の BITMAPCOREHEADER は、OS/2 1.x の BITMAPCOREHEADER (上記の表に示す) と、画像の幅と高さのフィールドが符号なし整数ではなく符号付き整数であるという点で異なります。[ 12 ]
BITMAPINFOHEADER以降のバージョンでは、前のバージョンのヘッダーの末尾にフィールドが追加されるだけです。たとえば、BITMAPV2INFOHEADER はBITMAPINFOHEADERにフィールドを追加し、BITMAPV3INFOHEADER はBITMAPV2INFOHEADERにフィールドを追加します。
統合アルファチャンネルは、非公開のBITMAPV3INFOHEADERと、公開されているBITMAPV4HEADER ( Windows 95以降)で導入され、Windows XPのログオンおよびテーマシステム、Microsoft Office(バージョン2000以降)で使用されています。また、Adobe Photoshop(バージョン7以降)やAdobe Flash (バージョンMX 2004以降、当時はMacromedia Flashとして知られていました)などの一部の画像編集ソフトウェアでサポートされています。さらに、 GIMP、Google Chrome、Microsoft PowerPoint、Microsoft Wordでもサポートされています。
互換性上の理由から、ほとんどのアプリケーションはファイルの保存に古いDIBヘッダーを使用しています。Windows 2000以降はOS/2のサポートが終了したため、現在Windowsで一般的に使用されている形式はBITMAPINFOHEADERヘッダーです。詳細は次の表を参照してください。特に明記されていない限り、すべての値は符号なし整数として格納されます。
圧縮方法(オフセット30)は以下のいずれかです。
OS/2 2.x OS22XBITMAPHEADER ( IBM のドキュメントではBITMAPINFOHEADER2 ) には 24 バイトが追加されています: [ 3 ]
ハーフトーン処理アルゴリズム(オフセット60)は以下のいずれかです。
カラーテーブル(パレット)は、BMP 画像ファイル内で、BMP ファイル ヘッダー、DIB ヘッダーの直後、およびBI_BITFIELDS (12 バイト) または BI_ALPHABITFIELDS (16 バイト) オプションを指定したBITMAPINFOHEADERヘッダーを使用した場合のオプションの 3 つまたは 4 つのビットマスクの直後に配置されます。したがって、そのオフセットは、 BITMAPFILEHEADERのサイズと DIB ヘッダーのサイズ (さらに、3 つまたは 4 つのビットマスク用のオプションの 12 ~ 16 バイト) の合計になります。注: Windows CEでは、biCompression メンバーでBITMAPINFOHEADERヘッダーを BI_ALPHABITFIELDS [ 14 ]オプションとともに使用できます。
パレットのエントリ数は、2 n (n はピクセルあたりのビット数) またはヘッダーで指定されたより小さい数です (OS/2 BITMAPCOREHEADERヘッダー形式では、フルサイズのパレットのみがサポートされます)。[ 3 ] [ 5 ]ほとんどの場合、カラー テーブルの各エントリは、青、緑、赤、0x00 の順に 4 バイトを占めます (例外については下記を参照)。これは、 BITMAPINFOHEADER の構造体メンバー biBitCount でインデックス付けされます。
カラーテーブルは、画像で使用される色を一覧表示するバイトブロック(テーブル)です。インデックス付きカラー画像では、各ピクセルはビット数(1、2、4、または8)で表され、このビット数は、このテーブルで定義される単一の色のインデックスです。インデックス付きカラービットマップにおけるカラーパレットの目的は、これらのインデックス値がそれぞれ対応する実際の色をアプリケーションに伝えることです。インデックスなし(非パレット化)ビットマップにおけるカラーテーブルの目的は、色表示機能が制限されたデバイスでの最適化のため、また将来的に異なるピクセル形式やパレット化への変換を容易にするために、ビットマップで使用される色を一覧表示することです。
カラー テーブルの色は通常、エントリごとに 4 バイトのARGB32形式で指定されます。OS/2 BITMAPCOREHEADERで使用されるカラー テーブルは、エントリごとに 3 バイトのRGB24形式を使用します。[ 3 ] [ 5 ] メモリにロードされた DIB の場合、カラー テーブルはオプションで 2 バイトのエントリで構成されます。これらのエントリは、明示的な RGB カラー定義の代わりに、現在実現されているパレットへのインデックスを構成します[ 7 ]。
Microsoft は、1bpp、4bpp、8bpp のインデックス付きカラー画像のBITMAPV4HEADERおよびBITMAPV5HEADERに有効なアルファ チャネル ビット マスク[ 15 ]が存在することを禁止していません。これは、カラー テーブル エントリが RGBQUAD.rgbReserved [ 16 ]メンバーを介して8.8.8.[0-8].[0-8]形式を使用してアルファ コンポーネントを指定できることを示しています。ただし、Microsoft のドキュメントの一部のバージョンでは、RGBQUAD.rgbReserved メンバーは「ゼロでなければならない」と述べることで、この機能を禁止しています。
前述のとおり、ピクセルが 1 ピクセルあたり 16 ビット (16bpp) フォーマット (およびそれ以上) の場合、カラー テーブルは通常使用されません。これらのビットマップ 画像ファイルには通常、カラー テーブル エントリがありません。ただし、Microsoft のドキュメント (2010 年 11 月 16 日時点の MSDN Web サイト[ 17 ] ) では、16bpp (およびそれ以上) の場合、カラー テーブルは、カラー表示機能が制限されているデバイスでの最適化を目的とした色のリストを格納するために存在することができ、また、そのような場合、このカラー テーブルにはインデックス付きパレット エントリは存在しないと規定されています。必須のパレット エントリとオプションのカラー リストを区別しないと、これは矛盾しているように見えるかもしれません。
ビットマップのピクセルを表すビットは行(ストライドまたはスキャンラインとも呼ばれる)にパックされます。各行のサイズは、パディングによって4バイト(32ビットDWORD )の倍数に切り上げられます。 [ 18 ]
高さが1を超える画像の場合、複数のパディングされた行が連続して格納され、ピクセル配列が形成されます。
1行のピクセルを格納するために必要なバイト総数は、次のように計算できます。
nビット/ピクセル(bpp)の画像で、2 n色を持つピクセル配列を格納するために必要なバイト総数は、各行のサイズを4バイトの倍数に切り上げる効果を考慮して、次のように計算できます。
ピクセル配列は、画像をピクセルごとに記述する 32 ビット DWORD のブロックです。通常、ピクセルは左下隅から始まり、左から右へ、そして画像の下部から上部へ行ごとに「下から上」に格納されます。[ 5 ] BITMAPCOREHEADERを使用しない限り、Image Height の値が負の場合、圧縮されていない Windows ビットマップは上から下に格納することもできます。
オリジナルの OS/2 DIB では、有効な色深度の値は 1、4、8、24 ビット/ピクセル (bpp) の 4 つだけでした。[ 5 ] 現代の DIB ヘッダーでは、1、2、4、8、16、24、32 ビット/ピクセル (bpp) のピクセル フォーマットが使用できます。[ 19 ] GDI+では、64 ビット/ピクセルも使用できます。[ 20 ]
行の長さを 4 バイトの倍数にするために、行の末尾にパディング バイト (必ずしも 0 ではない) を追加する必要があります。ピクセル アレイがメモリにロードされるとき、各行は 4 の倍数であるメモリ アドレスから開始する必要があります。このアドレス / オフセットの制限は、メモリにロードされたピクセル アレイに対してのみ必須です。ファイル ストレージの目的では、各行のサイズが 4 バイトの倍数である必要があり、ファイル オフセットは任意です。[ 5 ]幅が 1 の 24 ビット ビット マップでは、行 (青、緑、赤) ごとに 3 バイトのデータと 1 バイトのパディングがあり、幅が 2 の場合は 6 バイトのデータと 2 バイトのパディング、幅が 3 の場合は 9 バイトのデータと 3 バイトのパディング、幅が 4 の場合は 12 バイトのデータとパディングなしになります。
どのビットがどのサンプルを定義するかという曖昧さを解消するために、DIBヘッダーは特定のデフォルト値と、ピクセル内の特定のビット群が特定のチャネルに属するかどうかを定義するビットマスクである特定のビットフィールドを提供します。次の図はこのメカニズムを示しています。
BITFIELDS ビットマスクで定義されるサンプルフィールドは連続していて重複していてはいけませんが、サンプルフィールドの順序は任意です。最も一般的なフィールドの順序は、アルファ、ブルー、グリーン、レッド (MSB から LSB) です。赤、緑、青のビットマスクは、DIB ヘッダーの Compression メンバーが BI_BITFIELDS に設定されている場合にのみ有効です。アルファのビットマスクは、DIB ヘッダーに存在する場合、または DIB ヘッダーの Compression メンバーが BI_ALPHABITFIELDS [ 14 ] ( Windows CEのみ) に設定されている場合に有効です。
上記のBITFIELDメカニズムにより、数万種類の異なるピクセルフォーマットを定義できますが、実際に使用されるのはそのうちのいくつかのみです。[ 22 ]すべてのパレット化されたフォーマットRGB8、RGB4、およびRGB1(上記の表で黄色でマークされ、dshow.h.MEDIASUBTYPE名で定義されています)。
バージョン 2.1.4 では、FFmpegは (独自の用語で) BMP ピクセル フォーマットbgra、bgr24、rgb565le、rgb555le、rgb444le、rgb8、bgr8、rgb4_byte、bgr4_byte、gray、pal8、およびmonobをサポートしていました。つまり、bgra は透明度をサポートする唯一のピクセル フォーマットでした。[ 24 ]

以下は、ピクセル形式がRGB24の2×2ピクセル、24ビットビットマップ(Windows DIBヘッダーBITMAPINFOHEADER )の例です。

以下は、アルファチャンネルに不透明度値を持つ、ピクセルフォーマットARGB32の4×2ピクセル、32ビットビットマップの例です(Windows DIBヘッダーBITMAPV4HEADER )。
ビットマップデータは画像の左下隅から始まることに注意してください。
BMPファイル形式のシンプルさ、Windowsをはじめとする様々なOSでの普及度、そして比較的ドキュメントが充実していてオープンフォーマットであることから、BMPは多くのオペレーティングシステムの画像処理プログラムで読み書きできる非常に一般的なフォーマットとなっています。ICOファイルとCURファイルには、BITMAPINFOHEADERで始まるビットマップが含まれています。
古いグラフィカルユーザーインターフェイスの多くは、内蔵のグラフィックスサブシステムでビットマップを使用していました。[ 25 ]例えば、Microsoft Windows および OS/2 プラットフォームのGDIサブシステムでは、特定の形式としてWindows および OS/2 ビットマップ ファイル形式が使用され、通常はファイル拡張子で命名されます.BMP。[ 26 ]
ほとんどのBMPファイルは、圧縮が行われていない(またはパレット化された画像では一般的に低比率のランレングス符号化が用いられている)ため、ファイルサイズが比較的大きくなりますが、冗長なデータが含まれているため、 ZIPなどの可逆データ圧縮アルゴリズムを用いることで大幅に圧縮できるファイルも多数存在します。RARなどの一部のフォーマットには、こうしたデータの効率的な圧縮を目的としたルーチンが組み込まれています。
X Window Systemは、白黒画像にはXBM形式、カラー画像にはXPM(ピクセルマップ)形式を使用します。また、その他の情報を含まずに生データを保存する「RAW」形式もいくつか存在します。Portable Pixmap(PPM)形式やTruevision TGA形式も存在しますが、使用頻度は低く 、特殊な用途に限られます。例えば、TGA形式は透過情報を含めることができます。