2011-07-05 43 views
9

Necesito cambiar el tamaño de una imagen, pero quiero evitar PIL, ya que no puedo hacer que funcione bajo OS X - no me pregunte por qué ...tamaño de imagen bajo PhotoImage

De todos modos, ya estoy satisfecho con gif/pgm/ppm, la clase PhotoImage está bien para mí:

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

el problema es - ¿Cómo puedo cambiar el tamaño de la imagen? Lo siguiente solo funciona con PIL, ¿cuál es el equivalente que no es 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) 

Gracias!

Respuesta

7

Tiene que utilizar los métodos subsample() o zoom() de la clase PhotoImage. Para la primera opción primero hay que calcular los factores de escala, simplemente se explica en las siguientes líneas:

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

lo que necesito! El único problema es que zoom() quiere argumentos enteros, lo cual es un poco extraño ya que es posible que desee reescalar decir de 640x480 a 320x240: en ese caso obtendría el zoom (0,0). O acercar un pequeño factor, menos de 2x – alessandro

+1

Entonces supongo que debes usar el método 'submuestra '. – Constantinius

+1

¡Supongo que tendrá que hacer! Simplemente descubrí también: "Probablemente haya sido un poco más conveniente tener un solo método de cambio de tamaño, pero los diseñadores de Tk no pensaron en eso (si lo necesitas, usa PIL) _ en http://effbot.org/zone/ tkinter-photoimage-escala de grises-rampa.htm – alessandro

10

Debido a que tanto zoom() y subsample() quieren entero como parámetros, he usado ambos.

tuve que cambiar el tamaño de imagen de 320x320 a 250x250, que terminó 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

sólo tenía el mismo problema, y ​​me encontré con esa respuesta @Memes' funciona bastante bien. Solo asegúrate de reducir tu proporción tanto como sea posible, ya que subsample() tarda un tiempo bastante largo en ejecutarse por algún motivo.

Básicamente, la imagen se reduce al mínimo común de los dos tamaños, y luego se subsidia por el tamaño original. Esto te deja con la imagen del tamaño deseado.

Cuestiones relacionadas