在 Tkinter 中调整 PIL 中的图片大小

Posted

技术标签:

【中文标题】在 Tkinter 中调整 PIL 中的图片大小【英文标题】:Resizing pictures in PIL in Tkinter 【发布时间】:2011-05-03 05:53:58 【问题描述】:

我目前正在使用 PIL 在 Tkinter 中显示图像。我想暂时调整这些图像的大小,以便更轻松地查看它们。我该怎么办?

片段:

self.pw.pic = ImageTk.PhotoImage(Image.open(self.pic_file))
self.pw.pic_label = TK.Label(self.pw , image=self.pw.pic,borderwidth=0)         
self.pw.pic_label.grid(column=0,row=0)

【问题讨论】:

【参考方案1】:

这就是我所做的,而且效果很好......

image = Image.open(Image_Location)
image = image.resize((250, 250), Image.ANTIALIAS) ## The (250, 250) is (height, width)
self.pw.pic = ImageTk.PhotoImage(image)

你去吧:)

编辑:

这是我的导入声明:

from Tkinter import *
import tkFont
from PIL import Image

这是我改编此示例的完整工作代码:

im_temp = Image.open(Image_Location)
im_temp = im_temp.resize((250, 250), Image.ANTIALIAS)
im_temp.save("ArtWrk.ppm", "ppm") ## The only reason I included this was to convert
## The image into a format that Tkinter woulden't complain about
self.photo = PhotoImage(file="ArtWrk.ppm") ## Open the image as a tkinter.PhotoImage class()
self.Artwork.destroy() ## Erase the last drawn picture (in the program the picture I used was changing)
self.Artwork = Label(self.frame, image=self.photo) ## Sets the image too the label
self.Artwork.photo = self.photo ## Make the image actually display (If I don't include this it won't display an image)
self.Artwork.pack() ## Repack the image

这里是 PhotoImage 类文档:http://www.pythonware.com/library/tkinter/introduction/photoimage.htm

注意... 在检查了关于 ImageTK 的 PhotoImage 类(非常稀疏)的 pythonware 文档后,我似乎认为,如果你的 sn-p 工作得比这更有效,只要你导入 PIL“Image”库和 PIL“ImageTK”库,并且两者PIL 和 tkinter 是最新的。另一方面,我什至找不到“ImageTK”模块的生命。你能发布你的导入吗?

【讨论】:

我不断收到这个“AttributeError: PhotoImage instance has no attribute 'resize'”。我需要导入什么? 是(宽度,高度),而不是(高度,宽度)。 使用 PIL ImageTk 肯定是更简单的技术。【参考方案2】:

如果你不想保存,可以试试:

from Tkinter import *
from PIL import Image, ImageTk

root = Tk()

same = True
#n can't be zero, recommend 0.25-4
n=2

path = "../img/Stalin.jpeg" 
image = Image.open(path)
[imageSizeWidth, imageSizeHeight] = image.size

newImageSizeWidth = int(imageSizeWidth*n)
if same:
    newImageSizeHeight = int(imageSizeHeight*n) 
else:
    newImageSizeHeight = int(imageSizeHeight/n) 

image = image.resize((newImageSizeWidth, newImageSizeHeight), Image.ANTIALIAS)
img = ImageTk.PhotoImage(image)

Canvas1 = Canvas(root)

Canvas1.create_image(newImageSizeWidth/2,newImageSizeHeight/2,image = img)      
Canvas1.config(bg="blue",width = newImageSizeWidth, height = newImageSizeHeight)
Canvas1.pack(side=LEFT,expand=True,fill=BOTH)

root.mainloop()

【讨论】:

【参考方案3】:

最简单的方法可能是根据原件创建新图像,然后将原件换成较大的副本。为此,tk 图像具有copy 方法,可让您在制作副本时对原始图像进行缩放或二次采样。不幸的是,它只能让您以 2 倍放大/二次采样。

【讨论】:

以上是关于在 Tkinter 中调整 PIL 中的图片大小的主要内容,如果未能解决你的问题,请参考以下文章

PIL Image.resize()没有调整图片大小

Python PIL调整图片大小尺寸和转换图片格式,removebg改变图片背景透明化处理

在调整图像大小时保留 exif 数据

浏览器图像调整大小,优于最高 PIL 质量

如何让 Matplotlib 图形在 Tkinter GUI 中正确滚动+调整大小

python tkinter Label 图形