jpg图片使用pil的resize后,PIL Image.resize()不调整图片大小

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.

解决方案

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)

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值