【Python】バイナリ形式の画像ファイルを扱う方法【base64】

  • Pythonでバイナリ形式の画像ファイルを扱うには?
  • バイナリ形式の画像ファイルを.jpg等で保存するには?
  • base64とは?

本記事ではこのような疑問を解決します。


先日、業務の中でバイナリ形式の画像ファイルを扱う場面がありました。

具体的には、APIを叩いてバイナリ形式の画像ファイルをサーバーに送り、.jpgで保存するというものです。

また、上記で保存した画像ファイルを呼び出してバイナリ形式の画像ファイルをレスポンスで返すというAPIも作りました。


そこで今回はPythonでバイナリ形式の画像ファイルを扱う方法を解説します。

なお、本記事ではOpenCV等の外部ライブラリではなく、標準ライブラリのみを使用します!

画像ファイルをバイナリ形式に変換する

まずは画像ファイルをバイナリ形式に変換してみましょう。


今回はこちらの画像を扱っていきます。

Git
格納先:/Users/kosuke/before/Git.jpg
# 扱う画像ファイルを取得する
image_file_path = '/Users/kosuke/before/Git.jpg'

# 取得した画像ファイルをバイナリ形式で読み込む
with open(image_file_path, mode='rb') as f:
    image_file = f.read()

# バイナリ変換した画像ファイルをターミナルに表示してみる
print(image_file)

$ python convert_image.py
実行結果:
b’\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xe2\x02\x1cICC_PROFILE\x00\x01\x01\x00\x00\x02\x0clcms\x02・・・途中省略・・・\xd0\xb8\xfc\x8f\x1c\x8c~Y\x8e\x836\xdf\xf2\xac\xeaZ\xb1\xa3\x1a\xb1\xcd\xdb\xad\xff\xd9′

なお、APIで画像ファイルを送受信する際にはbase64エンコードされた状態でjsonにセットするのが一般的です。

そのため、ここではbase64ライブラリを使用してみます。

base64はデータのエンコード・デコードを行うPythonの標準ライブラリです。

import base64


image_file_path = '/Users/kosuke/before/Git.jpg'

with open(image_file_path, mode='rb') as f:
    image_file = f.read()

# base64エンコードする
binary_file_b64 = base64.b64encode(image_file)

# base64エンコードしたバイナリデータをターミナルに表示してみる
print(binary_file_b64)

$ python convert_image.py
実行結果:
b’/9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUA・・・途中省略・・・ol+Jdfjkq7nQhoXMX9NOOjf9C4vjqHd2x+VZ/oJCEKzH/QuPyPHIx+WY6DNt/yrOpasaMasc3brf/Z’

バイナリ形式の画像ファイルを.jpg等で保存する

次に先ほどバイナリ形式に変換した画像ファイルをローカルPCに.jpg等で保存してみましょう。

import base64


# ※先ほど扱ったbinary_file_b64を使用する

# base64デコードする
image_file = base64.b64decode(binary_file_b64)

# 保存する画像ファイルのパスを指定する
save_image_file_path = '/Users/kosuke/after/before/Git_Clone.jpg'

# jpgファイルにバイナリデータを書き込む
with open(save_image_file_path, mode='wb') as f:
    f.write(image_file)

上記スクリプトを実行すると以下のように画像が保存できているのが確認できます。

Pythonでバイナリ形式の画像ファイルを保存する

まとめ

以上がPythonでバイナリ形式の画像ファイルを扱う方法になります。

Webアプリケーション開発をしていると画像ファイルをバイナリ形式で扱う場面は多いのではないでしょうか。

例えば、画像のアップロード・ダウンロード機能など。

OpenCV等の外部ライブラリを入れずになるべく標準ライブラリで実装したい方はぜひ業務に本記事を活用してみてください!