Supposons que j'ai une image de 2322 pixels x 4 128 pixels. Comment puis-je le mettre à l'échelle de sorte que la largeur et la hauteur soient toutes deux inférieures à 1028 pixels?
Je ne pourrai pas utiliser Image.resize
( https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.resize ) car cela nécessite que je donne à la fois la nouvelle largeur et la hauteur . Ce que je prévois de faire est (pseudo-code ci-dessous):
if (image.width or image.height) > 1028:
if image.width > image.height:
tn_image = image.scale(make width of image 1028)
# since the height is less than the width and I am scaling the image
# and making the width less than 1028px, the height will surely be
# less than 1028px
else: #image's height is greater than it's width
tn_image = image.scale(make height of image 1028)
Je suppose que je dois utiliser Image.thumbnail
, mais selon cet exemple ( http://pillow.readthedocs.org/en/latest/reference/Image.html#create-thumbnails ) et cette réponse ( Comment faire Je redimensionne une image en utilisant PIL et conserve son rapport d'aspect? ), la largeur et la hauteur sont fournies afin de créer la vignette. Y a-t-il une fonction qui prend la nouvelle largeur ou la nouvelle hauteur (pas les deux) et met à l'échelle l'image entière?
Pas besoin de réinventer la roue, il y a le Image.thumbnail
méthode disponible pour cela:
maxsize = (1028, 1028)
image.thumbnail(maxsize, PIL.Image.ANTIALIAS)
Garantit que la taille résultante n'est pas supérieure aux limites données tout en conservant le rapport hauteur/largeur.
En précisant PIL.Image.ANTIALIAS
applique un filtre de sous-échantillonnage de haute qualité pour un meilleur résultat de redimensionnement, vous le voulez probablement aussi.
Utilisez Image.resize, mais calculez à la fois la largeur et la hauteur.
if image.width > 1028 or image.height > 1028:
if image.height > image.width:
factor = 1028 / image.height
else:
factor = 1028 / image.width
tn_image = image.resize((int(image.width * factor), int(image.height * factor)))