ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】png形式の画像をBase64に変換する

 ブラウザで画像を扱う場合、直接ローカル画像ファイルを扱おうとするとブラウザ側のセキュリティで色々怒られることが多いです。

 その場合元画像よりデータ量は多くなりますが、Base64という文字列データとして扱えばとりあえずはこの問題は解決できます。

 なので、今回はタイトルにある通りpythonpng形式の画像をBase64に変換する方法の記事になります。

 では、始めます。


1:pythonpng形式の画像をBase64に変換する
 以下の方法で変換できます。

import base64

file_data = open("/path/image.png", "rb").read()
b64_data = base64.b64encode(file_data).decode('utf-8')

 少し解説すると「open("/path/image.png", "rb").read()」の部分でパスで指定したファイルの中身を読んでいます。
 その結果を「base64.b64encode(open(file_data).decode('utf-8')」でBase64UTF-8形式に変換しています。


2:サンプル
 変換方法がわかったので実際にサンプルを動かしてみます。

・pngToBase64.py

# -*- coding:utf-8 -*-
import glob
import base64
import os

IMG_FOLDER_PATH = "./img/*"
SAVE_FILE_PATH  = "./img_b64.js"

# メイン関数
def main():
    # ソートしたファイルリストを取得
    images = sorted(glob.glob(IMG_FOLDER_PATH))

    f = open(SAVE_FILE_PATH, 'w')

    for fpath in images:
        # 拡張子なしのファイル名を取得
        filename = os.path.splitext(os.path.basename(fpath))[0]
        print(filename)
        
        # ファイルにbase64の内容を書き込む
        f.write("const " + filename + "_B64 = \"data:image/png;base64,")
        file_data = open(fpath, "rb").read()
        b64_data = base64.b64encode(file_data).decode('utf-8')
        f.write(b64_data)
        f.write("\";\n")

    f.close()
    print("--- end ---")


if __name__ == '__main__':
    main()

 上記の内容をコピペして「pngToBase64.py」として保存をし、同じ階層に「img」フォルダを作成してその中に変換したいpng画像を入れてください。ちなみにimgフォルダ内に複数画像入れても大丈夫です。
f:id:rikoubou:20210629135940p:plain

 その状態でpngToBase64.pyを実行すると「img_b64.js」というjsファイルが作成され、その中にconstの定数としてbase64の画像文字列が書き込まれています。


 以上がpythonpng形式の画像をBase64に変換する方法になります。

 正直サーバを立ててAPIを使って画像を取得するというのが最も良い方法だとは思いますが、サーバを立てるのが面倒だったりどうしてもブラウザ上の機能だけで完結させたいという場合には割と有な方法だとは思います。そもそもWebに詳しくないのでこの辺りの方法論がわかってないですが…。

 今回の記事で作成したものを一応公開しておきます。


・参考資料