【もう間違えない!?】PythonのTkinterを用いて画像を表示する方法
今回はPythonのTkinterを活用して、画像を表示する方法を解説いたします。画像を表示したいが上手くいかない、画像を表示するコードを確認したい方は必見です。是非最後までご一読いただけますと幸いです。
執筆者 - おすすめの記事3選
画像表示を行うコードを書き始める前に
画像表示を行うコードを書き始める前に、
- Tkinterのバージョン
- 対応可能な画像の種類
に関して、確認と理解を深めておく必要があります。
順に説明していきますので、落ち着いてみていきましょう。
筆者の開発環境情報
開発環境 | バージョン |
---|---|
MacOS Big Sur | 11.4 |
pip | 21.1.2 (ターミナルを開いて、$ pip -V で確認する。) |
Pillow | 8.2.0 (ターミナルを開いて、$ pip list | grep Pillow で確認する。Pillow(PIL)のインストール手順) |
Tkinter | 8.6 |
シェル | zsh (ターミナルを開いて、$ echo $SHELL で確認する。) |
Tkinterのバージョンの確認
まずはTkinterのバージョンの確認です。
Tkinterのバージョンによっては、サポートしてしない画像の種類も存在するので、確認は必須。
以下の手順を踏まえて確認ください。
- ターミナルを開きます。
- ターミナル上で
$ python -i
を実行する。(Pythonのインタラクティブシェルを利用する) - ターミナル上で
import tkinter
を実行する。(Tkinterをimportする) - ターミナル上で
print(tkinter.TkVersion)
を実行して、Tkinterのバージョンを確認する。 - ターミナル上で
quit()
を実行して、ターミナルを閉じる。(quit()でインタラクティブシェルを終了する)
筆者の場合、8.6とバージョンが表示されました。次の「Tkinterで対応可能な画像の種類」でバージョン情報が必要になりますので、メモを取っておきましょう。
1>>> import tkinter
2>>> print(tkinter.TkVersion)
38.6
4>>> quit()
Tkinterで対応可能な画像の種類
以下の表でTkinterで対応可能・不可能な画像の種類をまとめました。
使いたい画像の種類が、Tkinterで利用可能かご確認ください。
画像の種類 | 特徴 | Tkinterの対応状況 |
---|---|---|
PGM | グレースケールの画像を格納する形式。 | 標準のTkinterで対応可能 |
PPM | フルカラー画像を格納する形式。 | 標準のTkinterで対応可能 |
GIF | アニメーションやベタ塗りの多いイラストに適した画像ファイル形式。 | 標準のTkinterで対応可能 |
XBM | カーソルやアイコンに使用するビットマップ画像を格納するための形式。 | 標準のTkinterで対応可能 |
PNG | Webで画像表示に使われる形式。 | Tkinterのバージョン8.6以降から標準のTkinterで対応可能 |
BMP | Windowsが標準でサポートする画像形式。 | 標準のTkinterで対応できない。PILライブラリを利用して画像を表示 |
JPEG | 写真によく使われる画像形式。.jpgと.jpegの2種類ありますが、同じ画像形式です。 | 標準のTkinterで対応できない。PILライブラリを利用して画像を表示 |
TIFF | 高画質で印刷したい時に適した画像ファイル形式。拡張子は.tifと.tiffの2種類存在する。 | 標準のTkinterで対応できない。PILライブラリを利用して画像を表示 |
WebP | Googleが新しく作った画像形式。 | 標準のTkinterで対応できない。PILライブラリを利用して画像を表示 |
Webでよく利用されるPNG画像が、バージョン8.6以降のTkinterに対応されました。
しかしJPEG画像は対応されていませんね。。JPEG画像を使う場面は、PILライブラリを利用しましょう。
「Tkinterで対応可能な画像の種類」に関して、もっと詳しく知りたい方は、公式ドキュメントをご確認ください。
PNG画像の表示方法
今回はよく使われる画像の種類、PNG画像とJPEG画像の表示方法に絞って解説することにします。
そして「PNG画像の表示方法」の章では、label Widget, canvas Widgetを用いてPNG画像を表示する方法をお伝えします。
この章ではPILライブラリを使っていません。Tkinterのバージョンが8.6以前の方は、次の章の「JPEG画像の表示方法」をご確認ください。
label Widgetを使ったPNG画像の表示サンプル
サンプルコードは以下のようになります。
1import tkinter as tk
2
3class Application(tk.Frame):
4 # label WidgetにてPNG画像を描画する関数
5 def drawLabelPngImg(self):
6 # drawLabelPngImg関数終了後、ガベージコレクションが起こり、画像情報(pngImg変数)が自動消滅するのを防ぐため、global変数を利用する。
7 # 画像の描画は、if __name__ == "__main__":関数内で行われる。 → ローカル変数だとif __name__ == "__main__":関数内では、画像情報(pngImg変数)は残っていない。 → グローバル変数を利用して、drawLabelPngImg関数終了後も、画像情報(pngImg変数)を残るようにする。
8 # グローバル変数、ローカル変数とは? : https://itsakura.com/python-local-global#:~:text=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%AE,%E5%A4%89%E6%95%B0%E5%90%8D%E3%81%A7%E3%82%82%E5%8F%AF%E3%81%A7%E3%81%99%E3%80%82
9 # ガベージコレクションとは? : https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3#:~:text=%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E8%8B%B1%3A%20garbage%20collection,%E3%83%9E%E3%83%83%E3%82%AB%E3%83%BC%E3%82%B7%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%99%BA%E6%98%8E%E3%81%95%E3%82%8C%E3%81%9F%E3%80%82
10 global pngImg
11
12 # (PNG画像ファイルパスをお好みでご入力ください。)
13 # PNG画像ファイルパスから画像のインスタンスを生成する。
14 # インスタンスとは? : https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9.html
15 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
16
17 # label Widgetを作成する。
18 # width : 幅の設定
19 # height : 高さの設定
20 # image : 画像の設定
21 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/
22 label = tk.Label(width=100, height=100, image=pngImg)
23
24 # label Widgetをどのように配置するのか?
25 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
26 label.pack()
27
28 def __init__(self, master=None):
29 # Windowの初期設定を行う。
30 super().__init__(master)
31
32 # Windowの画面サイズを設定する。
33 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
34 self.master.geometry("300x200")
35
36 self.drawLabelPngImg()
37
38# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
39if __name__ == "__main__":
40 # Windowを生成する。
41 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
42 root = tk.Tk()
43 app = Application(master=root)
44
45 # Windowをループさせて、継続的にWindow表示させる。
46 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
47 app.mainloop()
pngImg = tk.PhotoImage(file="/path_to/xxx.png")
の/path_to/xxx.png
箇所を、お好みのPNG画像ファイルパスへ変更ください。
上記コードをPython環境で実行すると、以下の画像のようにPNG画像を描画できます。
label Widgetに関しては、【初学者必見!?】Tkinterで使われるlabelの活用方法を徹底解説で総括していますので、詳しく知りたい方は是非ご確認ください。
canvas Widgetを使ったPNG画像の表示サンプル
サンプルコードは以下のようになります。
1import tkinter as tk
2
3class Application(tk.Frame):
4 # canvas WidgetにてPNG画像を描画する関数
5 def drawCanvasPngImg(self):
6 # canvas Widgetを作成する。
7 # height : 高さの設定
8 # width : 幅の設定
9 # bg : 背景色
10 # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
11 # Canvasについて : https://kuroro.blog/python/V63iINoXI8iwMeRMEJPK/
12 canvas = tk.Canvas(height=100, width=100, bg="white")
13
14 # canvas Widgetをどのように配置するのか?
15 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
16 canvas.pack()
17
18 # (PNG画像ファイルパスをお好みでご入力ください。)
19 # PNG画像ファイルパスから画像のインスタンスを生成する。
20 # インスタンスとは? : https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9.html
21 # canvas.photo内に画像情報が保存されるため、グローバル変数を宣言しなくてよくなる。
22 canvas.photo = tk.PhotoImage(file="/path_to/xxx.png")
23
24 # Canvasについて : https://kuroro.blog/python/ANyM9WLpd0LSXRQAELOj/
25 # 第一引数 : x座標位置
26 # 第二引数 : y座標位置
27 # image : 画像の設定
28 canvas.create_image(0, 0, image=canvas.photo)
29
30 def __init__(self, master=None):
31 # Windowの初期設定を行う。
32 super().__init__(master)
33
34 # Windowの画面サイズを設定する。
35 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
36 self.master.geometry("300x200")
37
38 self.drawCanvasPngImg()
39
40# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
41if __name__ == "__main__":
42 # Windowを生成する。
43 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
44 root = tk.Tk()
45 app = Application(master=root)
46
47 # Windowをループさせて、継続的にWindow表示させる。
48 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
49 app.mainloop()
canvas.photo = tk.PhotoImage(file="/path_to/xxx.png")
の/path_to/xxx.png
箇所を、お好みのPNG画像ファイルパスへ変更ください。
上記コードをPython環境で実行すると、以下の画像のようにPNG画像を描画できます。
canvas Widgetに関しては、Tkinterで使われるcanvasとは?canvasの作成方法を徹底解説でまとめましたので、詳しく知りたい方は是非ご確認ください。
JPEG画像の表示方法
「JPEG画像の表示方法」の章では、label Widget, canvas Widgetを用いてJPEG画像を表示する方法をお伝えします。
label Widgetを使ったJPEG画像の表示サンプル
サンプルコードは以下のようになります。
1import tkinter as tk
2from PIL import Image, ImageTk
3
4class Application(tk.Frame):
5 # label WidgetにてJPEG画像を描画する関数
6 def drawLabelJpgImg(self):
7 # drawLabelJpgImg関数終了後、ガベージコレクションが起こり、画像情報(jpgImg変数)が自動消滅するのを防ぐため、global変数を利用する。
8 # 画像の描画は、if __name__ == "__main__":関数内で行われる。 → ローカル変数だとif __name__ == "__main__":関数内では、画像情報(jpgImg変数)は残っていない。 → グローバル変数を利用して、drawLabelJpgImg関数終了後も、画像情報(jpgImg変数)を残るようにする。
9 # グローバル変数、ローカル変数とは? : https://itsakura.com/python-local-global#:~:text=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%AE,%E5%A4%89%E6%95%B0%E5%90%8D%E3%81%A7%E3%82%82%E5%8F%AF%E3%81%A7%E3%81%99%E3%80%82
10 # ガベージコレクションとは? : https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3#:~:text=%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E8%8B%B1%3A%20garbage%20collection,%E3%83%9E%E3%83%83%E3%82%AB%E3%83%BC%E3%82%B7%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%99%BA%E6%98%8E%E3%81%95%E3%82%8C%E3%81%9F%E3%80%82
11 global jpgImg
12
13 # Tkinter8.6以降でも、標準TkinterではJPEG対応できないため、PILを利用する。
14 # 画像に関する公式ドキュメント : https://docs.python.org/ja/3/library/tkinter.html#images
15 # openコマンドについて : https://carp.cc.it-hiroshima.ac.jp/~tateyama/Lecture/AppEx/PythonImagePIL.html
16 # (JPEG画像ファイルパスをお好みでご入力ください。)
17 img = Image.open('/path_to/xxx.jpg', 'r')
18
19 # JPEG画像ファイルパスから画像のインスタンスを生成する。
20 # インスタンスとは? : https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9.html
21 jpgImg = ImageTk.PhotoImage(img)
22
23 # label Widgetを作成する。
24 # width : 幅の設定
25 # height : 高さの設定
26 # image : 画像の設定
27 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/
28 label = tk.Label(width=100, height=100, image=jpgImg)
29
30 # label Widgetをどのように配置するのか?
31 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
32 label.pack()
33
34 def __init__(self, master=None):
35 # Windowの初期設定を行う。
36 super().__init__(master)
37
38 # Windowの画面サイズを設定する。
39 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
40 self.master.geometry("300x200")
41
42 self.drawLabelJpgImg()
43
44# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
45if __name__ == "__main__":
46 # Windowを生成する。
47 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
48 root = tk.Tk()
49 app = Application(master=root)
50
51 # Windowをループさせて、継続的にWindow表示させる。
52 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
53 app.mainloop()
img = Image.open('/path_to/xxx.jpg', 'r')
の/path_to/xxx.jpg
箇所を、お好みのJPEG画像ファイルパスへ変更ください。
上記コードをPython環境で実行すると、以下の画像のようにJPEG画像を描画できます。
canvas Widgetを使ったJPEG画像の表示サンプル
サンプルコードは以下のようになります。
1import tkinter as tk
2from PIL import Image, ImageTk
3
4class Application(tk.Frame):
5 # canvas WidgetにてJPEG画像を描画する関数
6 def drawCanvasJpgImg(self):
7 # canvas Widgetを作成する。
8 # height : 高さの設定
9 # width : 幅の設定
10 # bg : 背景色
11 # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
12 # Canvasについて : https://kuroro.blog/python/V63iINoXI8iwMeRMEJPK/
13 canvas = tk.Canvas(height=100, width=100, bg="white")
14
15 # canvas Widgetをどのように配置するのか?
16 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
17 canvas.pack()
18
19 # Tkinter8.6以降でも、標準TkinterではJPEG対応できないため、PILを利用する。
20 # 画像に関する公式ドキュメント : https://docs.python.org/ja/3/library/tkinter.html#images
21 # openコマンドについて : https://carp.cc.it-hiroshima.ac.jp/~tateyama/Lecture/AppEx/PythonImagePIL.html
22 # (JPEG画像ファイルパスをお好みでご入力ください。)
23 img = Image.open('/path_to/xxx.jpg', 'r')
24
25 # JPEG画像ファイルパスから画像のインスタンスを生成する。
26 # インスタンスとは? : https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9.html
27 # canvas.photo内に画像情報が保存されるため、グローバル変数を宣言しなくてよくなる。
28 canvas.photo = ImageTk.PhotoImage(img)
29
30 # Canvasについて : https://kuroro.blog/python/ANyM9WLpd0LSXRQAELOj/
31 # 第一引数 : x座標位置
32 # 第二引数 : y座標位置
33 # image : 画像の設定
34 canvas.create_image(0, 0, image=canvas.photo)
35
36 def __init__(self, master=None):
37 # Windowの初期設定を行う。
38 super().__init__(master)
39
40 # Windowの画面サイズを設定する。
41 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
42 self.master.geometry("300x200")
43
44 self.drawCanvasJpgImg()
45
46# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
47if __name__ == "__main__":
48 # Windowを生成する。
49 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
50 root = tk.Tk()
51 app = Application(master=root)
52
53 # Windowをループさせて、継続的にWindow表示させる。
54 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
55 app.mainloop()
img = Image.open('/path_to/xxx.jpg', 'r')
の/path_to/xxx.jpg
箇所を、お好みのJPEG画像ファイルパスへ変更ください。
上記コードをPython環境で実行すると、以下の画像のようにJPEG画像を描画できます。
Tkinterで画像を表示する際の注意点
Tkinterで画像を表示する際に注意すべきことがあります。
- 画像の描画が施行されるのは、mainloop()関数を実行して、Windowを開いてからである。
- Windowを開く前に、画像情報が残っていなければ、画像は表示されない。
試しに「label Widgetを使ったJPEG画像の表示サンプル」で紹介した、drawLabelJpgImg()
関数のglobal jpgImg
箇所をコメントアウトし、Pythonを実行ください。以下の画像のようになってしまいます。。
以上のことを踏まえて、if __name__ == "__main__":
内でも画像情報が残るように、グローバル変数を利用する必要があります。
PhotoImageで用意される関数を用いて、画像を編集
PhotoImageでは、画像を編集できるように、
- blank
- copy
- zoom
- subsample
- get
- put
- write
- transparency_set
- transparency_get
の関数が用意されています。
関数について順に確認していきましょう。
下準備
PhotoImageで用意される関数を検証するため、下準備を行います。以下のコードを作成して、PhotoImageで用意される関数について、学んでいきましょう。
1import tkinter as tk
2
3class Application(tk.Frame):
4 # label WidgetにてPNG画像を描画する関数
5 def drawLabelPngImg(self):
6 # drawLabelPngImg関数終了後、ガベージコレクションが起こり、画像情報(pngImg変数)が自動消滅するのを防ぐため、global変数を利用する。
7 # 画像の描画は、if __name__ == "__main__":関数内で行われる。 → ローカル変数だとif __name__ == "__main__":関数内では、画像情報(pngImg変数)は残っていない。 → グローバル変数を利用して、drawLabelPngImg関数終了後も、画像情報(pngImg変数)を残るようにする。
8 # グローバル変数、ローカル変数とは? : https://itsakura.com/python-local-global#:~:text=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%AE,%E5%A4%89%E6%95%B0%E5%90%8D%E3%81%A7%E3%82%82%E5%8F%AF%E3%81%A7%E3%81%99%E3%80%82
9 # ガベージコレクションとは? : https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3#:~:text=%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E8%8B%B1%3A%20garbage%20collection,%E3%83%9E%E3%83%83%E3%82%AB%E3%83%BC%E3%82%B7%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%99%BA%E6%98%8E%E3%81%95%E3%82%8C%E3%81%9F%E3%80%82
10 global pngImg
11
12 # (PNG画像ファイルパスをお好みでご入力ください。)
13 # PNG画像ファイルパスから画像のインスタンスを生成する。
14 # インスタンスとは? : https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9.html
15 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
16
17 # label Widgetを作成する。
18 # width : 幅の設定
19 # height : 高さの設定
20 # image : 画像の設定
21 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/
22 label = tk.Label(width=100, height=100, image=pngImg)
23
24 # label Widgetをどのように配置するのか?
25 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
26 label.pack()
27
28 def __init__(self, master=None):
29 # Windowの初期設定を行う。
30 super().__init__(master)
31
32 # Windowの画面サイズを設定する。
33 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
34 self.master.geometry("300x200")
35
36 self.drawLabelPngImg()
37
38# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
39if __name__ == "__main__":
40 # Windowを生成する。
41 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
42 root = tk.Tk()
43 app = Application(master=root)
44
45 # Windowをループさせて、継続的にWindow表示させる。
46 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
47 app.mainloop()
pngImg = tk.PhotoImage(file="/path_to/xxx.png")
の/path_to/xxx.png
箇所を、お好みのPNG画像ファイルパスへ変更ください。
上記コードをPython環境で実行すると、以下の画像のようにPNG画像を描画できます。
blank
blank関数を利用すると、画像を透明状態にできます。
1.blank()
で定義されます。戻り値はありません。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ pngImg.blank()
以下の画像のように、画像が透明状態になります。
copy
copy関数を利用すると、画像をコピーできます。
1# 戻り値 : 画像のインスタンス
2.copy()
で定義されます。戻り値として、画像のインスタンスが返されます。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ pngImg = pngImg.copy()
以下の画像のように、コピーした画像を描画できます。
zoom
zoom関数を利用すると、画像を拡大して表示できます。
1# 第一引数 : 画像の幅に関する倍率(整数のみ)
2# 第二引数 : 画像の高さに関する倍率(整数のみ)
3# 戻り値 : 画像のインスタンス
4.zoom(画像の幅に関する倍率(整数のみ), 画像の高さに関する倍率(整数のみ))
で定義されます。戻り値として、画像のインスタンスが返されます。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ pngImg = pngImg.zoom(1, 2)
以下の画像のように、画像を拡大した状態で表示できます。
subsample
subsample関数を利用すると、画像を縮小して表示できます。
1# 第一引数 : 画像の幅に関する倍率(整数のみ)
2# 第二引数 : 画像の高さに関する倍率(整数のみ)
3# 戻り値 : 画像のインスタンス
4.subsample(画像の幅に関する倍率(整数のみ), 画像の高さに関する倍率(整数のみ))
で定義されます。戻り値として、画像のインスタンスが返されます。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ pngImg = pngImg.subsample(1, 2)
以下の画像のように、画像を縮小した状態で表示できます。
get
get関数を利用すると、指定する位置の画像の色情報をRGB形式で取得できます。
1# 第一引数 : 画像のx座標
2# 第二引数 : 画像のy座標
3# 戻り値 : 指定する位置の画像の色情報(RGB形式)
4.get(画像のx座標, 画像のy座標)
で定義されます。戻り値として、指定する位置の画像の色情報が返されます。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ print(pngImg.get(30, 30))
以下の画像のように、指定する位置の画像の色情報を取得できます。
put
put関数を利用すると、指定する位置の画像の色を変更できます。
1# 第一引数 : 色に関する文字列
2# 色に関する参考リンク : https://www.colordic.org/
3# 第二引数 : (画像のx座標, 画像のy座標)
4.put('色に関する文字列', (画像のx座標, 画像のy座標))
で定義されます。戻り値はありません。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ for i in range(0, 50):
6+ for j in range(0, 100):
7+ pngImg.put('#00008b', (i, j))
以下の画像のように、指定する位置の画像の色を変更できます。
write
write関数を利用すると、画像ファイルを保存できます。
1# 第一引数 : 画像ファイル名
2.write('画像ファイル名')
で定義されます。戻り値はありません。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ pngImg.write('piyo.png')
piyo.pngの画像ファイル名でファイルを保存できます。
transparency_set
transparency_set関数を利用すると、指定する位置の画像を透明にするか設定できます。
1# 第一引数 : 画像のx座標
2# 第二引数 : 画像のy座標
3# 第三引数 : True : 指定する位置の画像を透明にする, False : 指定する位置の画像を透明にしない。
4.transparency_set(画像のx座標, 画像のy座標, True or False)
で定義されます。戻り値はありません。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ for i in range(0, 50):
6+ for j in range(0, 100):
7+ pngImg.transparency_set(i, j, True)
以下の画像のように、指定する位置の画像を透明に変更します。
transparency_get
transparency_get関数を利用すると、指定する位置の画像が透明かどうか取得できます。
1# 第一引数 : 画像のx座標
2# 第二引数 : 画像のy座標
3# 戻り値 : True : 指定する位置の画像が透明, False : 指定する位置の画像が透明でない。
4.transparency_get(画像のx座標, 画像のy座標)
で定義されます。
戻り値として、True(指定する位置の画像が透明), False(指定する位置の画像が透明でない)が返されます。
例えば下準備コードのpngImg = tk.PhotoImage(file="/path_to/xxx.png")
の下へ、以下のコードを追加すると、
1def drawLabelPngImg(self):
2 ...
3
4 pngImg = tk.PhotoImage(file="/path_to/xxx.png")
5+ for i in range(0, 50):
6+ for j in range(0, 100):
7+ pngImg.transparency_set(i, j, True)
8+ print(pngImg.transparency_get(1, 1))
以下の画像のように、True(指定する位置の画像が透明)が表示されます。
まとめ
- PythonのTkinterを使って画像表示する前に、Tkinterのバージョンの確認と画像の種類に関して理解する。
- 画像の描画が開始されるのは、mainloop()を実行してWindowを開いてからである。
- 画像情報が残るように、グローバル変数を利用する。
参考文献
- Tkinterの画像に関するサンプルコード
- インタラクティブシェルとは?
- グレースケールとは?
- ベタ塗りについて
- 画像の種類まとめ
- ビットマップ画像とは?
- カーソルとは?
- PILライブラリとは?
- Tkinterに関する画像の公式ドキュメント
- ガベージコレクションとは?
- コメントアウトとは?
- RGBとは?