web-dev-qa-db-fra.com

Python / Pillow: Comment mettre à l'échelle une image

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?

30
user2719875

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.

59
famousgarkin

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)))
14
Sohcahtoa82