この記事では、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画像ファイルを暗くする(明るさ半分)
【関連記事】
【画像処理入門】アルゴリズム&プログラミング
コメント