2009-08-09 16 views
25

Tengo un problema extraño con PIL no cambiar el tamaño de la imagen.PIL Image.resize() no cambiar el tamaño de la imagen

def handle_uploaded_image(i, u): 
    # resize image 
    from PIL import Image 
    img = Image.open(i) 
    if img.mode not in ('L', 'RGB'): 
     img = img.convert('RGB') 

    width, height = img.size 
    if width == height: 
     img.thumbnail(settings.THUMB_SIZE, Image.ANTIALIAS) 
    elif width > height: 
     ratio = floor(width/height) 
     newwidth = ratio * 150 
     newwidthhalf = floor(newwidth/2) 
     img.resize((newwidth, 150), Image.ANTIALIAS) 
     box = 1 
     img.crop((newwidthhalf, 0, 150, 150)) 
    elif height > width: 
     ratio = floor(height/width) 
     newheight = ratio * 150 
     newheighthalf = floor(newheight/2) 
     img.resize((150, newheight), image.ANTIALIAS) 
     box = 1 
     img.crop((0, newheighthalf, 150, 150)) 
    path = '/'.join([settings.MEDIA_ROOT, 'users', u.username, 'mugshotv2.jpg']) 
    img.save(path, format='JPEG') 

Este código se ejecuta sin errores y me produce una imagen llamada mugshotv2.jpg en la carpeta correcta, pero no cambiar su tamaño. Le hace algo, porque el tamaño de la imagen cae de 120 kb a 20 kb, pero las dimensiones siguen siendo las mismas.

Quizás también pueda sugerir formas de recortar imágenes en cuadrados con menos código. Creo que Image.thumbnail lo hace, pero lo que hizo fue escalar mi imagen a 150 px por su ancho, dejando una altura de 100 px.

Alan.

Respuesta

71

resize() devuelve una copia redimensionada de una imagen. No modifica el original. La forma correcta de utilizar es:

img = img.resize((150, newheight), image.ANTIALIAS) 

source

Creo que lo que busca es la función ImageOps.fit. De PIL docs:

ImageOps.fit (imagen, el tamaño, el método, corrimiento, centrado) => imagen

Devuelve una versión de tamaño y recortada de la imagen, recortada a la relación solicitado aspecto y tamaño. El argumento tamaño es el tamaño de salida solicitado en píxeles, dado como (ancho, alto) tupla.

+2

Gracias! Eso fue todo. Este fue nuevamente un error de este tipo estúpido y fácil, que a menudo hago: P. Viéndolo de nuevo no puedo entender cómo no lo entendí yo mismo, estaba en los malditos documentos después de todo. Creo que necesito ir a la cama. Gracias de nuevo y probar ese ImageOps.fit otro día: D –

+0

@Zayatzz, así que acepte la respuesta de @ Nadia, ya que ha resuelto su problema _y_ incluso ha proporcionado asesoramiento sobre enfoques aún mejores! –

+3

Ah ... esa extraña marca de verificación ... ohwell. podría usar algo para llamar más la atención sobre él. –

Cuestiones relacionadas