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

プラグラミング言語「PYTHON」を使ってみよう!!

業務自動化・効率化の実例を踏まえ、解説できればと思っています。対象は、プログラムを学び始めた初心者向けとなります。

今回はGUI開発アプリケーションのtkinterを使用します。tkinterはディスクトップアプリ作成のための定番ライブラリです。

今回の内容

  • 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をコピーしました