What is the difference between Image.resize and Image.thumbnail in Pillow-Python

PythonPython Imaging-LibraryPillow

Python Problem Overview


I want to resize an image in pillow-python, however I have 2 functions of choice to use:

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

and

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

Both definitions point out to resizing the image, Which one should I be using?

Python Solutions


Solution 1 - Python

Image.resize resizes to the dimensions you specify:

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

Image.thumbnail resizes to the largest size that (a) preserves the aspect ratio, (b) does not exceed the original image, and (c) does not exceed the size specified in the arguments of thumbnail.

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

Furthermore, calling thumbnail resizes it in place, whereas resize returns the resized image.

Solution 2 - Python

Two examples for thumbnailing, one taken from 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()

The second example relates to Python/Django. If you do that on a django model.py, you modify the def save(self,*args, **kwargs) method - like this:

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

In the last example both images remain stored in the file system on your server.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwolfgangView Question on Stackoverflow
Solution 1 - PythonwolfgangView Answer on Stackoverflow
Solution 2 - PythonErnst PlesiutschnigView Answer on Stackoverflow