How to resize images with Python

Resize images using Python

Python
Image credits : 

Original image CC0 from Wikimedia Commons

I love Python, and I've been learning it for a while now. Some time ago, I wrote a Python script where I needed to resize a bunch of images while at the same time keeping the aspect ratio (the proportions) intact. So I looked around and found the PIL (Python Imaging Library).

You will need to install the PIL for the code to work. Note that PIL seems to no longer be maintained, although a "friendly fork" called Pillow is also available. To install PIL on a Debian-based system, run the following command in your terminal as root:

aptitude install python-imaging

And now for the Python code for resizing images while maintaining the aspect ratio.

import PIL
from PIL import Image
basewidth = 300

img = Image.open(‘fullsized_image.jpg')

wpercent = (basewidth / float(img.size[0]))

hsize = int((float(img.size[1]) * float(wpercent)))

img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS)

img.save(‘resized_image.jpg')

These few lines of Python code will resize an image (fullsized_image.jpg) using PIL to a width of 300 pixels, which is set in the variable basewidth and a height proportional to the new width. The proportional height is calculated by determining what percentage 300 pixels is of the original width (img.size[0]) and then multiplying the original height (img.size[1]) by that percentage. The resulting height value is saved in the variable hsize.

You can change basewidth to any other number if you need a different width for your images. Also, notice I saved the resized image under a different name, resized_image.jpg, because I wanted to preserve the full-size image (fullsized_image.jpg) as well. You don't have to do this, of course. You can use the same filename to overwrite the full-size image with the resized image, if that is what you want.

Note: If you are using this script in Zope as an External method, you will need the line from PIL import Image to avoid namespace clashes with Zope's Image.

If the height is fixed and the width proportionally variable, it's pretty much the same thing, you just need to switch things around a bit:

baseheight = 560
img = Image.open(‘fullsized_image.jpg')
hpercent = (baseheight / float(img.size[1]))
wsize = int((float(img.size[0]) * float(hpercent)))
img = img.resize((wsize, baseheight), PIL.Image.ANTIALIAS)
img.save(‘resized_image.jpg')

Notice basewidth is now baseheight, since height is fixed. In the third line, we are calculating the height percentage, so we need img.size[1] instead of img.size[0]. The size attribute is a tuple containing width and height in pixels; size[0] refers to the first tuple element, which is width, and size[1] is the second element, which is height. Line 4 also has this switch between size[0] for width and size[1] for height.

Originally published on Dayo Ntwari's blog and republished under Creative Commons with permission.

Tags

3 Comments

someone

More interesting is how to properly resize videos with Go, Perl, Ruby or Python.

Vote up!
0
Vote down!
0
Nishant Nawarkhede

Interesting. Really helpful.

Vote up!
0
Vote down!
0
agcatto

Hmm. The terminal command used to install PIL didn't work on my Mac (although this command was intended for Debian systems). For anyone running Mac, you can install the "friendly fork" of the PIL called "Pillow" (compatible with Python 3.0+ as well) using this command: sudo pip install Pillow
Perhaps we on Mac OSX are supposed to use this? :
apt-get install python-imaging

Vote up!
0
Vote down!
0