カメラワークフローと画像保存に知っておきたいBMPフォーマットの深層解説

BMPとは何か — 基本概要

BMP(Bitmap、一般には .bmp ファイル拡張子)は、Windows系OSで広く使われてきたビットマップ画像ファイル形式です。非圧縮でピクセルごとの色情報を格納することが多く、構造が単純であるため画像処理や実験用途で扱いやすい反面、ファイルサイズが大きくなるという特徴があります。カメラの出力フォーマットとしては一般的ではありませんが、画像処理パイプラインやデバッグ、学術用途、GUIリソースやアイコンの素材などで今なお利用されています。

歴史と発展

BMPはWindowsの初期(16ビットWindows時代)から存在するフォーマットです。OS/2系の古いバリエーション(OS/2 Bitmap)はヘッダやカラーテーブルの扱いが異なりますが、WindowsのBMPはBITMAPFILEHEADER(14バイト)とDIBヘッダ(サイズ可変)という二層構造が標準です。DIBヘッダは時代とともに拡張され、BITMAPCOREHEADER(OS/2, 12バイト)、BITMAPINFOHEADER(Windows V3, 40バイト)、BITMAPV4HEADER(108バイト)、BITMAPV5HEADER(124バイト)と進化し、マスクやアルファ、カラースペース、ICCプロファイルのメタ情報を扱えるようになりました。

ファイル構造の詳細

  • ファイルヘッダ(BITMAPFILEHEADER, 14バイト) — ファイル識別子(通常は文字列 'BM')、ファイル全体のサイズ、ピクセルデータへのオフセットなどを含みます。

  • DIBヘッダ(サイズ可変) — 最も一般的なのはBITMAPINFOHEADER(40バイト)で、幅・高さ・ビット深度・圧縮方式・ピクセル配列サイズなどを定義します。ヘッダサイズが異なれば、ヘッダの解釈方法も変わります。

  • カラーパレット(オプション) — 1/4/8ビット画像ではカラーテーブル(パレット)が存在し、各テーブルエントリは通常4バイト(WindowsではB,G,R,reserved)です。OS/2では3バイトのエントリになることがあります。

  • ピクセル配列(Bitmap bits) — 実際の画素データ。スキャンラインは通常下から上に格納される(bottom-up)。DIBヘッダのheightが負の場合はtop-down(上から下)で格納されます。各行は4バイト境界でパディングされます。

ビット深度と色の扱い

BMPは1、4、8、16、24、32ビットなど複数のビット深度をサポートします。24ビットは一般的に各画素をB,G,Rの順に8ビットずつ保持します。32ビットは8ビットのアルファチャネルを含むことがある一方で、古い仕様ではアルファを無視して単にパディングに使われることもありました。16ビットや32ビットではビットフィールド(BITFIELDS)を用いてRGBのマスクを定義することで任意のチャンネル配置を指定できます。

圧縮方式

代表的な圧縮方式は次のとおりです。BI_RGB(0)は非圧縮。BI_RLE8(1)とBI_RLE4(2)はランレングス圧縮で、8/4ビット画像に限定されます。BI_BITFIELDS(3)はマスク指定で主に16/32ビットで使われます。BI_JPEG(4)/BI_PNG(5)はピクセルデータ自体がJPEG/PNGでエンコードされて格納される拡張で、BI_ALPHABITFIELDS(6)はアルファビットフィールド扱いを示す定数です(Windows定義)。

行長(ストライド)とパディングの計算

重要な実装上のポイントはスキャンラインのアラインメントです。各行は32ビット(4バイト)境界に揃えられます。一般的な計算式は次の通りです。rowSize = ((bitsPerPixel * width + 31) / 32) * 4。これを使わないと読み書きで画像が左右にズレたりメモリ破壊を招く可能性があります。

BMPとカメラワークフローの関係性

市販のデジタルカメラは主にRAW(生データ)、JPEG、HEIF/HEIC、TIFFなどを採用しており、BMPを直接出力することは稀です。しかし開発・実験環境や簡易ビューア、組み込み機器の画像出力、画素処理の中間フォーマットとしてBMPは有用です。理由はフォーマットが単純で、ピクセルデータが直接参照できるため、デバッガやアルゴリズム検証で便利だからです。

利点と欠点

  • 利点 — 実装が単純で扱いやすく、ヘッダとピクセル配列の構造が明瞭。Windowsの標準APIで広くサポートされる。非圧縮のため画像処理段階で劣化がない。

  • 欠点 — ファイルサイズが大きく、メタデータ(EXIFやXMP)を標準的に保持しない。カラー管理の面でも歴史的制約があり、Webやストレージ効率の面で不利。

カラー管理とメタデータ

BITMAPV4/V5ヘッダ以降はカラースペース情報やプロファイル関連フィールドを含めることでICCプロファイルの参照やガンマ等の指定が可能になりました。ただし、依然としてJPEG/EXIFのように豊富なカメラインフォメーションが埋め込まれることは少なく、カメラの撮影情報をそのまま保持する用途には向きません。

実装上の注意点とセキュリティ

  • 外部ソースのBMPを読み込む際はヘッダのサイズ・オフセット・画像サイズ等の整合性チェックを行い、巨大な幅や高値によるメモリ割当てを防ぐこと。

  • 圧縮方式やDIBヘッダのサイズに応じて処理経路を分け、未対応の拡張ヘッダを安全にスキップまたは拒否する。

  • パディング計算やネガティブ高さ(top-down 指定)の扱いを正確に実装すること。誤解釈は上下反転やアラインメント不良の原因になります。

BMPを選ぶべきケース、避けるべきケース

BMPはピクセル単位の正確さが欲しい画像処理の中間フォーマットや、OS組み込みのリソースとしての配布、単純な学習用途に適しています。一方で保存や配信の最終フォーマットとしては非効率なため、ディスクや帯域幅が重要な用途ではPNG、JPEG、HEIF、RAW、TIFFなどを検討すべきです。

実務的なワークフロー例

カメラでRAWを取得 → RAW現像(色補正・ホワイトバランス)→ 中間検証やアルゴリズム検査でBMPに変換して処理結果を可視化 → 最終的にはTIFF/PNG/JPEG/HEIFなどへ変換して配布、という流れはよくあります。BMPは中間ステップとしての利点を生かしつつ、最終保存は圧縮やメタデータ保持に優れたフォーマットを使うのが現実的です。

まとめ

BMPは歴史が長く、学習や実験、OS組み込み用途で今なお有用なフォーマットです。ただしカメラからの直接出力や最終配布フォーマットとしては、サイズやメタデータ面の制約から一般的ではありません。BMPの内部構造(ファイルヘッダ、DIBヘッダ、カラーテーブル、ピクセル配列、パディング、圧縮方式)を正確に理解しておけば、画像処理パイプラインのデバッグや簡易出力先として有効に使えます。

参考文献