自分自身余り詳しい方ではないですし、別枠で質問されたほうが良い案件ではあります…が、とりあえずの回答を記載しておきます。
画面上にすべてを表示させたいのでしたら、以下のコードにて実現できます。
#ウインドウサイズに合うような拡大率(scale)を設定
scale=min(640/t_width,480/t_height)
#リサイズ
resized_img = cv2.resize(temp_img,None,fx=scale,fy=scale)
cv2.imshow('image',resized_img)
また、自分の能力不足からクリックによる画像の拡大・縮小ができなかったので、
代わりにスクロールバーによる画面表示を実装しました。
###画像の表示
from PIL import Image, ImageTk
#表示画面の作成
root2 = tkinter.Tk()
frame = Frame(root2)
canvas = Canvas(frame, width=400, height=400, scrollregion=(0, 0, t_height*2,t_width*2))
#スクロールバーの設定
xscroll = Scrollbar(frame, orient=HORIZONTAL, command=canvas.xview)
xscroll.grid(row=1, column=0, sticky=E+W)
yscroll = Scrollbar(frame, orient=VERTICAL, command=canvas.yview)
yscroll.grid(row=0, column=1, sticky=N+S)
canvas.config(xscrollcommand=xscroll.set, yscrollcommand=yscroll.set)
canvas.grid(row=0, column=0, sticky=N+E+W+S)
canvas.bind("<ButtonPress-1>", lambda e: canvas.scan_mark(e.x, e.y))
canvas.bind("<B1-Motion>", lambda e: canvas.scan_dragto(e.x, e.y, gain=1))
#画面に画像を生成
tkimg = ImageTk.PhotoImage(file=temp_fle,master=canvas)
canvas.create_image(t_height, t_width, image=tkimg)
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)
frame.grid(sticky=N+E+W+S)
root2.mainloop()
スクロールバーを動かす(または画面をドラッグする)ことで、画像の比率をそのままにした状態で色んな部分を見られるかと思います。
以下、最終的なコード内容になります。
import sys
import cv2
import numpy as np
import tkinter, tkinter.filedialog, tkinter.messagebox, os
from tkinter import messagebox
def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
try:
n = np.fromfile(filename, dtype)
img = cv2.imdecode(n, flags)
return img
except Exception as e:
print(e)
return None
#-------------------------------------------------------------------------
#ファイル選択ダイアログ表示
root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(sys.argv[0]))
temp_fle = tkinter.filedialog.askopenfilename(filetypes = fTyp)
filename = os.path.basename(temp_fle)
name, ext = os.path.splitext(filename)
#画像ファイル読込み
temp_img=imread(temp_fle, 1)
t_height = temp_img.shape[0]
t_width = temp_img.shape[1]
###画像のリサイズ(画面上にすべてを表示させる)
#scale=min(640/t_width,480/t_height)
#resized_img = cv2.resize(temp_img,None,fx=scale,fy=scale)
#cv2.imshow('image',resized_img)
#※cv2.imshow('image',resized_img[100:400,70:900])で部分表示も可能
#cv2.waitKey(0)
#cv2.destroyAllWindows()
###画像の表示
from PIL import Image, ImageTk
#表示画面の作成
root2 = tkinter.Tk()
frame = Frame(root2)
canvas = Canvas(frame, width=400, height=400, scrollregion=(0, 0, t_height*2,t_width*2))
#スクロールバーの設定
xscroll = Scrollbar(frame, orient=HORIZONTAL, command=canvas.xview)
xscroll.grid(row=1, column=0, sticky=E+W)
yscroll = Scrollbar(frame, orient=VERTICAL, command=canvas.yview)
yscroll.grid(row=0, column=1, sticky=N+S)
canvas.config(xscrollcommand=xscroll.set, yscrollcommand=yscroll.set)
canvas.grid(row=0, column=0, sticky=N+E+W+S)
canvas.bind("<ButtonPress-1>", lambda e: canvas.scan_mark(e.x, e.y))
canvas.bind("<B1-Motion>", lambda e: canvas.scan_dragto(e.x, e.y, gain=1))
tkimg = ImageTk.PhotoImage(file=temp_fle,master=canvas)
canvas.create_image(t_height, t_width, image=tkimg)
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)
frame.grid(sticky=N+E+W+S)
root2.mainloop()
ウインドウを消してもプログラムが実行し続けるバグがあります(手動でinteruptする必要がある)。ご了承ください。
とりあえずの回答となります。これ以上の追求がありましたら、別件としてまた質問してください。
ご参考になれば幸いです。