ブラウザで画像を扱う場合、直接ローカル画像ファイルを扱おうとするとブラウザ側のセキュリティで色々怒られることが多いです。
その場合元画像よりデータ量は多くなりますが、Base64という文字列データとして扱えばとりあえずはこの問題は解決できます。
なので、今回はタイトルにある通りpythonでpng形式の画像をBase64に変換する方法の記事になります。
では、始めます。
1:pythonでpng形式の画像を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')」でBase64のUTF-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フォルダ内に複数画像入れても大丈夫です。
その状態でpngToBase64.pyを実行すると「img_b64.js」というjsファイルが作成され、その中にconstの定数としてbase64の画像文字列が書き込まれています。
以上がpythonでpng形式の画像をBase64に変換する方法になります。
正直サーバを立ててAPIを使って画像を取得するというのが最も良い方法だとは思いますが、サーバを立てるのが面倒だったりどうしてもブラウザ上の機能だけで完結させたいという場合には割と有な方法だとは思います。そもそもWebに詳しくないのでこの辺りの方法論がわかってないですが…。
今回の記事で作成したものを一応公開しておきます。
・参考資料