为什么PIL缩略图不正确缩放?

6 投票
2 回答
7650 浏览
提问于 2025-04-16 18:37

我正在尝试在我的项目中,当保存用户的原始图片时,同时创建并保存一个缩略图,下面是我的代码:

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(这是一张比较短的图片)。

有没有人能告诉我我哪里做错了?我该如何强制保持我想要的比例?

附注:我尝试过所有的尺寸设置方法:tupal: THUMB_SIZE = (45, 45),还有直接把尺寸输入到缩略图函数里。

还有一个问题:在PIL中,resize和thumbnail函数有什么区别?什么时候用resize,什么时候用thumbnail?

2 个回答

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

image.thumbnail() 这个函数可以保持原始图片的宽高比。

可以使用 image.resize() 来替代。

更新

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

撰写回答