Pillow
last modified January 29, 2024
Pillow tutorial shows how to use Pillow in Python to work with images. The sources are available at the author's Github repository.
Pillow
Pillow is a Python Imaging Library (PIL), which adds support for opening, manipulating, and saving images. The current version identifies and reads a large number of formats. Write support is intentionally restricted to the most commonly used interchange and presentation formats.
Pillow show image
In the first example we read an image file and show it in an external program.
#!/usr/bin/python
from PIL import Image
import sys
try:
tatras = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
tatras.show()
The program reads a JPG image and displays it in an external application.
from PIL import Image
From the PIL module, we include the Image class.
tatras = Image.open("tatras.jpg")
The Image.open method reads the image file. Pillow can read
over 30 different file formats.
tatras.show()
The show method is mainly intended for debugging purposes.
It saves the image into a temporary file and displays it in external program.
This could be ImageMagic on Linux or Paint on Windows.
Basic image information with Pillow
Pillow allows us to get some basic information about the image.
#!/usr/bin/python
from PIL import Image
import sys
try:
tatras = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
print("Format: {0}\nSize: {1}\nMode: {2}".format(tatras.format,
tatras.size, tatras.mode))
The example prints basic information about the image with Pillow.
print("Format: {0}\nSize: {1}\nMode: {2}".format(tatras.format,
tatras.size, tatras.mode))
We print the image format, its size and mode.
$ ./basic_info.py Format: JPEG Size: (350, 232) Mode: RGB
Pillow blur image
The ImageFilter module contains definitions for a pre-defined
set of filters, which can be used with the filter method.
#!/usr/bin/python
from PIL import Image, ImageFilter
import sys
try:
img = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
blurred = img.filter(ImageFilter.BLUR)
blurred.save("blurred.png")
The program loads an image, creates a blurred image from the original image, and saves the new image on disk.
from PIL import Image, ImageFilter
We import the Image and ImageFilter modules.
blurred = img.filter(ImageFilter.BLUR)
We apply the ImageFilter.BLUR on the original image;
the operation returns a new modified image.
blurred.save("blurred.png")
With the save method, we save the blurred image on
disk.
Converting image with Pillow
With the save method, we can convert an image to
a different format.
#!/usr/bin/python
from PIL import Image
import sys
try:
tatras = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
tatras.save('tatras.png', 'png')
The program reads a JPG image and converts it into PNG format.
tatras.save('tatras.png', 'png')
The second parameter of the save method specifies the image
format.
Pillow GrayScale image
With the Image.convert method, we can produce
a black and white image.
#!/usr/bin/python
from PIL import Image
import sys
try:
tatras = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
grayscale = tatras.convert('L')
grayscale.show()
The program reads an image and transforms it into a grayscale image.
grayscale = tatras.convert('L')
The first parameter of the convert method is the mode;
the 'L' mode is black and white.
Cropping image with Pillow
The Image.crop crops the image.
#!/usr/bin/python
from PIL import Image
import sys
try:
tatras = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
cropped = tatras.crop((100, 100, 350, 350))
cropped.save('tatras_cropped.jpg')
The program crops an image. The cropped image is saved on disk.
cropped = tatras.crop((100, 100, 350, 350))
The crop method takes a 4-tuple defining the left, upper, right,
and lower pixel coordinates.
Rotating image with Pillow
The Image.rotate returns a rotated copy of the image.
#!/usr/bin/python
from PIL import Image
import sys
try:
tatras = Image.open("tatras.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
rotated = tatras.rotate(180)
rotated.save('tatras_rotated.jpg')
The program rotates an image by 180 degrees and saves the newly created image on disk.
Displaying image in Tkinter
The following program displays an image in a Tkinter program.
#!/usr/bin/python
from PIL import Image, ImageTk
from tkinter import Tk
from tkinter.ttk import Frame, Label
import sys
class Example(Frame):
def __init__(self):
super().__init__()
self.loadImage()
self.initUI()
def loadImage(self):
try:
self.img = Image.open("tatrs.jpg")
except IOError:
print("Unable to load image")
sys.exit(1)
def initUI(self):
self.master.title("Label")
tatras = ImageTk.PhotoImage(self.img)
label = Label(self, image=tatras)
# reference must be stored
label.image = tatras
label.pack()
self.pack()
def setGeometry(self):
w, h = self.img.size
self.master.geometry(("%dx%d+300+300") % (w, h))
def main():
root = Tk()
ex = Example()
ex.setGeometry()
root.mainloop()
if __name__ == '__main__':
main()
The program displays an image in the Label widget
of the Tkinter toolkit.
from PIL import Image, ImageTk
The ImageTk is a Tkinter-compatible photo image.
It can be used everywhere Tkinter expects an image object.
tatras = ImageTk.PhotoImage(self.img)
We create a photo image.
label = Label(self, image=tatras)
The photoimage is given to the image parameter of the
label widget.
label.image = tatras
In order not to be garbage collected, the image reference must be stored.
w, h = self.img.size
self.master.geometry(("%dx%d+300+300") % (w, h))
The size of the window fits the image size.
Reading image from URL
The next example reads an image from URL.
#!/usr/bin/python
from PIL import Image
import requests
import sys
url = 'https://i.ytimg.com/vi/vEYsdh6uiS4/maxresdefault.jpg'
try:
resp = requests.get(url, stream=True).raw
except requests.exceptions.RequestException as e:
sys.exit(1)
try:
img = Image.open(resp)
except IOError:
print("Unable to open image")
sys.exit(1)
img.save('sid.jpg', 'jpeg')
The example reads an image from the URL and saves it on disk.
import requests
We use the requests library to download the image.
resp = requests.get(url, stream=True).raw
We read the image as raw data.
img = Image.open(resp)
Image is created from the response object.
img.save('sid.jpg', 'jpeg')
The image is saved.
Drawing to Pillow image
Pillow has some basic 2D graphics capabilities. ImageDraw module
provides simple 2D graphics for Image objects. We can create new
images, annotate or retouch existing images, and generate graphics
on the fly for web use.
#!/usr/bin/python
from PIL import Image, ImageDraw
img = Image.new('RGBA', (200, 200), 'white')
idraw = ImageDraw.Draw(img)
idraw.rectangle((10, 10, 100, 100), fill='blue')
img.save('rectangle.png')
The example creates a new image and draws a blue rectangle on the image.
img = Image.new('RGBA', (200, 200), 'white')
A new Image is created. The image mode is 'RGBA'.
Its size is 200x200 and the background is white.
idraw = ImageDraw.Draw(img)
From the image we create the ImageDraw object. Now
we can perform some drawing operations on the image.
idraw.rectangle((10, 10, 100, 100), fill='blue')
With the rectangle method, we draw a blue rectangle
on the image.
Creating watermark with Pillow
The following example creates a watermark.
#!/usr/bin/python
from PIL import Image, ImageDraw, ImageFont
import sys
try:
tatras = Image.open("tatras.jpg")
except:
print("Unable to load image")
sys.exit(1)
idraw = ImageDraw.Draw(tatras)
text = "High Tatras"
font = ImageFont.truetype("arial.ttf", size=18)
idraw.text((10, 10), text, font=font)
tatras.save('tatras_watermarked.png')
We use the ImageDraw module to create watermark.
font = ImageFont.truetype("arial.ttf", size=18)
We create an Arial font of 18 size.
idraw.text((10, 10), text, font=font)
The watermark is created with the text method.
The default colour of the text is white. We use the created font.
Source
In this article we have worked with the Python Pillow library.
Author
List all Python tutorials.