web-dev-qa-db-fra.com

Image redimensionner sous PhotoImage

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!

14
alessandro

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)
8
Constantinius

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)
11
Memes

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.

1
Patrick

Si vous n'avez pas installé PIL -> installez-le

(pour les utilisateurs de Python3 + -> utilisez 'pip install pillow' dans cmd)

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()
0
Vyr