画像の拡大縮小を行いたいです。
調べたところ canvas.scale というのを使えば実現できそうなのですが、実際に画像に反映されません。
自分的にはcanvas.scaleに設定するIDが間違っていると思うのですが、実際のところ何が間違っているのでしょうか?
回答よろしくお願いします。
該当ソース
Python
from decimal import Decimal import tkinter as tk class App: def __init__(self, win): self.win = win self.win.geometry("500x500") self.img_disp_flag = False def view_create(self): self.win.rowconfigure(0, weight=1) self.win.columnconfigure(0, weight=1) self.frame_viewer = tk.Frame(win) self.frame_viewer.grid(row=0, column=0, sticky="nsew") self.frame_button = tk.Frame(win) self.frame_button.grid(row=1, column=0, sticky="nsew") self.frame_viewer.rowconfigure(0, weight=1) self.frame_viewer.columnconfigure(0, weight=1) self.canvas = tk.Canvas(self.frame_viewer) self.canvas.grid(row=0, column=0, sticky="nsew") self.ysb = tk.Scrollbar(self.frame_viewer, width=20, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.ysb.set) self.ysb.grid(row=0, column=1, sticky="ns") self.xsb = tk.Scrollbar(self.frame_viewer, width=20, orient="horizontal", command=self.canvas.xview) self.canvas.configure(xscrollcommand=self.xsb.set) self.xsb.grid(row=1, column=0, sticky="ew") self.scale_up_button = tk.Button(self.frame_button, text="+", width=2) self.scale_up_button.grid(row=0, column=0, padx=5, pady=5) self.scale_down_button = tk.Button(self.frame_button, text="-", width=2) self.scale_down_button.grid(row=0, column=1, padx=5, pady=5) self.scale_default_button = tk.Button(self.frame_button, text="±0", width=2) self.scale_default_button.grid(row=0, column=2, padx=5, pady=5) self.img_disp_button = tk.Button(self.frame_button, text="img_disp") self.img_disp_button.grid(row=0, column=3, padx=5, pady=5) self.img_hide_button = tk.Button(self.frame_button, text="img_hide") self.img_hide_button.grid(row=0, column=4, padx=5, pady=5) self.scale = Decimal("1.0") self.canvas.scale("all", 0, 0, self.scale, self.scale) # バインド def bind_event(self): self.canvas.bind("<MouseWheel>", lambda e:self.wheel_rotated(e, app)) self.scale_up_button.bind("<ButtonRelease>", lambda e:self.zoom_up(e, app)) self.scale_down_button.bind("<ButtonRelease>", lambda e:self.zoom_down(e, app)) self.scale_default_button.bind("<ButtonRelease>", lambda e:self.zoom_default(e, app)) self.img_disp_button.bind("<ButtonRelease>", lambda e:self.img_disp(e, app)) self.img_hide_button.bind("<ButtonRelease>", lambda e:self.img_hide(e, app)) # 画像上でマウスホイールを動かしたとき def wheel_rotated(self, e, app): # 垂直スクロールバーのみマウスホイールに対応(水平には対応できないか・・・) # https://stackoverflow.com/questions/17355902/python-tkinter-binding-mousewheel-to-scrollbar self.canvas.yview_scroll(int(-1*(e.delta/120)), "units") # 画像の拡大 def zoom_up(self, e, app): self.scale += Decimal("0.1") self.canvas.scale("current", 0, 0, self.scale, self.scale) print(self.scale) # 画像の縮小 def zoom_down(self, e, app): self.scale -= Decimal("0.1") self.canvas.scale("current", 0, 0, self.scale, self.scale) print(self.scale) # 倍率をデフォルトに戻す def zoom_default(self, e, app): self.scale = Decimal("1.0") self.canvas.scale("current", 0, 0, self.scale, self.scale) print(self.scale) """ canvas.scale(ID, x0, y0, rx, ry) ID オブジェクトのID x0 基準となるx座標 y0 基準となるy座標 rx x座標の拡大率 ry y座標の拡大率 """ # 画像の表示 def img_disp(self, e, app): if self.img_disp_flag == False: self.imgfile = "c:\Users\ユーザ名\Desktop\scale_test\test.png" self.img = tk.PhotoImage(file=self.imgfile) self.disp_image = self.canvas.create_image(0, 0, image=self.img, anchor=tk.NW) self.canvas.config(scrollregion=app.canvas.bbox("all")) self.img_disp_flag = True else: print("Already image displayed!") # 画像の非表示 def img_hide(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.img_disp_flag = False else: print("Already image hidden!") if __name__ == "__main__": win = tk.Tk() app = App(win) app.view_create() app.bind_event() win.mainloop()
追記(subsample()による縮小、scaleが0以下だと拡大が意図した動作とは違う動作になる)
def zoom_up(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.scale -= 1 self.img_zoom_up = self.img.subsample(self.scale, self.scale) #self.img_zoom_up = self.img.zoom(x=self.scale, y=self.scale) self.disp_image = self.canvas.create_image(0, 0, image=self.img_zoom_up, anchor=tk.NW) self.img_x_zoom_up = self.img_zoom_up.width() self.img_y_zoom_up = self.img_zoom_up.height() print("size:", self.img_x_zoom_up, self.img_y_zoom_up) print("scale:", self.scale) else: print("Not displaying an image yet!") def zoom_down(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.scale += 1 self.img_zoom_down = self.img.subsample(self.scale, self.scale) self.disp_image = self.canvas.create_image(0, 0, image=self.img_zoom_down, anchor=tk.NW) self.img_x_zoom_down = self.img_zoom_down.width() self.img_y_zoom_down = self.img_zoom_down.height() print("size:", self.img_x_zoom_down, self.img_y_zoom_down) print("scale:", self.scale) else: print("Not displaying an image yet!") def zoom_default(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.scale = 1 self.img_zoom_default = self.img.subsample(self.scale, self.scale) self.disp_image = self.canvas.create_image(0, 0, image=self.img_zoom_default, anchor=tk.NW) print("size:", self.img_x, self.img_y) print("scale:", self.scale) else: print("Not displaying an image yet!")
まだ回答がついていません
会員登録して回答してみよう