下載網路圖片後,依指定顯示區塊寬高進行等比例縮放(保持長寬比),再顯示於 Tkinter 或存檔。核心演算法為計算縮放因子取寬高較小者。
def resize(w, h, w_box, h_box, pil_image):
f1 = 1.0 * w_box / w
f2 = 1.0 * h_box / h
factor = min(f1, f2)
width = int(w * factor)
height = int(h * factor)
return pil_image.resize((width, height), Image.ANTIALIAS)
import io
from PIL import Image, ImageTk
try:
import Tkinter as tk
from urllib2 import urlopen
except ImportError:
import tkinter as tk
from urllib.request import urlopen
w_box, h_box = 400, 350
url = "https://freeflowerpictures.net/image/flowers/petunia/petunia-flower.jpg"
image_bytes = urlopen(url).read()
pil_image = Image.open(io.BytesIO(image_bytes))
pil_resized = resize(*pil_image.size, w_box, h_box, pil_image)
tk_image = ImageTk.PhotoImage(pil_resized)
root = tk.Tk()
root.title("resized {} ({}x{})".format(url.split('/')[-1], *pil_resized.size))
tk.Label(root, image=tk_image, width=w_box, height=h_box).pack(padx=5, pady=5)
root.mainloop()
Image.ANTIALIAS 為高品質下採樣濾鏡(Pillow 9.1.0+ 建議用 Image.Resampling.LANCZOS)。