2009-08-09 8 views
25

Mam pewien dziwny problem z PIL, nie zmieniając rozmiaru obrazu.PIL Image.resize() nie zmienia rozmiaru zdjęcia

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') 

Ten kod działa bez żadnych błędów i daje mi plik o nazwie mugshotv2.jpg w odpowiednim folderze, ale nie zmienić jego rozmiar. Robi to coś, ponieważ rozmiar obrazu spada z 120 kb do 20 kb, ale wymiary pozostają takie same.

Być może możesz również zaproponować sposób przycinania obrazów w kwadraty z mniejszą ilością kodu. Pomyślałem, że robi to Image.thumbnail, ale to, co zrobił, to skalowało mój obraz do szerokości 150 px na szerokość, pozostawiając 100px wysokości.

Alan.

Odpowiedz

71

zwraca zmienioną kopię obrazu. Nie modyfikuje oryginału. Prawidłowy sposób z niego korzystać to:

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

source

myślę co szukasz jest funkcja ImageOps.fit. Z PIL docs:

ImageOps.fit (obrazu, rozmiar, sposób, zacieki centrowanie) => obraz

Zwraca wielkości i przycięte wersję obrazu, przycięte do żądanej proporcji i rozmiar. Argument o rozmiarze to żądany rozmiar wyjściowy w pikselach, podany jako krotka (szerokość, wysokość) .

+2

Dzięki! To było to. To był po raz kolejny błąd tego głupiego, łatwego rodzaju, który często robię: P. Patrząc na to jeszcze raz, nie mogę zrozumieć, jak sam tego nie rozumiem - w końcu to było w cholernych doktorów. Chyba muszę iść spać. Jeszcze raz dziękujemy za to, że ImageOps.fit jakiś inny dzień: D –

+0

@Zayatzz, więc zaakceptuj odpowiedź @ Nadii, już, ponieważ to rozwiązało twój problem _i nawet dostarczył porady na temat jeszcze lepszego podejścia! –

+3

Ah .. ten dziwny znaczek wyboru ... ohwell. może użyć czegoś, by zwrócić na to więcej uwagi. –

Powiązane problemy