Python Pillow Tutorial

17 Jun, 2021
Digital Image processing means processing the image digitally with the help of a computer. Using image processing we can perform operations like enhancing the image, blurring the image, extracting text from images, and many more operations. There are various ways to process images digitally. Here we will discuss the Pillow module of Python. Python Pillow is built on the top of PIL (Python Image Library) and is considered as the fork for the same as PIL has been discontinued from 2011. Pillow supports many image file formats including BMP, PNG, JPEG, and TIFF. The library encourages adding support for newer formats in the library by creating new file decoders.
This article aims at providing information about Python Pillow from basics to advance with the help of well-explained concepts and examples. So, let’s not waste any of the time and dive deep into the Pillow.
Python Pillow does not come in-built with Python. To install it type the below command in the terminal.
pip install pillow
After installation let’s get started using the pillow module.
The Pillow module provides the open() and show() function to read and display the image respectively. For displaying the image Pillow first converts the image to a .png format (on Windows OS) and stores it in a temporary buffer and then displays it. Therefore, due to the conversion of the image format to .png some properties of the original image file format might be lost (like animation). Therefore, it is advised to use this method only for test purposes.
Example:
 
Image Used for all the below Examples:
Python3
from PIL import Image  # Location of the imageimg = Image.open("geek.jpg") img.show()
 
 
Output:
 
 
Refer to the below articles to get detailed information about opening and displaying images.
 
Python PIL | Image.open() method
Python PIL | Image.show() method
size attribute provides the size of the image. It returns a tuple that contains width and height.
format attribute returns the format of the image file.
Example:
 
Python3
from PIL import Image  # Location of the imageimg = Image.open("geek.jpg") # size of the imageprint(img.size) # format of the imageprint(img.format)
 
 
Output:
 
(287, 70)
JPEG
 
Refer to the below article to get detailed information about Getting the Size, and format of the Image
 
Finding the Size Resolution of Image in Python
How to find width and height of an image using Python?
 
The mode attribute of the image tells the type and depth of the pixel in the image. A 1-bit pixel has a range of 0-1, and an 8-bit pixel has a range of 0-255. There are different modes provided by this module. A few of them are:
 
 
Example:
 
Python3
from PIL import Image  # Location of the imageimg = Image.open("geek.jpg") # mode of the imageprint(img.mode)
 
 
Output:
 
RGB
rotate() method of the Image class is used to rotate the image by a particular angle counterclockwise around its center. After rotating the image, the sections of the image having no pixel values are filled with black (for non-alpha images) and with completely transparent pixels (for images supporting transparency).
 
Syntax:
 
new_object = PIL.Image.Image.rotate(image_object, angle, resample=0, expand=0)
OR
new_object = image_object.rotate(angle, resample=0, expand=0)
 
Example:
 
Python3
# Importing Image module from# PIL packagefrom PIL import Imageimport PIL # creating a image object (main image)im1 = Image.open(r"geek.jpg") # rotating a image 90 deg counter clockwiseim1 = im1.rotate(90, PIL.Image.NEAREST, expand = 1) # to show specified imageim1.show()
 
 
Output:
 
 
Refer to the below articles to get detailed information about rotating the image.
 
Python PIL | rotate() method
How to rotate an image using Python?
Image.transpose() is used to transpose the image (flip or rotate in 90 degree steps). 
 
Syntax:
 
transpose(degree)
 
Keywords FLIP_TOP_BOTTOM and FLIP_LEFT_RIGHT will be passed to transpose method to flip it.
 
FLIP_TOP_BOTTOM – returns an original image flipped Vertically
FLIP_LEFT_RIGHT – returns an original image flipped Horizontally
 
Example:
 
Python3
# importing PIL Modulefrom PIL import Image # open the original imageoriginal_img = Image.open("geek.jpg") # Flip the original image verticallyvertical_img = original_img.transpose(method=Image.FLIP_TOP_BOTTOM)vertical_img.save("vertical.png") vertical_img.show() # close all our files objectoriginal_img.close()vertical_img.close()
 
 
Output:
 
 
Refer to the below articles to get detailed information about flipping images.
 
Python PIL | Image.transpose() method
How to flip an image horizontally or vertically in Python?
Image.resize() returns a resized copy of the image. Interpolation happens during the resize process, due to which the quality of image changes whether it is being upscaled (resized to a higher dimension than original) or downscaled (resized to a lower Image then original). Therefore resize() should be used cautiously and while providing suitable value for resampling argument.
 
Syntax: 
 
Image.resize(size, resample=0)
Example:
 
Python3
# Importing Image class from PIL modulefrom PIL import Image # Opens a image in RGB modeim = Image.open(r"geek.jpg") # Size of the image in pixels# (size of original image)# (This is not mandatory)width, height = im.size # Setting the points for cropped imageleft = 4top = height / 5right = 154bottom = 3 * height / 5 # Cropped image of above dimension# (It will not change original image)im1 = im.crop((left, top, right, bottom))newsize = (300, 300)im1 = im1.resize(newsize) # Shows the image in image viewerim1.show()
Output:
Refer to the below article to get detailed information about resizing images.
Python PIL | Image.resize() method
Change the ratio between width and height of an image using Python – Pillow
Image.save() saves the image under the given filename. If no format is specified, the format to use is determined from the filename extension, if possible. You can use a file object instead of a filename. In this case, you must always specify the format. The file object must implement the seek, tell, and write methods, and be opened in binary mode.
Syntax: 
Image.save(fp, format=None, **params)
Example:
Python3
from PIL import Image  size = (40, 40)img = Image.open(r"geek.jpg") print("Original size of the image")print(img.size) # resizing the imager_img = img.resize(size, resample = Image.BILINEAR) # resized_test.png => Destination_pathr_img.save("resized_test.jpg") # Opening the new imageimg = Image.open(r"resized_test.jpg") print("\nNew size of the image")print(img.size)
 
 
Output:
 
Original size of the image
(287, 70)

New size of the image
(40, 40)
 
Till now, we have learned the basics of pillow now let’s start with some complex operations like blurring the image of merging two images or even creating a thumbnail. So let’s get started by merging images.
 
 
Image.merge() is used to merge a set of single band images into a new multiband image. 
 
Syntax: 
 
PIL.Image.merge(mode, bands)
Parameters:
mode – The mode to use for the output image. See: Modes.
bands – A sequence containing one single-band image for each band in the output image. All bands must have the same size.
Returns: An Image object.
 
Note: We will be using Image.split() method to split the image into individual bands.
 
Example:
 
Python3
# importing Image class from PIL packagefrom PIL import Image # creating a objectimage = Image.open(r"geek.jpg")image.load() # Splitting the image into individual# bandsr, g, b, = image.split() # merge function usedim1 = Image.merge('RGB', (g, b, r))im1.show()
 
 
Output:
 
 
Using the merge() method we can also merge two or more images. We have to select two images of the same size or we can resize the image. Then using the new() function we will create a new image and will paste all the images there. See the below example for a better understanding.
 
Example:
 
Images Used:
 
 
Python3
from PIL import Image img_01 = Image.open("digit-number-img-0.jpg")img_02 = Image.open("digit-number-img-1.jpg")img_03 = Image.open("digit-number-img-2.jpg")img_04 = Image.open("digit-number-img-3.jpg") img_01_size = img_01.sizeimg_02_size = img_02.sizeimg_03_size = img_02.sizeimg_02_size = img_02.size print('img 1 size: ', img_01_size)print('img 2 size: ', img_02_size)print('img 3 size: ', img_03_size)print('img 4 size: ', img_03_size) new_im = Image.new('RGB', (2*img_01_size[0],2*img_01_size[1]), (250,250,250)) new_im.paste(img_01, (0,0))new_im.paste(img_02, (img_01_size[0],0))new_im.paste(img_03, (0,img_01_size[1]))new_im.paste(img_04, (img_01_size[0],img_01_size[1])) new_im.save("merged_images.png", "PNG")new_im.show()
Output:
Refer to the below articles to get detailed information about merging images.
Python PIL | Image.merge() method
How to merge images with same size using the Python 3 module pillow?
Python | Copy and Paste Images onto other Image using Pillow
How to merge a transparent PNG image with another image using PIL?
Image.thumbnail() convert the image into a thumbnail. This method modifies the image to contain a thumbnail version of itself, no larger than the given size. This method calculates an appropriate thumbnail size to preserve the aspect of the image, calls the draft() method to configure the file reader (where applicable), and finally resizes the image.
Note: This function modifies the Image object in place. If you need to use the full resolution image as well, apply this method to a copy() of the original image.
Example:
Image Used:
Python3
# importing Image class from PIL packagefrom PIL import Image # creating a objectimage = Image.open(r"image.jpg")MAX_SIZE = (100, 100) # Creating the thumbnailimage.thumbnail(MAX_SIZE) image.show()
 
 
Output:
 
 
Refer to the below articles to get detailed information about creating thumbnails.
 
Python PIL | Image.thumbnail() Method
Generate square or circular thumbnail image with Python – Pillow
Cropping is the process of selecting only a part of the image. The crop() method is used to crop a rectangular portion of any image.
 
Syntax: 
 
PIL.Image.crop(box = None)
Parameters:
box: a 4-tuple defining the left, upper, right, and lower pixel coordinate.
 
Example:
 
Python3
# Importing Image class from PIL modulefrom PIL import Image # Opens a image in RGB modeim = Image.open(r"geek.jpg") # Size of the image in pixels# (size of original image)# (This is not mandatory)width, height = im.size # Setting the points for cropped imageleft = 5top = height / 4right = 164bottom = 3 * height / 4 # Cropped image of above dimension# (It will not change original image)im1 = im.crop((left, top, right, bottom)) # Shows the image in image viewerim1.show()
Output:
Refer to the below articles to get detailed information about Cropping images.
Crop image using pillow
Cropping an Image in a circular way
If a blurred image is observed carefully then a common thing to notice is that image is smooth meaning edges are not observed. A filter used for blurring is also called a low pass filter because it allows the low frequency to enter and stop high frequency. The ImageFilter class in the pillow library provides various filters that can be applied using the filter() method. Let’s see some of the blurring filters provided by the pillow.
This method blurs the image using the kernel matrix or through the convolution matrix. It can be applied using the BLUR parameter.
Syntax:
filter(ImageFilter.BLUR)
Note: For more information refer, What is Image Blurring
Example:
Python3
# Importing Image class from PIL modulefrom PIL import Image # Opens a image in RGB modeim = Image.open(r"geek.jpg") # Blurring the imageim1 = im.filter(ImageFilter.BLUR) # Shows the image in image viewerim1.show()
Output:
The Gaussian filter is implemented as an Odd sized Symmetric Kernel (DIP version of a Matrix) which is passed through each pixel of the Region of Interest to get the desired effect. The kernel is not hard towards drastic color changed (edges) due to the pixels towards the center of the kernel having more weightage towards the final value than the periphery. A Gaussian filter could be considered as an approximation of the Gaussian Function (mathematics). The Pillow module provides the predefined gaussianblur kernel that does the underlying maths for us.
Syntax:
ImageFilter.GaussianBlur(radius=2)
Example:
Python3
# Importing Image class from PIL modulefrom PIL import Image # Opens a image in RGB modeim = Image.open(r"geek.jpg") # Blurring the imageim1 = im.filter(ImageFilter.GaussianBlur(4)) # Shows the image in image viewerim1.show()
Output:
Box blur is also known as box linear filter. Box blurs are frequently used to approximate Gaussian blur. A box blur is generally implemented as an image effect that affects the whole screen. The blurred color of the current pixel is the average of the current pixel’s color and its 8 neighboring pixels. Pillow provides the BoxBlur() method to do the same.
Syntax:
ImageFilter.BoxBlur(radius)
Example:
Python3
# Importing Image class from PIL modulefrom PIL import Image # Opens a image in RGB modeim = Image.open(r"geek.jpg") # Blurring the imageim1 = im.filter(ImageFilter.BoxBlur(4)) # Shows the image in image viewerim1.show()
 
 
Output:
 
 
Refer to the below articles to get detailed information about blurring images.
 
Python PIL | GaussianBlur() method
Apply a Gauss filter to an image with Python
Python PIL | BoxBlur() method
Pillow provides the ImageDraw module that provides simple 2D graphics for Image objects. You can use this module to create new images, annotate or retouch existing images, and generate graphics on the fly for web use. Let’s see various figures or texts that we can draw on the image.
 
Adding text to an image can sometimes be very necessary as it can be used to provide some useful information to the image or can also be used to add a digital signature to the image. With pillow, we can easily add a text to any image. Let’s see the below example.
 
Python3
# import all the librariesfrom PIL import Imagefrom PIL import ImageFontfrom PIL import ImageDraw # image openingimage = Image.open("image.jpg") # creating a copy of original imagewatermark_image = image.copy() # Image is converted into editable form using# Draw function and assigned to drawdraw = ImageDraw.Draw(watermark_image) # ("font type",font size)font = ImageFont.truetype("DroidSans.ttf", 50) # Decide the text location, color and font# (255,255,255)-White color textdraw.text((0, 0), "GeeksforGeeks", (255, 255, 255), font=font) watermark_image.show()
 
 
Output:
 
Make the image editable using ImageDraw.
Use ImageFont to specify font and font size. This step is optional. It is for those who want their text to look cool or stylish because someone won’t select any font style then the system takes the default font style.
Create a Font using ImageFont module function truetype() as it needs two parameters that are (“font type”, size)
Then used text() function of draw object and pass the four-parameters (Point of starting for text, “sample text”, Color, ImageFont object).
 
Refer to the below articles to get detailed information about adding texts to the image.
 
Python Pillow – Writing Text on Image
Python PIL | ImageDraw.Draw.text()
Adding Text on Image using Python – PIL
 
ImageDraw.Draw.multiline_text() is used to draws the string at the given position.
 
Syntax:
 
ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align=”left”)
 
Example:
 
Python3
# Importing Image and ImageFont, ImageDraw# module from PIL packagefrom PIL import Image, ImageFont, ImageDraw # creating a image objectimage = Image.open(r'geek.jpg') draw = ImageDraw.Draw(image) # specified font sizefont = ImageFont.truetype(r'DroidSans.ttf', 15) text = u"""\GeeksFOR \n Geeks""" # drawing text sizedraw.text((6, 8), text, fill ="red", font = font, align ="right") image.show()
Output:
ImageDraw.Draw.line() is used to draws a line between the coordinates in the xy list.
Syntax: 
ImageDraw.Draw.line(xy, fill=None, width=0)
Example:
Python3
# importing image object from PILimport mathfrom PIL import Image, ImageDraw w, h = 220, 190shape = [(40, 40), (w - 10, h - 10)] # creating new Image objectimg = Image.new("RGB", (w, h)) # create line imageimg1 = ImageDraw.Draw(img)img1.line(shape, fill="none", width=0)img.show()
Output:
ImageDraw.Draw.rectangle() is used to draw a rectangle.
Syntax: 
ImageDraw.Draw.rectangle(xy, fill=None, outline=None)
Example:
Python3
# importing image object from PILimport mathfrom PIL import Image, ImageDraw w, h = 220, 190shape = [(40, 40), (w - 10, h - 10)] # creating new Image objectimg = Image.new("RGB", (w, h)) # create rectangle imageimg1 = ImageDraw.Draw(img)img1.rectangle(shape, fill="# ffff33", outline="red")img.show()
 
 
Output:
 
 
ImageDraw.Draw.polygon() is used to draw a polygon. The polygon outline consists of straight lines between the given coordinates, plus a straight line between the last and the first coordinate.
 
Syntax:
 
ImageDraw.Draw.polygon(xy, fill=None, outline=None)
 
Example:
 
Python3
import mathfrom PIL import Image, ImageDrawfrom PIL import ImagePath side = 8xy = [    ((math.cos(th) + 1) * 90,     (math.sin(th) + 1) * 60)    for th in [i * (2 * math.pi) / side for i in range(side)]] image = ImagePath.Path(xy).getbbox()size = list(map(int, map(math.ceil, image[2:]))) img = Image.new("RGB", size, "# f9f9f9")img1 = ImageDraw.Draw(img)img1.polygon(xy, fill="# eeeeff", outline="blue")img.show()
Output:
Python Pillow provides the ImageEnhance module to adjust the color, brightness, contrast, and sharpness of the image.
ImageEnhance.Color() and ImageEnhance.Contrast() methods are used to adjust the color and contrast of the image respectively.
ImageEnhance.Color() is used to adjust the color balance of an image, in a manner similar to the controls on a color TV set. An enhancement factor of 0.0 gives a black and white image. A factor of 1.0 gives the original image.
Syntax:
ImageEnhance.Color(image)
Example:
Python3
# This will import Image and ImageEnhance modulesfrom PIL import Image, ImageEnhance # Opening Imageim = Image.open(r"geek.jpg") # Creating object of Color classim3 = ImageEnhance.Color(im) # showing resultant imageim3.enhance(5.0).show()
  
Output:
 
ImageEnhance.Contrast() is used to control the contrast of an image, similar to the contrast control on a TV set. An enhancement factor of 0.0 gives a solid grey image. A factor of 1.0 gives the original image.
 
Syntax:
 
obj = ImageEnhance.Contrast(image)
obj.enhance(factor)
 
Example:
 
Python3
# This will import Image and ImageEnhance modulesfrom PIL import Image, ImageEnhance # Opening Imageim = Image.open(r"geek.jpg") # Creating object of Contrast classim3 = ImageEnhance.Contrast(im) # showing resultant imageim3.enhance(5.0).show()
 
 
Output:
 
 
Refer to the below articles to get detailed information about enhancing color and contrast.
 
Python PIL | ImageEnhance.Color() and ImageEnhance.Contrast() method
 
ImageEnhance.Brightness() and ImageEnhance.Sharpness() methods are used to adjust the brightness and sharpness of the image.
 
 ImageEnhance.Brightness() is used to control the brightness of an image. An enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the original image.
 
Syntax:
 
obj = ImageEnhance.Brightness(image)
obj.enhance(factor)
 
Example:
 
Python3
# This will import Image and ImageEnhance modulesfrom PIL import Image, ImageEnhance # Opening Imageim = Image.open(r"geek.jpg") # Creating object of Brightness classim3 = ImageEnhance.Brightness(im) # showing resultant imageim3.enhance(1.5).show()
 
 
Output:
 
ImageEnhance.Sharpness() is used to adjust the sharpness of an image. An enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image, and a factor of 2.0 gives a sharpened image.
 
Syntax:
 
obj = ImageEnhance.Sharpness(image)
obj.enhance(factor)
 
Example:
 
Python3
# This will import Image and ImageChops modulesfrom PIL import Image, ImageEnhance # Opening Imageim = Image.open(r"geek.jpg") # Creating object of Sharpness classim3 = ImageEnhance.Sharpness(im) # showing resultant imageim3.enhance(5.0).show()
 
 
Output:
 
 
Refer to the below articles to get detailed information about enhancing the brightness and sharpness of the image.
 
Python PIL | ImageEnhance.Brightness() and ImageEnhance.Sharpness() method
Convert the .GIF to .BMP and it’s vice-versa in Python
Convert an image into jpg format using Pillow in Python
Convert PNG to JPG using Python
Convert files from jpg to png and vice versa using Python
Convert the .PNG to .GIF and it’s vice-versa in Python
Convert files from jpg to gif and vice versa using Python
Convert OpenCV image to PIL image in Python
Create transparent png image with Python – Pillow
Add padding to the image with Python – Pillow
Find most used colors in image using Python
Python – Color Inversion using Pillow
Overlay an image on another image in Python
Change image resolution using Pillow in Python
Spot the difference between two images using Python
How to Extract Text from Images with Python?
Create and save animated GIF with Python – Pillow
How to compress images using Python and PIL?
Python | Using PIL ImageGrab and PyTesseract
Floodfill Image using Python-Pillow
Python – Channel Drop using Pillow
Loading Images in Tkinter using PIL
Create Certificates using Python-PIL
Python | OCR on All the Images present in a Folder Simultaneously
Apply changes to all the images in given folder – Using Python PIL
 
simranarora5sos
Python-pil
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.