2009-09-06 16 views
47

CallingPIL: Miniatura y terminar con una imagen cuadrada

image = Image.open(data) 
image.thumbnail((36,36), Image.NEAREST) 

mantendrá la relación de aspecto. Pero tengo que terminar de mostrar la imagen como esta:

<img src="/media/image.png" style="height:36px; width:36px" /> 

¿Puedo tener un estilo de buzón, ya sea transparente o blanco alrededor de la imagen?

Respuesta

67

Pegar la imagen en una imagen transparente con el tamaño adecuado como fondo

from PIL import Image 
size = (36, 36) 
image = Image.open(data) 
image.thumbnail(size, Image.ANTIALIAS) 
background = Image.new('RGBA', size, (255, 255, 255, 0)) 
background.paste(
    image, (int((size[0] - image.size[0])/2), int((size[1] - image.size[1])/2)) 
) 
background.save("output.png") 

EDIT: error de sintaxis fija

+6

ACTUALIZACIÓN: utilice 'Image.ANTIALIAS' en lugar de' Image.NEAREST' para obtener más calidad e imagen comprimida. – Babu

+1

** NOTA **: Asegúrese de utilizar 'background.save()' y * not * 'image.save()' – earthmeLon

+1

Para Python 3 reemplace "/" con "//" – kuzzooroo

133

PIL ya tiene una función para hacer exactamente eso:

from PIL import Image, ImageOps 
thumb = ImageOps.fit(image, size, Image.ANTIALIAS) 
+9

¡Necesita más votos ascendentes! ¡Bonito! – dAnjou

+15

+1, debería haber sido la respuesta aceptada – NiKo

+0

Fue 2 años después ...;) Esta es una buena respuesta para la pregunta, la respuesta anterior también es buena, en caso de que quieras hacer algo similar pero no casi lo mismo –

1

O esto, tal vez ... (perdonar espaguetis)

from PIL import Image 

def process_image(image, size): 
    if image.size[0] > size[0] or image.size[1] > size[1]: 
     #preserve original 
     thumb = image.copy() 
     thumb.thumbnail(size,Image.ANTIALIAS) 
     img = thumb.copy() 
    img_padded = Image.new("RGBA",size) 
    img_padded.paste(image,(int((size[0]-image.size[0])/2),int((size[1]-image.size[1])/2))) 
    return img_padded 
+0

no funciona bien para mí – PlagTag

2
from PIL import Image 

import StringIO 

def thumbnail_image(): 
    image = Image.open("image.png") 
    image.thumbnail((300, 200)) 
    thumb_buffer = StringIO.StringIO() 
    image.save(thumb_buffer, format=image.format) 
    fp = open("thumbnail.png", "w") 
    fp.write(thumb_buffer.getvalue()) 
    fp.close() 
Cuestiones relacionadas