2009-09-06 13 views
47

WywołaniePIL: Miniatura i skończyć z placu obrazu

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

będzie utrzymać proporcje. Ale muszę skończyć wyświetlania obrazu tak:

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

mogę mieć letterbox z albo przezroczysty lub biały wokół obrazu?

Odpowiedz

67

wkleić obraz do przejrzystego obrazu o odpowiedniej wielkości jako tło

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: błąd składni stałym

+6

AKTUALIZACJA: użyj 'Image.ANTIALIAS' zamiast' Image.NEAREST', aby uzyskać lepszą jakość i skompresowany obraz. – Babu

+1

** UWAGA **: Należy użyć 'background.save()' i * not * 'image.save()' – earthmeLon

+1

Dla Pythona 3 zamień "/" na "//" – kuzzooroo

133

PIL ma już funkcję robić dokładnie to:

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

Potrzebuje więcej upvotes! Miły! – dAnjou

+15

+1, która powinna była być zaakceptowaną odpowiedzią. – NiKo

+0

To było 2 lata później ...;) To jest dobra odpowiedź na to pytanie, starsza odpowiedź też jest dobra, na wypadek gdybyś chciał zrobić coś podobnego, ale nie całkiem ten sam –

1

A może ... (wybaczanie spaghetti)

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

nie działa dla mnie dobrze – 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() 
Powiązane problemy