画像ファイルを読み込むアプリを作る
R5.2月からPythonの勉強をしているプログラミング初心者です。
勉強した内容を備忘メモ程度にアウトプットしていきます。
参考書籍はこちら。
(さすがに全てまるまる写してしまうとまずいので部分的に抽出していきます。)
画像表示アプリを作ってみよう
今回は外部ライブラリを使って画像を読み込むアプリを作ってみましょう。
(ライブラリのインストール方法は割愛します。)
このアプリは
ウインドウを表示する「tkinter(前回も使いましたね)」、
ファイルダイアログを使う「tkinter.filedialog」、
画像を扱う「PIL.Image」、
画像をtkinterで作った画面上に表示させるための「PIL.ImageTk」、
の4つのモジュールを使います。
早速プログラムを入力してみましょう。
import tkinter as tk
import tkinter.filedialog as fd
import PIL.Image
import PIL.ImageTk
def dispPhoto(path):
newImage = PIL.Image.open(path).resize*1
imageData = PIL.ImageTk.PhotoImage(newImage)
imageLabel.configure(image = imageData)
imageLabel.Image = imageData
def openFile():
fpath = fd.askopenfilename()
if fpath:
dispPhoto(fpath)
root = tk.Tk()
root.geometry("400x350")
btn = tk.Button(text="ファイルを開く",command = openFile)
imageLabel = tk.Label()
btn.pack()
imageLabel.pack()
tk.mainloop()
出力するとこんな感じのウインドウが表示されます。
「ファイルを開く」ボタンを押すとダイアログが表示され、
画像を選択すると、(今回は僕の大好きなBUMP OF CHICKENのギターボーカル藤原基央さんのめちゃくちゃかっこいい写真を選択します。)
ちょっと大きさが変わりましたが表示されました!やっぱかっこいいぜ藤君!!
1~4行目の解説
では一行ずつ細かく見てみましょう。見たことない関数ばかりで頭がおかしくなりそうですが、一行ずつ細かく見ていけば大丈夫です。ちゃんと理解できます。いや、嘘つきました、すみません。正直理解できていないところもあります。
import tkinter as tk
import tkinter.filedialog as fd
import PIL.Image
import PIL.ImageTk
最初の1~4行目までは大丈夫ですよね。まずはライブラリをインポートします。
「as ~」の部分はこれからプログラムを書く時にそのままの名前だと入力面倒なので略して呼びますよ~という事でしたね。
6行目~10行目の解説
def dispPhoto(path):
newImage = PIL.Image.open(path).resize*2
imageData = PIL.ImageTk.PhotoImage(newImage)
imageLabel.configure(image = imageData)
imageLabel.Image = imageData
ここがすごく難しかったです。「def」という事は何か新しく関数を作っていることがわかります。
「def dispPhoto(path)」これからdispPhoto(path)という関数を定義しますという命令ですね。
「newImage = PIL.Image.open(path).resize*3 」画像データを読み込ませ、サイズを300x300に変更する命令をします。
「 imageData = PIL.ImageTk.PhotoImage(newImage)」先ほど読み込んだ画像データ(newImage)を表示させる命令をします。
「imageLabel.configure(image = imageData)」そしてその読み込んで表示させる画像データをラベルに貼り付けます。
「imageLabel.Image = imageData」ここがわからなかった。参考書籍にも記載がなく、グーグル検索でなんのためにこの1行があるか調べたのですが見つかったのが「GC(ガーベッジコレクション)による変数データ削除を動かさないようにするために、imageLabel.image というパラメーターに画像データを結びつけておく。」ということでした。自分にはまだ意味が解らない…。その解説した人も「今はまだ詳しくわからなくいいので今後どこかのタイミングで勉強してください」とのことでした。
ということで、ここで作った「dispPhoto(path)」という関数は画像データを読み込んでリサイズして表示させる命令ですね。
12行目~15行目の解説
def openFile():
fpath = fd.askopenfilename()
if fpath:
dispPhoto(fpath)
「def openFile():」はわかりますね。openFile()という関数を定義しています。
「fpath = fd.askopenfilename()」ファイルダイアログを開いて選択したファイル名を取得します。
「if fpath」if文は以前やりましたね。この場合はもしファイル名があったら~です。
「 dispPhoto(fpath)」さきほど6~10行目で定義したこと(画像を読み込み、リサイズし表示する)を実行してくださいという文ですね。
17~24行目の解説
root = tk.Tk()
root.geometry("400x350")
btn = tk.Button(text="ファイルを開く",command = openFile)
imageLabel = tk.Label()
btn.pack()
imageLabel.pack()
tk.mainloop()
ここら辺からは以前もやったのですいすいいけそうですね。
root = tk.Tk()
root.geometry("400x350")
この2つはウィンドウを作成してウィンドウの大きさを決める命令ですね。
ウィンドウの上にボタンやラベルと配置していきます。
「btn = tk.Button(text="ファイルを開く",command = openFile)」ボタンに「ファイルを開く」というテキストをつけて、ボタンを押すと先ほど作ったopenFile関数が発動するようになっています。
「imageLabel = tk.Label()」画面表示用のラベルを作ります。
「btn.pack()」ウィンドウにボタンを配置します。
「imageLabel.pack()」ウィンドウにラベルを配置します。
「tk.mainloop()」作ったウインドウを表示します。
まぁ、ここら辺は正直ウィニングラン的な感じがします。
まとめ
さて、今回はこんな感じです。ライブラリの関数で出来ることが多くてなかなか難しかったですね…。ちょっとずつ覚えていきましょう。ライブラリの関数で何ができるかを知っておくことってめちゃくちゃ重要な感じがしますね。参考書籍ではこの後にアプリの改造などもあるのですがブログでは触れないことにします。