前回作ったアプリに、画像を任意の大きさに縮小できる機能を付ける

※初心者向けにpythonの勉強法とその手順を記事にしました。
www.stjun.com
1. はじめに
前回、tinterとOpenCVを組み合わせて、マウス操作のみで簡単に画像をリサイズ(600×400)できるアプリを作りました。
www.stjun.com
今回は画像の縮小サイズをユーザーが自由に設定できるように機能を追加します。
画像を好きなサイズに縮小できれば、ブログに写真を載せるのも楽になりますね。
2. コードと実行結果
2.1 コード
import cv2
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
import time
import os
root=tk.Tk()
root.title("画像のリサイズ")
frame_1 = tk.LabelFrame(root,labelanchor="nw",text="実行",foreground="green")
frame_1.grid(row=0, column=0)
frame_2 = tk.LabelFrame(root,labelanchor="nw",text="詳細",foreground="green")
frame_2.grid(row=1, column=0,sticky="we")
def get(*args):
height=int(num_height.get())
width=int(num_width.get())
timestr=time.strftime("%Y%m%d-%H%M%S")
file_name="(ユーザー名)"+timestr
os.makedirs(file_name)
filetype=[("all file","*")]
path=fl.askopenfilenames(initialdir="(ユーザー名)",filetypes=filetype,title="select file")
for i in range(len(path)):
img=cv2.imread(path[i])
img_resize=cv2.resize(img,dsize=(width,height))
name=os.path.splitext(os.path.basename(path[i]))
hozon_file_name=file_name+'/'+name[0]+'_resize'+'.jpg'
cv2.imwrite(hozon_file_name,img_resize)
message["text"]="処理が完了しました"
mb.showinfo('done','処理が完了しました')
message=tk.Label(frame_1,text="画像を選択してください(複数可)",width=30)
message.grid(row=0,column=0)
button=tk.Button(frame_1,text="開く",command=get)
button.grid(row=0,column=1)
label_height=tk.Label(frame_2,text='縦=',width=5)
label_height.grid(row=1,column=0)
num_height=tk.Entry(frame_2,width=5)
num_height.insert(tk.END,'600')
num_height.grid(row=1,column=1)
label_width=tk.Label(frame_2,text='横=',width=5)
label_width.grid(row=1,column=2)
num_width=tk.Entry(frame_2,width=5)
num_width.insert(tk.END,'400')
num_width.grid(row=1,column=3)
root.mainloop()
2.2 実行結果
上記を実行すると、次の画面が出てきます。

例えば横を2000に設定します。

そうすると確かに以下のように横長にリサイズされています。

元画像

リサイズ後
3. 説明
3.1 前準備
プログラミング環境はAnacondaを使用しています。またAnacondaにはOpenCVが入ってないので、pipを用いてインストールしています。詳しくは過去記事を見て下さい。
www.stjun.com
またコード内に所々(ユーザー名)とあります。こちらにはお使いのPC名を入れて下さい。
確認するには、ファイル
をクリックして、PC⇒ローカルディスク(C:)⇒ユーザーと開くとPC名が分かります。
またフォルダ名や画像ファイル名は英数字でないと動かないためご注意ください。
また基本的なコードは前回と同じため、前記事をご覧ください。
www.stjun.com
3.2 今回追加した部分:ユーザーの設定値を取得する方法
今回追加した処理は以下です。
num_height=tk.Entry(frame_2,width=5)
num_height.insert(tk.END,'600')
num_width=tk.Entry(frame_2,width=5)
num_width.insert(tk.END,'400')
height=int(num_height.get())
width=int(num_width.get())
img_resize=cv2.resize(img,dsize=(width,height))
tk.Entry()でユーザーが自由に数字を入力できる欄を作ります。
次にget()で数字を読み取り、int()で整数型に直します。
最後に読み取った整数値をcv2.resize()に渡し、画像をリサイズします。
おすすめ書籍
tkinterは参考書が非常に少ないです、というより日本語の参考書はほぼ皆無です。個人的には以下がお勧めです。
私が勉強していた時は以下のような参考書がなくネットで調べながら苦労してtkinterを覚えましたが、もし当時こんな書籍があったらもっと楽に学べたのに...と思うくらい基本的内容について丁寧に書かれています。
Amazonの月額読み放題サービス「Kindle unlimited」でも読めます。
初回30日間は無料、退会も簡単なので試しに無料体験して読んでみてもよさそうです。
4. 最後に
いかがだったでしょうか。
tkinterを様々なモジュールと組み合わせて使用できるため非常に便利です。