Pillow-Python中的Image.resize和Image.thumbnail有什么区别?

65
2个回答

91

Image.resize 将图像调整为您指定的尺寸:

Image.resize([256,512],PIL.Image.ANTIALIAS) # resizes to 256x512 exactly

Image.thumbnail会将图像缩略至最大尺寸,同时满足以下条件:(a)保持宽高比例不变,(b)不超过原始图像大小,且(c)不超过thumbnail参数指定的大小。

Image.thumbnail([256, 512],PIL.Image.ANTIALIAS) # resizes 512x512 to 256x256

此外,调用thumbnail会原地调整图像大小,而resize则返回调整大小后的图像。


28
thumbnail 方法不会放大图像。比如,如果调用 Image.thumbnail([512, 512], PIL.Image.ANTIALIAS),尺寸为 150x150 的图像将保持这个尺寸。 - Hein van Dyke
6
谢谢。"原地调整大小"是解决我的问题的关键。我正在将代码转换为使用缩略图而不是调整大小,但我得到了一个空返回。 - Vaughn
此外,thumbnail 保持纵横比。因此,将 thumbnail(100, 200) 应用于一个512x512的图像会将图像大小更改为100x100。 - max
@HeinvanDyke 感谢您的回答。在调整大小时,质量是否有差异,即是否有一种方法会引入伪影而另一种方法不会? - Crashalot
ANTIALIAS不再是一个有效的重采样滤镜,应该移除。Pillow已经有合理的默认设置,不需要它。 - undefined

4

这里有两个关于缩略图的例子,其中一个来自geeksforgeeks:

# importing Image class from PIL package  
from PIL import Image 
   
# creating a object  
image = Image.open(r"C:\Users\System-Pc\Desktop\python.png") 
MAX_SIZE = (100, 100) 
  
image.thumbnail(MAX_SIZE) 
  
# creating thumbnail 
image.save('pythonthumb.png') 
image.show()

第二个例子涉及Python/Django。 如果你在django的model.py文件中这样做,你需要修改def save(self,*args, **kwargs)方法-像这样:
class Profile(models.Model):                                                                                                                                                                                                                               
    user=models.OneToOneField(User, on_delete=models.CASCADE)                                                                                                                                                                                              
    image=models.ImageField(default='default.jpg', upload_to='img_profile')                                                                                                                                                                                                                                                                                                                                                                                   
    def __str__(self):                                                                                                                                                                                                                                     
        return '{} Profile'.format(self.user.email)                                                                                                                                                                                                    
    # Resize the uploaded image                                                                                                                                                                                                                            
    def save(self, *args, **kwargs):                                                                                                                                                                                                                       
        super().save(*args, **kwargs)                                                                                                                                                                                                                      
        img=Image.open(self.image.path)                                                                                                                                                                                                                    
        if img.height > 100 or img.width >100:                                                                                                                                                                                                             
            Max_size=(100,100)                                                                                                                                                                                                                             
            img.thumbnail(Max_size)                                                                                                                                                                                                                        
            img.save(self.image.path)                                                                                                                                                                                                                      
        else:                                                                                                                                                                                                                                              
            del img

在上一个示例中,两个图像仍然存储在您服务器的文件系统中。

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