Python / oreiller: comment dimensionner une image

supposons que j'ai une image qui est 2322px x 4128px. Comment faire pour que la largeur et la hauteur soient inférieures à 1028px?

Je ne pourrai pas utiliser Image.resize ( https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.resize ) puisque cela me demande de donner à la fois la nouvelle largeur et la nouvelle hauteur. Ce que j'ai l'intention 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 besoin d'utiliser Image.thumbnail , mais selon cet exemple ( http://pillow.readthedocs.org/en/latest/reference/Image.html#create-thumbnails ) et cette réponse ( comment redimensionner une image en utilisant PIL et maintenir son format? ), la largeur et la hauteur sont fournies pour créer la vignette. Y a-t-il une fonction qui prend la nouvelle largeur ou la nouvelle hauteur (pas les deux) et qui met à l'échelle l'image entière?

21
demandé sur Sam Watkins 2014-07-15 00:57:56

2 réponses

pas besoin de réinventer la roue, il y a la méthode Image.thumbnail disponible pour cela:

maxsize = (1028, 1028)
tn_image = image.thumbnail(maxsize, PIL.Image.ANTIALIAS)

assure que la taille résultante n'est pas plus grande que les limites données tout en maintenant le rapport d'aspect.

spécifiant PIL.Image.ANTIALIAS applique un filtre downsampling de haute qualité pour un meilleur résultat de redimensionnement, vous voulez probablement que trop.

45
répondu famousgarkin 2018-01-30 04:33:45

Utiliser L'Image.redimensionner, mais calculer à 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)))
13
répondu Sohcahtoa82 2018-08-26 03:20:03