残プロ 第-17回 ~tkinterで画像を表示する~


今回の簡単な流れ

  • tkinterでウィンドウを用意
  • canvasを作成
  • canvas上にtkinter用にコンバートした画像を表示

プログラム例

今回の例ではcv2で画像を読み込んでいます.
PILのfromarrayとPhotoImageを使って,
numpy.ndarray → PIL.Image.Image → PIL.ImageTk.PhotoImage
と変換しています.

グレースケールで読み込んでいますが,カラーの場合も同様です.
※関数内でコンバートした場合(下記プログラムのimg_tk),ガベージコレクションに入れられるので,リストに追加することで回避しています.

import tkinter as tk
from PIL import Image, ImageTk
import cv2

def convert(img_gry):
    img_pil = Image.fromarray(img_gry)
    img_tk = ImageTk.PhotoImage(img_pil)
    imgs.append(img_tk)
    return img_tk


# --main--
path = "sample.png"

img_gry = cv2.imread(path, 0)
hei = img_gry.shape[0]
wid = img_gry.shape[1]

imgs = []

root = tk.Tk()

canvas = tk.Canvas(root, height=hei, width=wid)
canvas.pack()
canvas.create_image(0, 0, image=convert(img_gry), anchor='nw')

root.mainloop()

元画像 sample.png

実行結果