2011-07-05 32 views
9

ho bisogno di ridimensionare un'immagine, ma voglio evitare PIL, dal momento che non riesco a farlo funzionare sotto OS X - non chiedetemi perché ...Image Resize sotto PhotoImage

Comunque da quando sono soddisfatto gif/PRG/ppm, la classe PhotoImage è ok per me:

photoImg = PhotoImage(file=imgfn) 
images.append(photoImg) 
text.image_create(INSERT, image=photoImg) 

il problema è - come faccio a ridimensionare l'immagine? Quanto segue funziona solo con PIL, che è l'equivalente 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) 

Grazie!

risposta

7

È necessario utilizzare i metodi subsample() o zoom() della classe PhotoImage. Per la prima opzione è necessario prima di calcolare i fattori di scala, semplicemente spiegato nelle righe seguenti:

scale_w = new_width/old_width 
scale_h = new_height/old_height 
photoImg.zoom(scale_w, scale_h) 
+0

quello che mi serve! L'unico problema è che zoom() vuole argomenti interi, il che è un po 'strano dato che potrei voler riscalare dire da 640x480 a 320x240: in questo caso otterrei lo zoom (0,0). O lo zoom di un piccolo fattore, meno di 2x – alessandro

+1

Quindi suppongo che devi usare il metodo 'subsample'. – Constantinius

+1

Suppongo che dovrà fare! Ho appena scoperto anche che probabilmente era stato un po 'più conveniente avere un singolo metodo di ridimensionamento, ma i progettisti di Tk non ci pensavano (se ne hai bisogno, usa PIL) _ su http://effbot.org/zone/ tkinter-PhotoImage-scala di grigi-ramp.htm – alessandro

10

Poiché sia ​​zoom() e subsample() vogliono intero come parametri, ho usato entrambe le cose.

ho dovuto ridimensionare un'immagine 320x320 a 250x250, ho finito con

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) 
1

Ho appena avuto lo stesso problema, e ho scoperto che la risposta @Memes' funziona piuttosto bene. Assicurati di ridurre il tuo rapporto il più possibile, poiché subsample() richiede un tempo piuttosto lungo per essere eseguito per qualche motivo.

Fondamentalmente, l'immagine viene ingrandita al fattore meno comune delle due dimensioni e quindi viene sovvenzionata dalle dimensioni dell'originale. Questo ti lascia con l'immagine della dimensione desiderata.

Problemi correlati