質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

4098閲覧

Pythonでキャンバスに張り付けた画像をリサイズしたい

hero_mato

総合スコア5

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/07/13 06:07

Pythonを使用し1枚の画像を左右に分割してキャンバスに出力するプログラムを作成しています。出力したキャンバスをリサイズした際に、表示している画像もキャンバスと同じサイズに拡大/縮小を行いたいのですが、画像のサイズが変化しません。画像も同時にリサイズ方法をご存じの方がいらっしゃれば修正方法のご教示をお願いいたします。

import tkinter from PIL import Image, ImageTk # windowを描画 window1 = tkinter.Tk() window2 = tkinter.Toplevel(window1) # windowサイズを変更 window1.geometry("800x600") #実際に表示するウィンドウのサイズ window2.geometry("800x600") #実際に表示するウィンドウのサイズ # windowタイトルを設定 window1.title("the Tkinter 1st") window2.title("the Tkinter 2nd") # 画像を表示するための準備 img = Image.open('test.jpg') img_resize = img.resize(size=(800,600)) tkimg = ImageTk.PhotoImage(img_resize) # 画像を表示するためのキャンバスの作成(黒で表示) canvas = tkinter.Canvas(bg = "black", width=800, height=600) canvas.place(x=0, y=0) # 左上の座標を指定 # キャンバスに画像を表示する。第一引数と第二引数は、x, yの座標 canvas.create_image(0, 0, image=tkimg, anchor=tkinter.NW) canvas.pack() # 画像2を表示するための準備 img2 = Image.open('test2.jpg') img2_resize = img2.resize(size=(800,600)) tkimg2 = ImageTk.PhotoImage(img2_resize) # 画像を表示するためのキャンバスの作成(白で表示) canvas2 = tkinter.Canvas(window2, bg = "white", width=800, height=600) canvas2.place(x=0, y=0) # 左上の座標を指定 # キャンバスに画像を表示する。第一引数と第二引数は、x, yの座標 canvas2.create_image(0, 0, image=tkimg2, anchor=tkinter.NW) canvas2.pack() # 図形の大きさを変更 def change_size(event): rw = event.width rh = event.height img_resize = img.resize(size=(rw,rh)) img = canvas.resize(img_resize, dsize=(rw, rh), fx=ratio, fy=ratio,interpolation=canvas.INTER_LANCZOS4) # 図形の大きさを変更 def change_size2(event): rw2 = event.width rh2 = event.height img2_resize = img2.resize(size=(rw2,rh2)) img2= canvas.resize(img2_resize, dsize=(rw2, rh2),fx=ratio, fy=ratio,interpolation=canvas.INTER_LANCZOS4) #画面サイズ変更イベント window1.bind('<Configure>', change_size) window2.bind('<Configure>', change_size2) #表示 window1.mainloop() コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

以前の画像を削除 canvas.delete してから、
リサイズした画像の反映には再度 canvas.create_image が必要です。

PhotoImageオブジェトを格納する変数のスコープには注意。ローカル変数だと消えてしまいます。
この場合 change_size 関数内で使う場合、その変数を global 宣言します。

他に対応が必要な箇所:

  • canvas.pack(fill=tkinter.BOTH, expand=True) キャンバス自体をウィンドウにフィットさせる
  • ウィンドウを動かしただけでも同イベントが発生するので、

 サイズが変わっていない場合はresizeを発生しないように対処した方が良いです。

投稿2020/07/13 10:44

編集2020/07/13 12:03
teamikl

総合スコア8681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問