57 votes

LIP : Vignette et obtention d'une image carrée

Appel à

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

maintiendra le rapport d'aspect. Mais je dois finir par afficher l'image comme ceci :

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

Puis-je avoir un style "letterbox" avec une image transparente ou blanche autour de l'image ?

168voto

Cesar Canassa Points 3579

Le LIP dispose déjà d'une fonction permettant de faire exactement cela :

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

0 votes

C'était 2 ans plus tard... ;) C'est une bonne réponse à la question, la réponse plus ancienne est bonne à avoir aussi, au cas où vous voulez faire quelque chose de similaire mais pas tout à fait la même chose.

0 votes

Désolé pour le double post. Par souci d'exhaustivité, la première ligne ci-dessus devrait se lire "from PIL import Image, ImageOps". (En supposant qu'il n'y ait pas d'autres importations pertinentes ailleurs dans le code).

3 votes

Cette méthode permet en quelque sorte de recadrer mon image pour la faire entrer dans la résolution.

82voto

Nadia Alramli Points 40381

Collez l'image dans une image transparente de la bonne taille comme arrière-plan.

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 : correction d'une erreur de syntaxe

7 votes

MISE À JOUR : utiliser Image.ANTIALIAS au lieu de Image.NEAREST pour obtenir une image plus qualitative et compressée.

2 votes

NOTE : Assurez-vous d'utiliser background.save() y no image.save()

3 votes

Pour Python 3, remplacez "/" par "//".

3voto

Naveen Agarwal Points 830
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()

2voto

suhail Points 2520

Mise à jour de La réponse de Cesar Canassa .

Cela créera une vignette de image.jpg comme image_thumb.jpg :

from PIL import Image, ImageOps
fname = 'image.jpg'
size = (48,48)
thumb = ImageOps.fit(Image.open(fname), size, Image.ANTIALIAS)
thumb.save('{}_thumb.jpg'.format(fname[:fname.rfind('.')]), "JPEG")

1voto

Khymeira Points 11

Ou ceci, peut-être... (pardonnez les spaghettis)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X