سؤال

الدعوة

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

سوف تحافظ على نسبة العرض إلى الارتفاع. لكنني بحاجة إلى عرض الصورة مثل هذا:

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

هل يمكنني الحصول على نمط صندوق حروف مع إما شفاف أو أبيض حول الصورة؟

هل كانت مفيدة؟

المحلول

الصق الصورة في صورة شفافة مع الحجم الأيمن كخلفية

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

تحرير: خطأ في بناء الجملة الثابت

نصائح أخرى

لدى PIL بالفعل وظيفة للقيام بذلك بالضبط:

from PIL import Image, ImageOps
thumb = ImageOps.fit(image, size, Image.ANTIALIAS)
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()

أو هذا ، ربما ... (سامح السباغيتي)

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

يمكنك لف إجابة ناديا في هذه الوظيفة ، والتي تمنحك التحكم في الحجم والخلفية.

def make_square(im, min_size=36, fill_color=(255, 255, 255, 0)):
    x, y = im.size
    size = min(min_size, x, y)
    new_im = Image.new('RGBA', (size, size), fill_color)
    im.thumbnail((256, 256))
    new_im.paste(im, (int((x - size) / 2), int((y -size) / 2))
    return new_im
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top