11
votes

Redimensionnez les images de maintien de l'image et de faire des images de portrait et de paysage exactement la même taille?

Actuellement, j'utilise actuellement: XXX

Bien que cela fonctionne, je me retrouve avec des images de tailles différentes (certaines sont portrait et certaines sont des paysages), mais je veux que toutes les images aient une taille exacte. Peut-être une culture sensible?

Mise à jour:

Ça ne me dérange pas de recadrer une petite partie de l'image. Quand j'ai dit culture raisonnable, je veux dire quelque chose comme cet algorythm: xxx


5 commentaires

Envisagez de lire les manuels. La méthode thumnail est signifiait pour préserver l'aspect de l'image. Évidemment, vous ne pouvez pas avoir les deux, car toutes les images n'ont pas le même rapport d'aspect. Pensez à utiliser redimensionner si vous souhaitez réparer sans préserver le rapport.


Il pouvait en faire la même taille s'il voulait faire un ajustement, ce qui couvrait la zone supplémentaire avec une couleur constante. Cela permettrait à une image 4x3 ou 16x9 ou toute image d'aspect d'une dimension donnée de 80x80


Malheureusement, il n'y a pas de moyen standard de définir "sensible" pour le recadrage. On dirait que vous voulez toujours récolter un carré de l'image, ce qui signifie que vous risquez de couper des pièces que vous vouliez vraiment conserver.


@MarkRansom - Je suis d'accord. Si votre image source a lieu un aspect très non carré, vous risquez de perdre une grande partie de l'image. Je pense qu'un rembourrage en forme sera mieux. Voir ma réponse.


Merci pour les réponses les gars, mais je préfère couper les images et perdre une partie d'entre eux au lieu d'ajouter du rembourrage. Voir ma mise à jour ci-dessus.


3 Réponses :


2
votes

Évidemment, vous auriez besoin de récolter ou de coussiner les images. Vous pouvez faire quelque chose comme ci-dessous pour obtenir une récolte centrée maximale selon le rapport d'aspect des vignettes (non testées): xxx


1 commentaires

Cet exemple a quelques insectes dedans. im.elcrop () ne se cultive pas en place. Il doit renvoyer l'objet image à lui-même. Les arguments apportés à la culture doivent être une boîte tuple, de sorte que vous devez envelopper ceux-ci (). Vous passez des flotteurs à la récolte. Besoin de faire int (largeur) et int (hauteur). En outre, tout cela n'est pas nécessaire car il existe une méthode intégrée: im = imageops.fit (im, taille, image.antialias, (0,5, 0,5)) qui fait la même chose.



18
votes

Voici mon objectif de faire un ajustement rembourré pour une image: xxx pré>

Il utilise d'abord l'opération de vignette pour apporter l'image dans vos limites d'origine et préserver l'aspect. Ensuite, il la cultive pour remplir la taille de vos limites (comme à moins que l'image d'origine n'ait été carrée, elle sera plus petite maintenant) et nous trouvons le décalage approprié pour centrer l'image. L'image est décalée au centre, de sorte que vous vous retrouvez avec un rembourrage noir, mais pas de culture d'image. P>

Sauf si vous pouvez faire une devinière vraiment sensible à une culture centrale appropriée sans perdre de puissantes données d'image importantes sur les bords, une approche d'ajustement rembourrée fonctionnera mieux. P>

Mise à jour p>

Voici une version pouvant faire une culture centrale ou une coupe-pad. P>

#!/usr/bin/env python

from PIL import Image, ImageChops, ImageOps

def makeThumb(f_in, f_out, size=(80,80), pad=False):

    image = Image.open(f_in)
    image.thumbnail(size, Image.ANTIALIAS)
    image_size = image.size

    if pad:
        thumb = image.crop( (0, 0, size[0], size[1]) )

        offset_x = max( (size[0] - image_size[0]) / 2, 0 )
        offset_y = max( (size[1] - image_size[1]) / 2, 0 )

        thumb = ImageChops.offset(thumb, offset_x, offset_y)

    else:
        thumb = ImageOps.fit(image, size, Image.ANTIALIAS, (0.5, 0.5))

    thumb.save(f_out)


source = "/path/to/source/image.JPG"

makeThumb(source, "/path/to/source/image_padded.JPG", pad=True)
makeThumb(source, "/path/to/source/image_centerCropped.JPG", pad=False)


2 commentaires

C'est vraiment proche de ce dont j'ai besoin @jdi, merci! Comment puis-je modifier pour couper et ne pas insérer le rembourrage? (même perdre un morceau de l'image)


Parfait, exactement ce dont j'avais besoin! Merci @jdi!



0
votes

Si vous utilisez des vignettes faciles, vous devez définir culture code> sur true code> et haut de gamme code> à vrai code> Pour toujours remplir l'espace (avoir exactement les mêmes dimensions).

ex: fait image_2 FITS dans image_1 Dimensions: p>

    thumbnailer = get_thumbnailer(image_2)
    thumbnail = thumbnailer.generate_thumbnail(thumbnail_options={
        'crop': True,
        'upscale': True,
        'size': image_1.size
    })
    image_2 = thumbnail.image


0 commentaires