В чем разница между Image.resize и Image.thumbnail в Pillow-Python

Я хочу изменить размер изображения в подушке-питоне, однако у меня есть две функции на выбор:

Image.resize http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.resize

и

Image.thumbnail http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.thumbnail

Оба определения указывают на изменение размера изображения. Какое из них следует использовать?


person wolfgang    schedule 31.03.2015    source источник


Ответы (2)


Image.resize изменяет размеры до указанных вами размеров:

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

Image.thumbnail изменяет размер до наибольшего размера, который (а) сохраняет соотношение сторон, (б) не превышает исходное изображение и (в) не превышает размер, указанный в аргументах thumbnail.

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

Кроме того, вызов thumbnail изменяет его размер на месте, тогда как resize возвращает изображение с измененным размером.

person wolfgang    schedule 31.03.2015
comment
thumbnail тоже не увеличивает изображение. Так, например. изображение размером 150x150 сохранит этот размер при вызове Image.thumbnail([512,512],PIL.Image.ANTIALIAS). - person Hein van Dyke; 08.08.2017
comment
Спасибо. Изменение размеров на месте было ключом к моей проблеме. Я преобразовывал код для использования миниатюры вместо изменения размера и получал нулевой результат. - person Vaughn; 08.04.2018
comment
Кроме того, thumbnail сохраняет соотношение сторон. Таким образом, применение thumbnail(100, 200) к изображению 512x512 изменит размер изображения на 100x100. - person max; 12.01.2020

Два примера миниатюр, один из которых взят с 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

В последнем примере оба изображения сохраняются в файловой системе на вашем сервере.

person Ernst Plesiutschnig    schedule 30.12.2020