Frage

Der Aufruf

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

wird das Seitenverhältnis beibehalten. Aber ich brauche das Bild wie diese Anzeige, um am Ende:

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

Kann ich ein Letterbox-Format mit entweder transparent oder wissen um das Bild?

War es hilfreich?

Lösung

Fügen Sie das Bild in ein transparentes Bild mit der richtigen Größe als Hintergrund

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: Festsyntaxfehler

Andere Tipps

PIL hat bereits eine Funktion genau das zu tun:

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

Oder diese, vielleicht ... (verzeihen 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

Sie können in dieser Funktion Nadjas Antwort wickeln, die Sie Größe und Hintergrund Kontrolle über gibt.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top