Je dois redimensionner une image, mais je veux éviter PIL, car je ne peux pas la faire fonctionner sous OS X - ne me demandez pas pourquoi.
Quoi qu'il en soit, puisque je suis satisfait de gif/pgm/ppm, la classe PhotoImage me convient:
photoImg = PhotoImage(file=imgfn)
images.append(photoImg)
text.image_create(INSERT, image=photoImg)
Le problème est le suivant: comment redimensionner l'image? Ce qui suit ne fonctionne qu'avec PIL, qui est l'équivalent non-PIL.
img = Image.open(imgfn)
img = img.resize((w,h), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
images.append(photoImg)
text.image_create(INSERT, image=photoImg)
Je vous remercie!
Vous devez utiliser les méthodes subsample()
ou zoom()
de la classe PhotoImage
. Pour la première option, vous devez d’abord calculer les facteurs d’échelle, simplement expliqués dans les lignes suivantes:
scale_w = new_width/old_width
scale_h = new_height/old_height
photoImg.zoom(scale_w, scale_h)
Parce que zoom()
et subsample()
veulent tous les deux un entier, j'ai utilisé les deux.
Je devais redimensionner l'image 320x320 à 250x250, je me suis retrouvé avec
imgpath = '/path/to/img.png'
img = PhotoImage(file=imgpath)
img = img.zoom(25) #with 250, I ended up running out of memory
img = img.subsample(32) #mechanically, here it is adjusted to 32 instead of 320
panel = Label(root, image = img)
Je viens d'avoir le même problème, et j'ai trouvé que la réponse de @Memes fonctionne plutôt bien. Assurez-vous simplement de réduire votre ratio autant que possible, car subsample()
prend un certain temps à courir pour une raison quelconque.
Fondamentalement, l'image est agrandie au facteur le moins commun des deux tailles, puis subventionnée par la taille d'origine. Cela vous laisse avec l'image de la taille souhaitée.
from tkinter import *
import tkinter
import tkinter.messagebox
from PIL import Image
from PIL import ImageTk
master = Tk()
def callback():
print("click!")
width = 50
height = 50
img = Image.open("dir.png")
img = img.resize((width,height), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
b = Button(master,image=photoImg, command=callback, width=50)
b.pack()
mainloop()