Python tkinter / ファイルダイアログ / OpenCVの画像を読み込み表示する方法

まくまく
まくまく
tkinterのファイルダイアログから画像ファイルを読み込み表示してみようと思います。



サンプルコード

#ライブラリのインポート
import tkinter as tk
import tkinter.filedialog
import cv2
from PIL import Image, ImageTk

#ファイルパス、ファイル名を取得し表示する関数
#f_pathにはファイルパスを代入
#nameにはファイル名を代入
#画像ファイルはpng,jpg,jpegの読み込みに対応
#initialdirには初期ディレクトリを入力
def getfile():
    global image_tk
    f_path = tk.filedialog.askopenfilename(title="ファイル選択", initialdir="ディレクトリを入力", filetypes=[("Image file", ".png .jpg .jpeg")])
    str_file_path = str(f_path)
    #OpenCVで画像を読み込む
    img = cv2.imread(str_file_path)

    #画像をリサイズ
    #sizeに任意のサイズを入力
    size = 300
    h, w = img.shape[:2]
    cvh = size*h/w
    image_bgr = cv2.resize(img, (size,int(cvh)))
    
    #画像をBGR→RGB→PIL→ImageTkフォーマットへ変換
    image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
    image_pil = Image.fromarray(image_rgb)
    image_tk  = ImageTk.PhotoImage(image_pil)
 
    canvas.create_image(0, 0, image=image_tk, anchor=tk.NW)

#ウインドウ作成
root = tk.Tk()
#ウインドウのタイトル
root.title("ウインドウ")
#ウインドウサイズと位置指定 幅,高さ,x座標,y座標 
root.geometry("600x480+50+50")

#フレームを入れ子で作成。「frame」の中に「frame2」「frame3」を作成
frame = tk.Frame(root, width=580, height=440, padx=10, pady=10, bg="black")
frame.place(x=10, y=10)

frame2 = tk.Frame(frame, relief=tk.FLAT, bg="white", bd=2)
frame2.place(x=10, y=10, width=540, height=340)

frame3 = tk.Frame(frame, relief=tk.FLAT, bg="white", bd=2)
frame3.place(x=10, y=380, width=540, height=30)

#ボタン作成
button = tk.Button(frame3, text="ファイル選択", command=getfile)
button.pack()

### キャンバス作成・配置
canvas = tk.Canvas(frame2, width=500, height=310)
canvas.place(x=10, y=10)

#イベントループ
root.mainloop()

出力

tkinterでフレームを3つ作成しています。分かりやすいように黒と白に色分けしています。

黒いフレームがframe1、画像を表示しているフレームがframe2、ファイル読み込みボタンが配置されているのがframe3です。

ファイル読み込みボタンを押すとファイルダイアログが立ち上がるので、任意の画像ファイルを選択してください。

選択されたファイルがframe2に表示されます。

OpenCVのimreadで読み込んでいますが、tkinterで表示するには「BGR→RGB→PIL→ImageTkフォーマットへ変換」が必要になります。

created by Rinker
翔泳社
タイトルとURLをコピーしました