2009-08-09 3 views
25

PIL에 이미지의 크기를 조정하지 않는 데 이상한 문제가 있습니다.PIL Image.resize() 그림의 크기를 조정하지 않음

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

이 코드는 오류없이 실행하고 올바른 폴더 나에게 이미지라는 mugshotv2.jpg을 생산하지만, 크기를 조정하지 않습니다. 사진의 크기가 120kb에서 20kb로 떨어지기 때문에 뭔가를하지만 치수는 동일하게 유지됩니다.

아마 적은 코드로 이미지를 사각형으로자를 수있는 방법을 제안 할 수도 있습니다. 나는 Image.thumbnail이 그럴 것이라고 생각했지만, 이미지의 너비가 150px로 높이가 100px로 조정되었다.

앨런.

답변

71

resize()는 이미지의 크기가 조정 된 사본을 반환합니다. 원본을 수정하지 않습니다. 그것을 사용하는 올바른 방법은 다음과 같습니다

source

img = img.resize((150, newheight), image.ANTIALIAS) 
난 당신이 ImageOps.fit 기능입니다 무엇을 찾고있는 것 같아요. PIL docs 가입일 :

ImageOps.fit가 (화상 사이즈가있어서, 중심 출혈) => 화상

가 화상의 크기와 자른 버전을 반환 요청 종횡비 잘려 크기. 인수는 (폭, 높이) 튜플로 주어진 픽셀 단위로 요청 된 출력 크기 인 입니다.

+2

감사합니다. 그거였다. 이것은 어리 석고 쉬운 종류의 실수였습니다. 나는 종종 그렇게합니다 : P. 그것을 다시 보았을 때, 내가 어떻게 이해하지 못했는지 이해할 수 없었습니다. 결국 그것은 빌어 먹을 문서였습니다. 나는 자러 갈 필요가 있다고 생각한다. 다시 한번 ImageOps.fit을 사용해보십시오. D –

+0

@ Zayatzz, @ Nadia의 대답을 이미 받아 들였습니다. 문제가 해결되었으므로 _and_는 더 나은 접근 방법에 대해서도 조언했습니다. –

+3

아 .. 그 이상한 체크 마크 .... 오웰. 더 많은 관심을 끌기 위해 뭔가를 사용할 수 있습니다. –

관련 문제