1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pyinstallerのexe化で画像ファイルを埋め込む方法

Last updated at Posted at 2023-10-18

PythonでGUIアプリを開発していて、最終的にpyinstallerでexe化して配布する必要があり、画像ファイルをexeファイルに埋め込む必要があったので、そのやり方を簡単にまとめてみました。

動作環境

  • os: win11
  • python: 3.9
    • customtkinter: 5.2.0
    • Pillow: 10.1.0
    • pyinstaller: 6.0.0

困ったこと

コマンドのオプションで同梱するファイルを指定したり、pyinstaller用のspecファイルのdatasに同梱するファイルを追記するなどの記事を見つけたので試したのですが、うまくいきませんでした。(参照する画像ファイルがデバイス上に存在しないと「ファイルが見つからない」とエラーが出る)

解決方法

コマンドオプションかspecファイルの書き換えでなんとかなるかもしれないですが、今回開発しているのは小規模のアプリで、参照する画像ファイルも少ないのでpyファイルに直接埋め込めばいいのかなと思いました。

画像ファイルをbase64でエンコードする

下記のように、画像ファイルをbase64でエンコードし、base64_imgという変数に格納します。
(今回はcustomtkinterというGUIライブラリを使います)

import base64
import io

import customtkinter
from PIL import Image


app = customtkinter.CTk()
app.geometry("800x600")

base64_img = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDA...(省略)...Qh3xB4g="

image_data = base64.b64decode(base64_img)
pil_image = Image.open(io.BytesIO(image_data))
ctk_image = customtkinter.CTkImage(pil_image, size=(800, 600))
image_label = customtkinter.CTkLabel(app, image=ctk_image, text="")
image_label.pack()

app.mainloop()

(こんな感じです)
image.png

ちなみにファイルをバイナリで取り込むこともできます。

import io

import customtkinter
from PIL import Image


app = customtkinter.CTk()
app.geometry("800x600")

binary_img = b"\xff\xd8\xff\xe0\x00(省略)..."
pil_image = Image.open(io.BytesIO(binary_img))
ctk_image = customtkinter.CTkImage(pil_image, size=(800, 600))
image_label = customtkinter.CTkLabel(app, image=ctk_image, text="")
image_label.pack()

app.mainloop()

exe化後、(デバイス上に参照する画像ファイルがなくても)exeファイル単体で実行できるようになります。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?