为什么PIL缩略图不能正确调整大小?

6

我正在尝试在保存项目中的userProfile模型中的原始用户图像时创建并保存缩略图像,以下是我的代码:

def save(self, *args, **kwargs):
    super(UserProfile, self).save(*args, **kwargs)
    THUMB_SIZE = 45, 45
    image = Image.open(join(MEDIA_ROOT, self.headshot.name))

    fn, ext = os.path.splitext(self.headshot.name)
    image.thumbnail(THUMB_SIZE, Image.ANTIALIAS)        
    thumb_fn = fn + '-thumb' + ext
    tf = NamedTemporaryFile()
    image.save(tf.name, 'JPEG')
    self.headshot_thumb.save(thumb_fn, File(open(tf.name)), save=False)
    tf.close()

    super(UserProfile, self).save(*args, **kwargs)

一切都正常,只有一个问题。
问题在于缩略图函数只将宽度设置为45,而不改变图像的长宽比,所以我正在测试的那个短图像得到的是一个45*35的图像。
请问我做错了什么?如何强制使用我想要的长宽比?
另外一个问题:PIL中resize和thumbnail函数之间有什么区别?什么时候该使用resize,什么时候该使用thumbnail?
附注:我已经尝试了所有的大小方法:tupal: THUMB_SIZE = (45, 45)和直接将大小输入缩略图函数。
2个回答

13

image.thumbnail()函数将保持原始图像的纵横比。

请使用image.resize()代替。

更新

image = image.resize(THUMB_SIZE, Image.ANTIALIAS)        
thumb_fn = fn + '-thumb' + ext
tf = NamedTemporaryFile()
image.save(tf.name, 'JPEG')

10倍,但我也尝试过image.resize(THUMB_SIZE, Image.ANTIALIAS),其中THUMB_RESIZE是一个元组(THUMB_RESIZE = (45,45)),现在根本没有调整大小... 还有其他的方法吗? (这是我在链接中读到的)...谢谢 :-) - Erez
1
再次感谢ShadowCloud,我找到了问题所在...你的回答很好,但是resize函数返回一个需要保存的值,而thumbnail函数是void类型,所以不需要保存,因此如果使用image.resize(...),需要将其赋值给image = image.resize(...),花了我一些时间,但我搞定了...你能否在你的回答中修复它? :-) - Erez
还有一个 image.fit(THUMB_SIZE, Image.ANTIALIAS),它将使用给定的尺寸但通过裁剪图像来保持纵横比。请参见:http://djangosaur.tumblr.com/post/422589280/django-resize-thumbnail-image-pil - Alp

6

给定:

import Image # Python Imaging Library
THUMB_SIZE= 45, 45
image # your input image

如果你想将任何图片调整为45×45的尺寸,你应该使用以下代码:
new_image= image.resize(THUMB_SIZE, Image.ANTIALIAS)

然而,如果您想要一个大小为45×45的结果图像,同时保持输入图像的长宽比并用黑色填充缺失像素:

new_image= Image.new(image.mode, THUMB_SIZE)
image.thumbnail(THUMB_SIZE, Image.ANTIALIAS) # in-place
x_offset= (new_image.size[0] - image.size[0]) // 2
y_offset= (new_image.size[1] - image.size[1]) // 2
new_image.paste(image, (x_offset, y_offset))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接