web-dev-qa-db-fra.com

PIL Image.resize () ne redimensionne pas l'image

J'ai un problème étrange avec PIL qui ne redimensionne pas l'image.

from PIL import Image
img = Image.open('foo.jpg')

width, height = img.size
ratio = floor(height / width)
newheight = ratio * 150

img.resize((150, newheight), Image.ANTIALIAS)

img.save('mugshotv2.jpg', format='JPEG')

Ce code s'exécute sans erreur et me produit une image nommée mugshotv2.jpg dans le dossier correct, mais il ne le redimensionne pas. Cela fait quelque chose, car la taille de l'image passe de 120 ko à 20 ko, mais les dimensions restent les mêmes.

Peut-être pouvez-vous également suggérer un moyen de recadrer des images en carrés avec moins de code. Je pensais un peu que Image.thumbnail le fait, mais ce qu'il a fait, c'est qu'il a redimensionné mon image à 150 px par sa largeur, laissant une hauteur de 100px.

29
Odif Yltsaeb

resize() renvoie une copie redimensionnée d'une image. Il ne modifie pas l'original. La bonne façon de l'utiliser est:

from PIL import Image
#...

img = img.resize((150, newheight), Image.ANTIALIAS)

source

Je pense que ce que vous recherchez est la fonction ImageOps.fit. De PIL docs :

ImageOps.fit (image, taille, méthode, fond perdu, centrage) => image

Renvoie une version redimensionnée et recadrée de l'image, recadrée au format et à la taille demandés. L'argument taille est la taille de sortie demandée en pixels, donnée sous la forme d'un tuple (largeur, hauteur).

84
Nadia Alramli