如何缩放通过算法生成而非从文件读取的tkinter PhotoImage?
两种方法实现Tkinter PhotoImage缩放(无需读取文件)
方法一:纯Tkinter手动像素缩放
不用额外依赖库,直接遍历原图像像素,按缩放比例填充到新的PhotoImage中,适合不想引入第三方库的场景。
注意:原示例代码里put的坐标顺序写错了,Tkinter PhotoImage的坐标是(列, 行),不是(行, 列),先修正这个问题再做缩放。
示例代码:
import tkinter IMG_W = 96 IMG_H = 96 SCALE = 3 # 缩放3倍,目标尺寸288×288 class App: def __init__(self, t): # 生成原96×96图像 self.original = tkinter.PhotoImage(width=IMG_W, height=IMG_H) for row in range(IMG_H): for col in range(IMG_W): pixel = '#%02x%02x%02x' % (0x80, row, col) self.original.put(pixel, (col, row)) # 修正坐标顺序 # 创建缩放后的空图像 scaled_w = IMG_W * SCALE scaled_h = IMG_H * SCALE self.scaled = tkinter.PhotoImage(width=scaled_w, height=scaled_h) # 逐个像素放大填充 for src_row in range(IMG_H): for src_col in range(IMG_W): color = self.original.get(src_col, src_row) # 把原像素对应到缩放后的SCALE×SCALE块 for dest_row in range(src_row*SCALE, (src_row+1)*SCALE): for dest_col in range(src_col*SCALE, (src_col+1)*SCALE): self.scaled.put(color, (dest_col, dest_row)) # 创建大画布并显示缩放后的图像 c = tkinter.Canvas(t, width=scaled_w, height=scaled_h) c.pack() c.create_image(0, 0, image=self.scaled, anchor=tkinter.NW) t = tkinter.Tk() a = App(t) t.mainloop()
方法二:用Pillow高效缩放(无需读写文件)
不用从文件读取图像,直接把Tkinter PhotoImage转成PIL Image对象处理,缩放后再转回PhotoImage,效率和画质都比手动缩放更优。
示例代码:
import tkinter from PIL import Image, ImageTk IMG_W = 96 IMG_H = 96 SCALE = 3 # 缩放倍数 class App: def __init__(self, t): # 生成原图像 self.original = tkinter.PhotoImage(width=IMG_W, height=IMG_H) for row in range(IMG_H): for col in range(IMG_W): pixel = '#%02x%02x%02x' % (0x80, row, col) self.original.put(pixel, (col, row)) # 转成PIL Image对象 pil_img = Image.new("RGB", (IMG_W, IMG_H)) # 提取所有像素数据 pixel_data = [self.original.get(col, row) for row in range(IMG_H) for col in range(IMG_W)] pil_img.putdata(pixel_data) # 高质量缩放,Pillow 9.1.0+用Image.Resampling.LANCZOS,旧版本用Image.LANCZOS scaled_pil = pil_img.resize((IMG_W*SCALE, IMG_H*SCALE), Image.Resampling.LANCZOS) # 转回Tkinter PhotoImage self.scaled = ImageTk.PhotoImage(scaled_pil) # 显示到画布 c = tkinter.Canvas(t, width=IMG_W*SCALE, height=IMG_H*SCALE) c.pack() c.create_image(0, 0, image=self.scaled, anchor=tkinter.NW) t = tkinter.Tk() a = App(t) t.mainloop()
额外提示
如果画布尺寸不是原图像的整数倍,可以计算动态缩放比例:比如画布宽400、高400,缩放比例就是400/96,用这个比例计算目标尺寸,就能让图像刚好填满画布。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

