【Python】バイナリデータ(画像など)をBase64形式にエンコードする方法

Base64は、画像ファイルや音声データなどのバイナリデータを、64種類の英数字のみで構成されるテキスト(文字列)データに変換するエンコーディング方式です。 これにより、バイナリデータを扱えないテキストベースのプロトコル(JSONでのデータ送信や、HTMLへの画像埋め込みなど)でデータを送受信できるようになります。

ここでは、画像ファイルを読み込んでBase64文字列に変換する実装方法を解説します。

目次

実装例:アバター画像をBase64文字列に変換

ローカルにある画像ファイル(user_avatar.png)をバイナリモードで読み込み、Web APIなどで送信可能な文字列形式に変換します。

ソースコード

import base64

# エンコードしたい対象の画像ファイル名
target_file = "user_avatar.png"

# ダミーファイルが存在しない場合のエラーハンドリング
try:
    # 1. ファイルをバイナリ読み込みモード ('rb') で開く
    # テキストではないため 'r' ではなく 'rb' (Read Binary) が必須です
    with open(target_file, "rb") as f:
        binary_data = f.read()
        
    # 2. バイナリデータをBase64バイト列にエンコード
    # base64.b64encode() は bytes型を返します
    b64_bytes = base64.b64encode(binary_data)
    
    # 3. バイト列を文字列(str型)にデコード
    # JSONなどに含めるため、通常の文字列に変換します
    b64_string = b64_bytes.decode("utf-8")
    
    print(f"処理ファイル: {target_file}")
    print(f"データサイズ: {len(binary_data)} bytes")
    print("-" * 30)
    print("--- Base64文字列(先頭50文字) ---")
    print(b64_string[:50] + "...") # 長いので先頭だけ表示
    
    # おまけ: HTML埋め込み用のData URL形式を作成する場合
    # data:image/png;base64,xxxxxx...
    html_src = f"data:image/png;base64,{b64_string}"
    print("\n--- HTML埋め込み用タグ ---")
    print(f'<img src="{html_src[:50]}..." />')

except FileNotFoundError:
    print(f"エラー: ファイル '{target_file}' が見つかりませんでした。")
    # 動作確認用にテキストデータで代用する例
    sample_text = b"Hello Python Base64"
    print(f"\n(参考) テキストデータのエンコード結果: {base64.b64encode(sample_text).decode()}")

実行結果例

処理ファイル: user_avatar.png
データサイズ: 15320 bytes
------------------------------
--- Base64文字列(先頭50文字) ---
iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAX...

--- HTML埋め込み用タグ ---
<img src="data:image/png;base64,iVBORw0KGgoAAAANS..." />

解説

1. バイナリモードでの読み込み (rb)

open() 関数で画像を開く際は、必ずモードに "rb" (Read Binary) を指定します。 テキストモード(デフォルトの "r")で開くと、OSによっては改行コードの自動変換などが走り、データが破損して正しい画像として読み込めなくなります。

2. エンコードとデコードの流れ

  1. f.read(): ファイルの中身を bytes 型として読み込みます。
  2. base64.b64encode(): bytes 型を受け取り、Base64変換された bytes 型を返します。
  3. .decode("utf-8"): Base64はASCII文字(英数字+記号)のみで構成されるため、これをPythonの標準的な文字列型(str)として扱うためにUTF-8でデコードします。これにより、JSONの値としてセットしたり、テキストファイルに保存したりすることが容易になります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次