Подтвердить что ты не робот

PIL: миниатюра и заканчивается квадратным изображением

Вызов

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

будет поддерживать соотношение сторон. Но мне нужно отобразить изображение следующим образом:

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

Могу ли я иметь стиль почтового ящика с прозрачным или белым цветом вокруг изображения?

4b9b3361

Ответ 1

Вставьте изображение в прозрачное изображение с нужным размером в качестве фона

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: исправлена ​​синтаксическая ошибка

Ответ 2

PIL уже имеет функцию, которая выполняет именно это:

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

Ответ 3

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

Ответ 4

Или это, может быть... (простите спагетти)

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