为什么PIL缩略图不正确缩放?
我正在尝试在我的项目中,当保存用户的原始图片时,同时创建并保存一个缩略图,下面是我的代码:
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')