【Python】BMP画像ファイルを暗くする(明るさ半分)

この記事では、PythonでBMP画像ファイルの画素値を半分にして暗くする方法をソースコード付きで解説します。

BMP画像ファイルを暗くする(明るさ半分)

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

今回は、ヘッダ部から得られた画像情報を元にデータ部にある画素値を操作し、明るさを半分にしたあと、新しいBMPファイルに保存してみました。

ソースコード(Python3)

サンプルプログラムのソースコードです。
※BMPファイルの構造について理解を深めるために標準ライブラリのみ使用しています。

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

# BMPファイルの読み込み
def load_bmp(filename):
    file = open(filename,"rb")
    data = file.read()
    file.close()
    header = data[0:54]
    file_size, header_size, width, height, bit = load_header_data(header)
    img = data[54:]
    return header, img, width, height, bit

# BMPファイルのヘッダ部から画像情報を取得
def load_header_data(header):
    # ヘッダ部の情報を切り分け
    file_size = header[2:6] # ファイルサイズを取得
    header_size = header[10:14] # ヘッダサイズを取得
    width, height = header[18:22], header[22:26] # 画像の高さと幅を取得
    color_bit = header[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')
    bit = int.from_bytes(color_bit, 'little')
    return file_size, header_size, width, height, bit

# BMPファイルの書き込み
def save_bmp(filename, data):
    file = open(filename,"wb")
    file.write(data)
    file.close()

def main():
    # BMPファイルの読み込み
    header, img, width, height, bit = load_bmp("color.bmp")
    # データ部の各画素値を半分に
    img2 = [int(v*0.5) for v in img]
    # ヘッダとデータ部(処理後)を連結
    data2 = header + bytes(img2)
    # BMPファイルに書き込み
    save_bmp("color2.bmp", data2)


if __name__ == "__main__":
    main()

実行結果

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

■入力画像(color.bmp)と出力画像(color2.bmp)

プロ生ちゃん(暮井 慧)

明るさが半分になっていることがわかります。

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

コメント