2009-04-02 7 views
4

Je veux rogner une image miniature dans mon application Django, afin d'obtenir une image quadratique qui montre le centre de l'image. Ce n'est pas très difficile, je suis d'accord.Qu'est-ce qu'une reformulation plus élégante de cet algorithme de culture? (en Python)

J'ai déjà écrit un code qui fait exactement cela, mais il manque en quelque sorte une certaine ... élégance. Je ne veux pas jouer au golf de code, mais il doit y avoir un moyen d'exprimer ce plus court et plus pythonique, je pense.

x = y = 200 # intended size 
image = Image.open(filename) 
width = image.size[0] 
height = image.size[1] 
if (width > height): 
    crop_box = (((width - height)/2), 0, ((width - height)/2)+height, height) 
    image = image.crop(crop_box) 
elif (height > width): 
    crop_box = (0, ((height - width)/2), width, ((height - width)/2)+width) 
    image = image.crop(crop_box) 
image.thumbnail([x, y], Image.ANTIALIAS) 

Avez-vous des idées?

modifier: expliqué x, y

Répondre

9

Je pense que cela devrait faire.

size = min(image.Size) 

originX = image.Size[0]/2 - size/2 
originY = image.Size[1]/2 - size/2 

cropBox = (originX, originY, originX + size, originY + size) 
+0

J'aime avoir les variables width et height explicitement nommées. Sinon, quelqu'un lisant ce code doit trouver la documentation pour Image.Size – Triptych

+0

Peut-être y at-il des propriétés image.Width et image.Height, mais je ne sais pas. Je viens d'inférer le code de la requête. –

1
width, height = image.size 
if width > height: 
    crop_box = # something 1 
else: 
    crop_box = # something 2 
image = image.crop(crop_box) 
image.thumbnail([x, x], Image.ANTIALIAS) # explicitly show "square" thumbnail 
6

La fonction fit() dans le module PIL ImageOps fait ce que vous voulez:

ImageOps.fit(image, (min(*image.size),) * 2, Image.ANTIALIAS, 0, (.5, .5)) 
+0

Hmm .. cela ne semble pas vraiment produire des images carrées. Ou est-ce que je manque quelque chose? – winsmith

+0

La fonction fit() renvoie un nouvel objet image, j'ai oublié de le mentionner. Peut-être que c'est ça? – Steef

+0

Cela a résolu mon problème exactement. –

0

Je veux à une analyse de contenu d'une image jepg. Je souhaite prendre un fichier jpeg imafe dire 251 x 261 et le passer à travers un algorithme pour le recadrer pour dire 96 x 87. Est-ce que ce programme peut faire comme écrire un algorithme de recadrage intelligent, avec une invite à décomposer l'image.

Questions connexes