2011-05-30 19 views
5

estoy tratando de crear y guardar una imagen en miniatura al guardar la imagen original del usuario en el modelo userProfile en mi proyecto, a continuación es mi código:¿Por qué la miniatura PIL no cambia el tamaño correctamente?

def save(self, *args, **kwargs): 
    super(UserProfile, self).save(*args, **kwargs) 
    THUMB_SIZE = 45, 45 
    image = Image.open(join(MEDIA_ROOT, self.headshot.name)) 

    fn, ext = os.path.splitext(self.headshot.name) 
    image.thumbnail(THUMB_SIZE, Image.ANTIALIAS)   
    thumb_fn = fn + '-thumb' + ext 
    tf = NamedTemporaryFile() 
    image.save(tf.name, 'JPEG') 
    self.headshot_thumb.save(thumb_fn, File(open(tf.name)), save=False) 
    tf.close() 

    super(UserProfile, self).save(*args, **kwargs) 

Cada cosa está funcionando bien, sólo una cosa.

El problema es que la función de miniaturas solo establece el ancho a 45 y no cambia el aspecto de relación de la imagen, así que obtengo una imagen de 45*35 para la que estoy probando (imagen corta).

¿Alguien puede decirme qué estoy haciendo mal? ¿Cómo forzar la relación de aspecto que quiero?

P.S .: He intentado todos los métodos para el tamaño: tupal: THUMB_SIZE = (45, 45) e ingresando los tamaños directamente a la función de miniatura también.

Otra pregunta: ¿cuál es la deferencia entre el tamaño y las funciones de miniatura en PIL? ¿Cuándo usar el tamaño y cuándo usar la miniatura?

Respuesta

12

La función image.thumbnail() mantendrá la relación de aspecto de la imagen original.

Use image.resize() en su lugar.

ACTUALIZACIÓN

image = image.resize(THUMB_SIZE, Image.ANTIALIAS)   
thumb_fn = fn + '-thumb' + ext 
tf = NamedTemporaryFile() 
image.save(tf.name, 'JPEG') 
+1

Ver http://www.pythonware.com/library/pil/handbook/image.htm#Image.thumbnail – Exelian

+0

bueno, voy a adjuntar los enlaces a mi respuesta =) – BFil

+0

10x, pero también he intentado image.resize (THUMB_SIZE, Image.ANTIALIAS) donde THUMB_RESIZE es un tupal (THUMB_RESIZE = (45,45) y no está cambiando de tamaño ahora ... Cualquier cosa ¿más aquí? (eso es lo que leo en el enlace) ... Gracias :-) – Erez

4

Dado:

import Image # Python Imaging Library 
THUMB_SIZE= 45, 45 
image # your input image 

Si desea cambiar el tamaño de cualquier imagen a tamaño 45 × 45, se debe utilizar:

new_image= image.resize(THUMB_SIZE, Image.ANTIALIAS) 

Sin embargo, si desea una imagen resultante de tamaño 45 × 45 mientras se cambia el tamaño de la imagen de entrada manteniendo su relación de aspecto y el llenado de los píxeles que faltan con negro:

new_image= Image.new(image.mode, THUMB_SIZE) 
image.thumbnail(THUMB_SIZE, Image.ANTIALIAS) # in-place 
x_offset= (new_image.size[0] - image.size[0]) // 2 
y_offset= (new_image.size[1] - image.size[1]) // 2 
new_image.paste(image, (x_offset, y_offset)) 
+0

Ya tengo la respuesta pero gracias :-) – Erez

Cuestiones relacionadas