【Python】BMP画像ファイルのヘッダ情報解析

PythonでBMP画像ファイルのヘッダ情報を取得する方法をソースコード付きで解説します。

BMP画像ファイルのヘッダ情報

BMP画像ファイルには、「ヘッダ部」と「データ部」があります。
ヘッダ部には画像の詳細情報(幅・高さ・色数など)、データ部には各画素の画素値が格納されています。

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

今回は、Pythonと標準関数のみを用いて、BMPファイルのヘッダ情報を解析してみました。

ソースコード(Python3)

サンプルプログラムのソースコードです。

#-*- coding:utf-8 -*-

def main():
    # bmpファイルをバイナリモードで読み込み
    file = open("color.bmp","rb")
    data = file.read()
    file.close()

    # ヘッダ部の情報を切り分け
    format_type = data[0:2] # 画像フォーマットの種類を取得
    file_size = data[2:6] # ファイルサイズを取得
    header_size = data[10:14] # ヘッダサイズを取得
    width, height = data[18:22], data[22:26] # 画像の高さと幅を取得
    color_bit = data[28:30] # 1画素の色数を取得

    # リトルエンディアン方式で16進数から10進数に変換
    file_size = int.from_bytes(file_size, 'little')
    header_size = int.from_bytes(header_size, 'little')
    width = int.from_bytes(width, 'little')
    height = int.from_bytes(height, 'little')
    color_bit = int.from_bytes(color_bit, 'little')

    # ヘッダ情報をコンソール出力
    print("Format type:", format_type)
    print("File size:", file_size, "[byte]")
    print("Header size:", header_size, "[byte]")
    print("Width:", width, "[px]")
    print("Height:", height, "[px]")
    print("Total pixels:", width*height)
    print("Color:", color_bit, "[bit]")

if __name__ == "__main__":
    main()
ポイント 説明
format_type = data[0:2] data[0:2]で0~1番目(2byte)に格納されているファイルフォーマットの種類を読み出しています。
file_size = data[2:6] data[2:6]で2~5番目(4byte)に格納されていファイルサイズを読み出しています。
int.from_bytes(data ,’little’) バイナリデータをリトルエンディアンで10進数の整数値に変換します。

実行結果

サンプルプログラムの実行結果です。

■読み込んだBMPファイル(color.bmp)

プロ生ちゃん(暮井 慧)

■出力した情報

Format type: b'BM'
File size: 63786 [byte]
Header size: 54 [byte]
Width: 150 [px]
Height: 141 [px]
Total pixels: 21150
Color: 24 [bit]

バイナリエディタで確認した結果と一致していることがわかります。

Python基礎
「Python基礎」の記事一覧です。

コメント