2009-09-06 80 views
47

調用PIL:縮圖和具有方形圖像

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

將保持縱橫比結束。但我需要最終顯示像這樣的圖像:

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

我可以在圖像上有透明或白色的信箱樣式嗎?

回答

67

圖像與正確的大小作爲背景粘貼到透明圖像

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") 

編輯:固定語法錯誤

+6

更新:使用Image.ANTIALIAS而不是Image.NEAREST來獲得更多的質量和壓縮圖像。 – Babu 2012-09-21 07:57:15

+1

**注意**:請務必使用'background.save()'和* not *'image.save()' – earthmeLon 2013-09-07 22:00:39

+1

對於Python 3,請將「/」替換爲「//」 – kuzzooroo 2015-03-29 18:49:20

133

PIL已經具有的功能來完成這一:

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

需要更多upvotes!太好了! – dAnjou 2012-02-07 15:06:42

+15

+1,這應該是被接受的答案 – NiKo 2012-03-12 14:09:57

+0

這是2年後...;)這是一個很好的答案,舊的答案也很好,如果你想做類似的事情,但不是 – 2012-03-23 12:30:03

1

或者這也許...(原諒意大利麪條)

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

對我不好 – PlagTag 2017-12-22 13:03:44

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()