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. エンコードとデコードの流れ
f.read(): ファイルの中身をbytes型として読み込みます。base64.b64encode():bytes型を受け取り、Base64変換されたbytes型を返します。.decode("utf-8"): Base64はASCII文字(英数字+記号)のみで構成されるため、これをPythonの標準的な文字列型(str)として扱うためにUTF-8でデコードします。これにより、JSONの値としてセットしたり、テキストファイルに保存したりすることが容易になります。
