tkinterでjpg画像を使う(PIL)

python

2024年現在tkinterで画像を扱う際、GIFやPNGには対応しているが、JPGは未対応だ。今回はtkinterを使ったアプリを作成する際に、JPGファイルを表示できるようにする。
結論としては、Pillowと呼ばれるモジュールを使用する。

Pillowのインストール

いつものように環境にモジュールをインストールしていく。(インストール方法は環境によって違うので自分の環境に合わせること)

$ py -m pip install Pillow

この際、以下のようなエラーがでることがある。

error: externally-managed-environment

この場合仮想環境を作ってからその場所にインストールするか、または、以下のように強引にインストールしてしまう方法がある

$ py -m pip install Pillow --break-system-package

作成

任意のフォルダ(デスクトップなど)にフォルダを作成する。今回名前はpillowtestとする。

上記画像を右クリックして、名前をつけて保存を選択し、先程作成したpillowtestフォルダにnightImage.jpgという名前で置く。

pil.pyとして以下を作成し実行する。

import tkinter as tk
from PIL import Image,ImageTk

#PILで画像をロード
pil_image = Image.open("nightimage.jpg")
 
#画像が大きいので半分の大きさを求める
w_size = int(pil_image.width/2)
h_size = int(pil_image.height/2)

#Tk作成
root=tk.Tk()
#画像の大きさでcanvas作成
canvas=tk.Canvas(root,width=w_size,height=h_size)
#canvas配置
canvas.pack()
#リサイズしながらtkinterで使える画像を作成
tk_image=ImageTk.PhotoImage(image=pil_image.resize((w_size,h_size)))
#左上を基準にして画像を配置
canvas.create_image(0,0,anchor='nw',image=tk_image)
#メインループ
root.mainloop()

以下のように画像が表示されれば成功だ。

インターネットから直接画像を持ってくる

さきほどは、ローカルにダウンロードしてから作成したが、インターネットから直接画像を持ってくることができる。pil2.pyとして以下を作成
requestsモジュールが必要となるので環境にインストールしておくこと

$ py -m pip install requests
import tkinter as tk
from PIL import Image,ImageTk
import requests
import io

#画像URL
url='https://joytas.net/kaba/images/kaba2.jpg'
#画像をバイナリデータとして取得
jpg_bin=io.BytesIO(requests.get(url).content)
#画像をPILで扱えるデータに変換
pil_image = Image.open(jpg_bin)
 
#画像の半分の大きさを求める
w_size = int(pil_image.width/2)
h_size = int(pil_image.height/2)

#Tk作成
root=tk.Tk()
#画像の大きさでcanvas作成
canvas=tk.Canvas(root,width=w_size,height=h_size)
#canvas配置
canvas.pack()
#リサイズしながらtkinterで使える画像を作成
tk_image=ImageTk.PhotoImage(image=pil_image.resize((w_size,h_size)))
#左上を基準にして画像を配置
canvas.create_image(0,0,anchor='nw',image=tk_image)
#メインループ
root.mainloop()

io.BitesIOを用いることで画像データをメモリに展開している。こうすることで環境に一度画像データをダウンロードすることなしに画像を表示することができる。

コメント

タイトルとURLをコピーしました