web-dev-qa-db-fra.com

Redimensionnement des images dans PIL dans Tkinter

J'utilise actuellement PIL pour afficher des images dans Tkinter. Je souhaite redimensionner temporairement ces images afin de les visualiser plus facilement. Comment puis-je m'y prendre?

Fragment:

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)
14
rectangletangle

Voici ce que je fais et ça marche plutôt bien ...

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

Voilà :)

ÉDITER:

Voici ma déclaration d'importation:

from Tkinter import *
import tkFont
from PIL import Image

Et voici le code de travail complet à partir duquel j'ai adapté cet exemple:

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

Et voici la documentation de la classe PhotoImage: http://www.pythonware.com/library/tkinter/introduction/photoimage.htm

Remarque ... Après avoir vérifié la documentation de pythonware sur la classe PhotoImage d'ImageTK (ce qui est très rare), il semble que si votre extrait fonctionne, cela devrait aussi bien que tant que vous importez la bibliothèque "Image" PIL et la bibliothèque "ImageTK" PIL et que PIL et tkinter sont à jour. D'un autre côté, je ne peux même pas trouver la durée de vie du module "ImageTK" pour la vie de moi. Pourriez-vous publier vos importations?

29
Joshkunz

si vous ne voulez pas l'enregistrer, vous pouvez l'essayer:

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()
6
ChaosPredictor

le plus simple pourrait être de créer une nouvelle image basée sur l'original, puis de remplacer l'original par une copie plus grande. Pour cela, une image tk a une méthode copy qui vous permet de zoomer ou de sous-échantillonner l'image originale lors de la copie. Malheureusement, il ne vous permet de zoomer/sous-échantillonner que dans des facteurs de 2.

2
Bryan Oakley