機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【tkinter】【OpenCV】マウスクリックで画像の縮小ができるアプリを作る

tkinterOpenCVを組み合わせて、マウスクリックで画像の縮小(リサイズ)をできるアプリを作ってみる

f:id:stjun:20200322165628j:plain

元画像

f:id:stjun:20200322165647j:plain

画像の縮小(600×400)

※初心者向けにpythonの勉強法とその手順を記事にしました。

www.stjun.com

 

 

1. はじめに

 

 以前、OpenCVを用いて画像をリサイズする方法を紹介しました。

www.stjun.com

今回はTkinterと組み合わせて、マウス操作のみで簡単に画像をリサイズできるアプリを作ります。

画像の大きさは、まずははてなブログでも使いやすい600×400にします。 

(※そのうち画像の大きさ等もユーザーが任意に変えられる仕様にしたい思います。)

 

2. コードと実行結果

2.1 コード
#マウス選択で選んだ画像を600×400の大きさにリサイズ
#(ユーザー名)にお使いのPC名を入れてください

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("画像のリサイズ")

#ボタンを押した時の処理
def get(*args):
    
    #新しいフォルダをデスクトップに作成
    #ファイル名は年月日時分秒
    timestr=time.strftime("%Y%m%d-%H%M%S") 
    file_name="C:/Users/(ユーザー名)/Desktop/"+timestr
    os.makedirs(file_name)
    
    #複数の画像ファイルを選ぶ
    filetype=[("all file","*")]    
    path=fl.askopenfilenames(initialdir="C:/Users/(ユーザー名)/Desktop",filetypes=filetype,title="select file")
    
    # 読み取った画像を600×400に小さくする
    for i in range(len(path)):
        #画像の読みこみ
        img=cv2.imread(path[i])
        #画像を600×400に小さくする
        img_resize=cv2.resize(img,dsize=(600,400))
        #画像の名前と保存場所
        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(root,text="画像を選択してください(複数可)",width=30)
message.grid(row=0,column=0)

button=tk.Button(text="開く",command=get)
button.grid(row=0,column=1)

root.mainloop()

 

2.2 実行結果

上記を実行すると、次の画面が出てきます。

f:id:stjun:20200322170453j:plain

右の開くボタンを押して、リサイズしたい画像を選択します。マウスクリックやドラックで複数の画像を選択できます。

f:id:stjun:20200322171242j:plain
 右下の開くを押すと処理が始まり、デスクトップに新しいフォルダが作成されます。フォルダ名は処理を開始した時の日時です。

f:id:stjun:20200322171644j:plain

フォルダ開くと、画像ファイルの名前にresizeがつきます。

ファイルのサイズを見ると数十~数百kbと小さくなっており、確かにリサイズされていることが分かります。

f:id:stjun:20200322171754j:plain

また処理が完了するとメッセージも現れます。

f:id:stjun:20200322171856j:plain

 

3. 説明

3.1 前準備

プログラミング環境はAnacondaを使用しています。またAnacondaにはOpenCVが入ってないので、pipを用いてインストールしています。詳しくは過去記事を見て下さい。

www.stjun.com

またコード内に所々(ユーザー名)とあります。こちらにはお使いのPC名を入れて下さい。

確認するには、ファイルf:id:stjun:20200322173112p:plainをクリックして、PC⇒ローカルディスク(C:)⇒ユーザーと開くとPC名が分かります。

またフォルダ名や画像ファイル名は英数字でないと動かないためご注意ください。 

 

3.2 必要なモジュールとウインドの作成
#マウス選択で選んだ画像を600×400の大きさにリサイズ
#(ユーザー名)にお使いのPC名を入れてください

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("画像のリサイズ")

 cv2:OpenCVを使うため

tkintertkinterを使うため

tkinter.filedialog:マウスクリックで写真ファイルを選べるようにするためtkinter:messagebox:処理完了後にメッセージを表示するため

time,os:ファイル名を取得、設定するため

 

3.3 新しいフォルダを作成
#ボタンを押した時の処理
def get(*args):
    
    #新しいフォルダをデスクトップに作成
    #フォルダ名は年月日時分秒
    timestr=time.strftime("%Y%m%d-%H%M%S") 
    file_name="C:/Users/(ユーザー名)/Desktop/"+timestr
    os.makedirs(file_name)

 新しいフォルダの名前としてtime.strftime("%Y%m%d-%H%M%S")で年月日時分秒を取得します。

そしてfile_name=フォルダ保存場所+フォルダ名と加工して、os.makedirs()で新しいフォルダをデスクトップに作成します。

 

3.4 画像ファイルをマウスクリックで選ぶ
 #複数の画像ファイルを選ぶ
    filetype=[("all file","*")]    
    path=fl.askopenfilenames(initialdir="C:/Users/(ユーザー名)/Desktop",filetypes=filetype,title="select file")
    

 fl.askopenfienames()でファイルを次の画像のようにマウスクリックで開けるようになります。

f:id:stjun:20200322171242j:plain

引数は、開きたいファイルの場所、開きたいファイルタイプ(all fileにすると全てのファイルが対象になる)、画面のタイトル(なくても良い)です。

選択したファイルの情報は全てpathという変数に格納されます。

 

3.5 画像をリサイズする
# 読み取った画像を600×400に小さくする
    for i in range(len(path)):
        #画像の読みこみ
        img=cv2.imread(path[i])
        #画像を600×400に小さくする
        img_resize=cv2.resize(img,dsize=(600,400))
        #画像の名前と保存場所
        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','処理が完了しました')

 選んだ複数の画像ファイルを1つ1つリサイズしていくためにfor文を使っています。

画像の読み込みはcv2.imreadで、画像のリサイズはcv2.resizeで行っています。

詳しくは本記事の冒頭で紹介した過去記事をご覧ください。

その後、os.path.splittextとbasenameを組み合わせてファイル名を取得。

取得したファイル名の最後にresizeを付けて、imwrite()で保存じています。

処理が終わったらmb.showinfo()で処理が完了したことをユーザーに知らせます。

 

3.6 ウインド上のボタンとメッセージを作成
message=tk.Label(root,text="画像を選択してください(複数可)",width=30)
message.grid(row=0,column=0)

button=tk.Button(text="開く",command=get)
button.grid(row=0,column=1)

ウインドのメッセージとボタンを作成しています。

buttonの第2引数のcommand=getでボタンを押したら関数getが動作するよう結び付けてます。

 

 

おすすめ書籍

 

tkinterは参考書が非常に少ないです、というより日本語の参考書はほぼ皆無です。個人的には以下がお勧めです。

私が勉強していた時は以下のような参考書がなくネットで調べながら苦労してtkinterを覚えましたが、もし当時こんな書籍があったらもっと楽に学べたのに...と思うくらい基本的内容について丁寧に書かれています。

Amazonの月額読み放題サービス「Kindle unlimited」でも読めます。

初回30日間は無料、退会も簡単なので試しに無料体験して読んでみてもよさそうです。

 

 

4. 最後に

いかがだったでしょうか。

tkinterを様々なモジュールと組み合わせて使用できる汎用的なモジュールなのでお勧めです。