2013-05-20 4 views
10

Come posso ritagliare un'immagine al centro? Perché so che la scatola è una 4-tupla che definisce la coordinata sinistra, superiore, destra e inferiore, ma non so come ottenere queste coordinate in modo che ritagli al centro.Ritagliare un'immagine al centro usando PIL

+0

si conosce la dimensione dell'immagine e la dimensione dell'immagine più piccola che si desidera ottenere, I assumere? Hai qualcosa da mostrare dove hai provato? –

risposta

29

Supponendo che si conosce la dimensione che si desidera ritagliare a (X new_height new_width):

import Image 
im = Image.open(<your image>) 
width, height = im.size # Get dimensions 

left = (width - new_width)/2 
top = (height - new_height)/2 
right = (width + new_width)/2 
bottom = (height + new_height)/2 

im.crop((left, top, right, bottom)) 

Questo si romperà se si tenta di ritagliare una piccola immagine più grande, ma ho intenzione di assumere hai vinto ci sto provando (o che puoi prendere quel caso e non ritagliare l'immagine).

+0

Ok, finalmente l'ho fatto funzionare! Grazie mille. – user2401069

+0

Piccola correzione, la coltura richiede un array. im.crop ((a sinistra, in alto, a destra, in basso)) – freakTheMighty

+0

Nitpick: intendi una sequenza, non una matrice. :) L'arrotondamento – EOL

3

Un potenziale problema con la soluzione proposta è nel caso ci sia una differenza dispari tra la dimensione desiderata e la vecchia dimensione. Non puoi avere mezzo pixel su ciascun lato. Uno deve scegliere un lato per inserire un pixel in più.

Se c'è una differenza dispari per l'orizzontale, il codice riportato sotto posizionerà il pixel in più a destra, e se c'è una differenza dispari sulla verticale, il pixel in più va verso il basso.

import numpy as np 

def centeredCrop(img, new_height, new_width): 

    width = np.size(img,1) 
    height = np.size(img,0) 

    left = np.ceil((width - new_width)/2.) 
    top = np.ceil((height - new_height)/2.) 
    right = np.floor((width + new_width)/2.) 
    bottom = np.floor((height + new_height)/2.) 
    cImg = img[top:bottom, left:right] 
    return cImg 
+3

non è corretto, l'immagine del risultato non avrà sempre le dimensioni richieste. La formula corretta è 'right = width - floor ((width - new_width)/2)' –

2

Questa è la funzione che stavo cercando:

from PIL import Image 
im = Image.open("test.jpg") 

crop_rectangle = (50, 50, 200, 200) 
cropped_im = im.crop(crop_rectangle) 

cropped_im.show() 

Tratto da another answer