ファイル形式
BMPとは?ビットマップ形式をわかりやすく解説
BMPは、Windowsの非圧縮・可逆のビットマップ形式です。ヘッダーの構造、色深度、制限、そしてファイルを小さくする方法を解説します。
著者: Hemen Dönüştür Editör Ekibi公開日: 10 分で読めます

BMPは、Windowsの世界で最も古く、最もシンプルな画像形式の一つです。BMPファイルは通常、ピクセルを一切圧縮せずに1行ずつディスクに書き込みます。そのシンプルさのおかげで読み込みやすく可逆ですが、同じシンプルさのせいでファイルは巨大になります。この記事では、BMPの由来、ファイルの中身、色深度と透明の細かな点、今でもBMPに出会う場面、そしてBMPファイルをより実用的な形式に変換する方法を紹介します。
BMPとは
BMP(ビットマップ、拡張子.bmp)は、ピクセルベースのラスター画像ファイル形式です。技術文書では、デバイスに依存しないビットマップを意味するDIBとも呼ばれます。「デバイスに依存しない」とは、作成されたときのグラフィックカードやプリンターに関係なく、画像を同じように解釈できるという意味です。ファイルは色をデコードするのに必要な情報を、自身のヘッダーとカラーテーブルに持っています。
MicrosoftのWin32ドキュメントによれば、ビットマップファイルはBITMAPFILEHEADER構造体で始まり、その後にBITMAPINFOHEADER、BITMAPV4HEADER、BITMAPV5HEADERのいずれか、任意のカラーテーブル、最後にピクセルデータが続きます。MIMEタイプはimage/bmpです。
簡単な歴史:WindowsとOS/2から今日まで
BMPは、1980年代後半にMicrosoftとIBMがWindowsとOS/2で共同作業をする中から生まれました。Windows 1.0の時代のビットマップは出力デバイスに大きく依存しており、デバイスに依存しない形式が広まったのは1990年のWindows 3.0からです。OS/2のPresentation Manager向けに定義された12バイトのBITMAPCOREHEADERがあるため、今でも「OS/2 BMP」ファイルという言い方がされます。
年月とともに、形式はヘッダーの末尾にフィールドを追加する形で拡張されてきました。米国議会図書館の形式解説によれば、バージョン5は1998年にWindows 98とともに登場し、ファイルにICCカラープロファイルを記録できるようになりました。現在よく使われるヘッダーのサイズは次のとおりです。
| ヘッダー | サイズ | 主な追加点 |
|---|---|---|
| BITMAPCOREHEADER | 12バイト | OS/2 1.xと互換の基本構造 |
| BITMAPINFOHEADER | 40バイト | Windows 3.0からの最も一般的なヘッダー。圧縮と解像度のフィールド |
| BITMAPV4HEADER | 108バイト | カラーマスク、アルファマスク、色空間の情報 |
| BITMAPV5HEADER | 124バイト | 埋め込みまたはリンクされたICCプロファイル、レンダリングインテント |
読み込むソフトは、最初のフィールドにあるサイズの値から、どのヘッダーが使われているかを判断します。そのため古いソフトでも、新しいフィールドを無視して基本の部分を読めます。
BMPファイルの中身
ファイルヘッダーと「BM」シグネチャ
BMPファイルはすべて14バイトのファイルヘッダーで始まり、その最初の2バイトはASCII文字のBM(16進数で42 4D)です。ヘッダーには、ファイル全体のサイズと、ピクセルデータが始まるバイト位置が記録されています。Windowsのクリップボードに置かれるDIB(CF_DIB形式)はこの14バイトを省き、情報ヘッダーから直接始まります。
情報ヘッダー
情報ヘッダーには、幅、高さ、1ピクセルあたりのビット数(biBitCount)、圧縮の種類、水平・垂直の解像度(1メートルあたりのピクセル数)、カラーテーブルで使われている色の数が入っています。
カラーテーブル(パレット)
1ピクセルあたり8ビット以下の画像では、ピクセルは色ではなくカラーテーブルへの番号です。Microsoftのドキュメントの例では、16色の32x32ビットマップのピクセル配列は32 x 32 x 4 = 4096ビットになります。16色を指すには4ビットで足りるからです。
ピクセルデータ:下から上への行と4バイト境界
BMPには2つの変わった特徴があります。1つ目は、高さが正の値なら行が下から上へ保存されることです。ファイルの最初の行は画像の一番下の行になります。高さが負なら行は上から下へ保存されますが、そうした画像は圧縮できません。2つ目は、すべての行が4バイトの倍数になるようパディングされることです。Microsoftは行の長さ(ストライド)を次のように示しています。
stride = ((width * bitCount + 31) & ~31) >> 3
imageSize = |height| * stride
24ビットの1920x1080の画像なら、各行は1920 x 3 = 5,760バイト(すでに4の倍数)なので、ピクセルデータは5,760 x 1,080 = 6,220,800バイトです。54バイトのヘッダーを加えると、ファイルは約6.2MBになります。同じ画像をJPGにすれば、通常はそのごく一部のサイズで済みます。
色深度、圧縮、透明
BITMAPV5HEADERのドキュメントは、1ピクセルあたり1、4、8、16、24、32ビットを定めています(0は、埋め込まれたJPEGやPNGのデータから深度が決まることを意味します)。1ビットは白黒、4ビットは16色、8ビットは256色のパレットです。24ビットでは、各ピクセルが青、緑、赤の順の3バイトになります。
圧縮のフィールドには次の値が入ります。
- BI_RGB:非圧縮。実際にはBMPファイルの大多数がこれです。
- BI_RLE8とBI_RLE4:8ビットと4ビットのパレット画像向けの単純なランレングス符号化。大きな単色の部分には役立ちますが、写真にはほとんど効果がありません。
- BI_BITFIELDS:圧縮ではなく、16ビットと32ビットのピクセルの中で赤、緑、青のビットがどこにあるかをマスクで定めます(たとえばRGB 565)。
- BI_JPEGとBI_PNG:ビットマップの中にJPEGやPNGのデータを入れられます。汎用のビューアーではほとんどサポートされていません。
透明は、BMPで最も一貫性のない部分です。V4とV5のヘッダーにあるアルファマスクで、32ビットのピクセルの4バイト目を不透明度として定義できますが、従来の32ビットBMPではそのバイトは「未使用」とされており、多くのソフトは無視します。そのため、あるソフトでは透明に見える32ビットBMPが、別のソフトでは黒い背景の上に表示されるのも珍しくありません。透明が必要なら、PNGのほうがはるかに安全な選択です。
システム、ブラウザー、ソフトの対応状況
BMPはほぼどこでも開けます。Windows標準のビューアーやペイント、macOSのプレビュー、一般的なLinuxのビューアーはどれも読み込めます。MDNの画像形式ガイドには、Chrome、Edge、Firefox、Opera、SafariのすべてのバージョンがBMPに対応していると記されています。同じガイドは、非圧縮のBMPファイルはPNGやJPGと比べて非常に大きく、Webサイトのコンテンツには一般に避けるべきだとも強調しています。
今日BMPが使われている場面
- Windowsアプリケーションのリソースや古いソフトウェア:ツールバーの画像、インストーラーのウィザードの画像、一部のゲームの素材は今もBMPです。
- 組み込みシステムやマイコン:ディスプレイ付きの機器でもJPEGデコーダーが不要で、ピクセルデータをそのまま画面にコピーできます。
- 産業用カメラ、スキャナー、検査ツール:生の可逆な出力が必要なとき、BMPはシンプルな中間形式になります。
- 教育:ヘッダーが数十バイトしかないため、画像処理の授業で学生が最初に読み書きする形式になることがよくあります。
長所と短所
| 長所 | 短所 |
|---|---|
| 可逆で、ピクセルの値が変わらない | 非圧縮なのでファイルが非常に大きい |
| 読み書きがごく簡単で、CPUの負荷がない | 透明の対応がまちまち |
| ほぼすべてのOSとブラウザーで開ける | メタデータ(EXIF、説明)の対応が弱い |
| パレットモードはリソースの少ない機器に向く | Web、メール、アップロードフォームでは実用的でない |
よくあるトラブルと対処法
ファイルがメールやアップロードフォームには大きすぎる
最もよくある問題です。写真やスキャン画像なら、BMPをJPGに変換すれば、たいていサイズが1桁以上小さくなります。スクリーンショット、図表、文字の入ったものなら、BMPをPNGに変換するほうが適しています。PNGも可逆ですが圧縮されており、JPGがくっきりした輪郭のまわりに生むノイズも加わりません。
32ビットのBMPの背景が黒く表示される
ソフトがアルファのバイトを認識していないか、誤って読んでいます。PNGに変換すればたいてい直ります。透明のないJPGに変換するときは、透明な部分は白か、選んだ色で塗りつぶされます。
画像が上下逆さまになる、または斜めにずれる
自作の読み込み処理なら、原因はたいてい2つの誤りのどちらかです。行が下から上へ保存されていることを無視しているか、各行の末尾のパディングのバイトを読み飛ばしていないかです。上のストライドの式を使い、高さの符号を確認すれば、どちらも防げます。
ソフトがBMPを開こうとしない
RLE圧縮、BI_BITFIELDS、埋め込みのJPEGやPNGのデータを使ったBMPファイルは、一部の単純な読み込み処理では対応していません。非圧縮の24ビットBMPとして保存し直すか、PNGに変換すれば互換性の問題はなくなります。
変換のコツ
- 写真はJPG、図はPNG:BMPから変換するときも、いつもの原則が当てはまります。Web向けなら、画像変換ツールでWebPやAVIFを選ぶこともできます。
- 画質は高めに:BMPは可逆なので、JPGの画質を85-90%にすれば、元の画像とほとんど見分けがつかない結果になります。
- 必要なら縮小を:それでもファイルが大きいなら、ピクセルの寸法を小さくするか、画像圧縮を使って目標のサイズにしましょう。
- 逆方向の変換:組み込み機器や古いソフトでBMPが必要なら、画像変換ツールで変換先にBMPを選んでください。当サイトのツールは標準的な非圧縮の24ビットBMPを書き出し、透明な部分は選んだ背景色に合成されます。
当サイトのBMP変換ページはブラウザー内で動作します。ファイルはアップロードされず、端末の外に出ることはありません。
よくある質問
BMPとDIBは同じものですか?
実質的には同じです。DIBは、Windowsがメモリ上やクリップボードで使う、デバイスに依存しないビットマップの構造です。BMPファイルは、その構造の前に14バイトのファイルヘッダーを付けたものです。
BMPは可逆ですか?
はい。非圧縮やRLE圧縮のBMPファイルは、ピクセルの値を正確に保ちます。唯一の例外は、まれにあるJPEGデータを埋め込んだBMPです。
BMPをPNGに変換すると画質は落ちますか?
いいえ。PNGも可逆なので、画像はまったく同じままで、圧縮される分だけ小さくなります。
WebサイトでBMPを使えますか?
ブラウザーはBMPを表示できますが、ファイルが無駄に大きく、ページが遅くなります。WebにはJPG、PNG、WebP、AVIFを使いましょう。
BMPは透明に対応していますか?
32ビットのBMPは理論上アルファチャンネルを持てますが、ソフトの対応がまちまちです。透明が必要なときは、PNGのほうが安全な選択です。


