2009-09-06 3 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") 

EDIT : 고정 구문 오류

+6

업데이트 : 더 나은 품질과 압축 된 이미지를 얻으려면'Image.NEAREST' 대신'Image.ANTIALIAS'을 사용하십시오. – Babu

+1

** 참고 ** :'background.save()'와 * not *'image.save()'를 사용하십시오. – earthmeLon

+1

파이썬 3의 경우 "/"를 "//"로 바꾸십시오. – kuzzooroo

133

PIL 이미 정확하게 할 수있는 기능을 가지고

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

더 많은 upvotes가 필요합니다! 좋은! – dAnjou

+15

+1, 받아 들여진 대답 이었음에 틀림 없음 – NiKo

+0

2 년 후 ... ...)이 질문에 대한 좋은 답변입니다. 이전 답변도 비슷하지만 비슷한 일을하고 싶을 때 유용합니다. 꽤 똑같다 –

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

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() 
관련 문제