2009-08-09 11 views
25

Ho qualche strano problema con PIL che non ridimensiona l'immagine.PIL Image.resize() non ridimensionando l'immagine

def handle_uploaded_image(i, u): 
    # resize image 
    from PIL import Image 
    img = Image.open(i) 
    if img.mode not in ('L', 'RGB'): 
     img = img.convert('RGB') 

    width, height = img.size 
    if width == height: 
     img.thumbnail(settings.THUMB_SIZE, Image.ANTIALIAS) 
    elif width > height: 
     ratio = floor(width/height) 
     newwidth = ratio * 150 
     newwidthhalf = floor(newwidth/2) 
     img.resize((newwidth, 150), Image.ANTIALIAS) 
     box = 1 
     img.crop((newwidthhalf, 0, 150, 150)) 
    elif height > width: 
     ratio = floor(height/width) 
     newheight = ratio * 150 
     newheighthalf = floor(newheight/2) 
     img.resize((150, newheight), image.ANTIALIAS) 
     box = 1 
     img.crop((0, newheighthalf, 150, 150)) 
    path = '/'.join([settings.MEDIA_ROOT, 'users', u.username, 'mugshotv2.jpg']) 
    img.save(path, format='JPEG') 

Questo codice viene eseguito senza errori e mi produce un'immagine denominata mugshotv2.jpg nella cartella giusta, ma non ridimensionarla. Fa qualcosa, perché la dimensione dell'immagine scende da 120 kb a 20 kb, ma le dimensioni rimangono le stesse.

Forse si può anche suggerire un modo per ritagliare le immagini in quadrati con meno codice. Ho pensato che Image.thumbnail lo facesse, ma quello che ha fatto è stato ridimensionare la mia immagine a 150 px per la sua larghezza, lasciando 100px di altezza.

Alan.

risposta

71

resize() restituisce una copia ridimensionata di un'immagine. Non modifica l'originale. Il modo corretto di utilizzare è:

img = img.resize((150, newheight), image.ANTIALIAS) 

source

Penso che quello che state cercando è la funzione ImageOps.fit. Da PIL docs:

ImageOps.fit (immagine, dimensioni, metodo, sanguinare, centratura) => immagine

restituisce una versione di dimensioni e ritagliata di dell'immagine, ritagliata alla richiesta proporzioni e dimensione. L'argomento dimensione è la dimensione di output richiesta in pixel, fornita come tupla (larghezza, altezza) .

+2

Grazie! Era così. Questo era ancora un errore di questo tipo stupido e facile, che spesso faccio: P. Guardandolo di nuovo, non riesco a capire come non l'ho capito da solo - era in fondo maledettamente doc. Penso di aver bisogno di andare a letto. Grazie ancora e prova che ImageOps.fit qualche altro giorno: D –

+0

@Zayatzz, quindi accetta la risposta @ Nadia, già, dal momento che ha risolto il tuo problema _e_ anche fornito consigli su approcci ancora migliori! –

+3

Ah .. quello strano segno di spunta .... ohwell. potrebbe usare qualcosa per attirare più attenzione su di esso. –