BMP画像のファイル構造(ヘッダ部・データ部)

この記事では、BMP画像のファイル構造の原理(データ部・ヘッダ部など)についてまとめました。

BMPのファイル構造

BMP(今回はWindows bitmapをBMPとする)は、 Windows標準の画像フォーマットです。
基本的に無圧縮なため、ファイル構造がわかりやすいのが特徴です。

BMPはバイナリ形式でデータが書き込まれています。
そのファイル構造は、データの先頭から順に以下のようになっています。

データ量 概要
ヘッダ部 54byte ファイル情報(画像の色数・高さ・幅など)
データ部 画像のデータ(各画素値)

まず、先頭からファイル情報が記述されたヘッダ部があります。
その後ろに、各画素値が記述されたデータ部が続きます。

ヘッダ部の内容

BMPファイルにおけるヘッダ部の内容は次の通りです。

データ順序 データ量[byte] 説明 補足
0~1 2 フォーマット種類 BMPなら0x42、0x4d
2~5 4 ファイルサイズ 単位[byte]
6~7 2 予約領域① 将来の拡張用領域(常に0)
8~9 2 予約領域② 将来の拡張用領域(常に0)
10~13 4 ヘッダサイズ データ部の先頭位置がわかる 
14~17 4 情報ヘッダのサイズ 40[byte]
18~21 4 画像の幅 単位[px]
22~25 4 画像の高さ 単位[px]
26~27 2 プレーン数 常に1
28~29 2 1画素の色数 単位[bit]でRGBカラーなら24, グレースケール(単色)なら8
30~33 4 圧縮形式
34~37 4 圧縮サイズ 単位[byte]
38~41 4 水平解像度 単位[ppm]=[px/m]
42~45 4 垂直解像度 単位[ppm]=[px/m]
46~49 4 色数 0なら全色使用  
50~53 4 重要色数 0なら全色使用

※ヘッダ部は全部で54[byte]あります。

54番目以降にはデータ部が続きます。

データ部の内容

BMP画像のデータ部には、 (画像の幅)×(画像の高さ)個の各画素値が順番に並んでいます。

①色数が24[bit](RGBカラー)の場合は次のようになります。

データ順序 データ量[byte] 説明 補足
54 1 (0, 0)の画素値 Blueの濃度
55 1 (0, 0)の画素値 Greenの濃度
56 1 (0, 0)の画素値 Redの濃度
57 1 (1, 0)の画素値 Blueの濃度
58 1 (1, 0)の画素値 Greenの濃度
59 1 (1, 0)の画素値 Redの濃度
60 1 (2, 0)の画素値 Blueの濃度
61 1 (2, 0)の画素値 Greenの濃度
62 1 (2, 0)の画素値 Redの濃度

②色数が8[bit](グレースケール)の場合は次のようになります。

データ順序 データ量[byte] 説明 補足
54 1 (0, 0)の画素値 白~黒の濃度
55 1 (1, 0)の画素値
56 1 (2, 0)の画素値

観て分かる通り、8bit(グレースケール)に比べて24bit(RGBカラー)の場合は、データ部のデータ量が3倍になることがわかります。
そのため、画像処理を行う際は、計算時間の高速化のためにグレースケール画像を用いる場合が多いです。

ファイル構造の解析

先程紹介したファイル構造を理解を深めるために、実際にBMPファイルをバイナリエディタで読み込んで解析する方法を下記事で紹介しています。。
【バイナリエディタ】BMP画像のファイル構造を解析

プログラムでBMPファイルの読み込み

処理手順

プログラムでBMP画像を読み込む場合、一般的には次のような処理を行います。

処理内容
「ヘッダ部の先頭から画像ファイルのフォーマットを判別する。
「ヘッダ部」の内容から画像の色数・高さ・幅・圧縮形式などの情報を取得する。
色数・圧縮形式に応じて「データ部」から画像ファイルの各画素値を取得する。
高さ・幅の情報を元に取得した各画素値を二次元に並べる。

実装例

実装例を下記事で解説しています。

■Python言語
【Python】BMP画像ファイルのヘッダ情報解析
【Python】BMP画像ファイルを暗くする(明るさ半分)

■C言語
【C言語】BMP画像ファイルのヘッダ情報解析

【関連記事】
【画像処理入門】アルゴリズム&プログラミング

コメント