为什么PIL缩略图没有正确调整大小?

时间:2011-05-30 14:29:12

标签: python django django-models python-imaging-library

我在项目的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的图像在(短图)。

任何人都能告诉我我做错了什么吗?如何强制我想要的宽高比?

P.S。:我已经尝试了尺寸的所有方法:tupal: THUMB_SIZE = (45, 45)并直接将尺寸输入缩略图功能。

另一个问题:PIL中调整大小和缩略图功能之间的差异是什么?何时使用调整大小以及何时使用缩略图?

2 个答案:

答案 0 :(得分:12)

image.thumbnail()功能将保持原始图像的宽高比。

改为使用image.resize()

<强>更新

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

答案 1 :(得分:4)

假设:

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