views:

703

answers:

1

I have some strange problem with PIL not resizing the image.

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

This code runs without any errors and produces me image named mugshotv2.jpg in correct folder, but it does not resize it. It does something to it, because the size of the picture drops from 120 kb to 20 kb, but the dimensions remain the same.

Perhaps you can also suggest way to crop images into squares with less code. I kinda thought that Image.thumbnail does it, but what it did was that it scaled my image to 150 px by its width, leaving height 100px.

Alan.

+12  A: 

resize() returns a resized copy of an image. It doesn't modify the original. The correct way to use it is:

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

source

I think what you are looking for is the ImageOps.fit function. From PIL docs:

ImageOps.fit(image, size, method, bleed, centering) => image

Returns a sized and cropped version of the image, cropped to the requested aspect ratio and size. The size argument is the requested output size in pixels, given as a (width, height) tuple.

Nadia Alramli
Thanks! That was it. This was yet again mistake of this stupid, easy kind, that i often do :P. Looking at it again i cant understand how i did not understand it myself - it was in the damn docs after all. I think i need to go to bed. Thanks again and ill try out that ImageOps.fit some other day :D
Zayatzz
@Zayatzz, so accept @Nadia's answer, already, since it's solved your problem _and_ even provided advice on even better approaches!
Alex Martelli
I dont know how to accept it :)
Zayatzz
Ah.. that strange check mark.... ohwell. it could use something to draw more attention to it.
Zayatzz