it-swarm.com.de

PIL: Thumbnail und am Ende ein quadratisches Bild

Berufung

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

wird das Seitenverhältnis beibehalten. Aber ich muss am Ende das Bild so anzeigen:

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

Kann ich einen Letterbox-Stil haben, der entweder transparent oder weiß um das Bild ist?

49
Paul Tarjan

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

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

BEARBEITEN: Syntaxfehler behoben

71
Nadia Alramli

PIL hat bereits eine Funktion, um genau das zu tun:

from PIL import Image, ImageOps
thumb = ImageOps.fit(image, size, Image.ANTIALIAS)
150
Cesar Canassa
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()
2
Naveen Agarwal

Oder das vielleicht ... (verzeihen Sie 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
1
Khymeira

sie können Nadias Antwort in diese Funktion einwickeln, mit der Sie Größe und Hintergrund steuern können.

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
0
Amirhos Imani