In the dynamic world of Python development, image processing stands as a critical capability, enabling everything from web application asset management to scientific data visualization and machine learning preprocessing. At the heart of Python’s image manipulation ecosystem lies the Python Imaging Library, or PIL. However, for modern Python users, the true workhorse is its successor and actively maintained fork, Pillow. This guide delves into the essential steps for installing Pillow, ensuring your Python environment is equipped for powerful image operations.
Understanding PIL and Pillow: The Evolution of Image Processing in Python
Before diving into the installation process, it’s crucial to understand the relationship between PIL and Pillow. This foundational knowledge will clarify why Pillow is the go-to library for contemporary Python projects.

The Legacy of PIL (Python Imaging Library)
The original Python Imaging Library (PIL) was a groundbreaking addition to Python, first released in 1995. It provided robust image processing capabilities, allowing developers to open, manipulate, and save various image file formats. For many years, PIL was the undisputed standard for working with images in Python, earning its place as a staple in countless projects.
However, as Python evolved, particularly with the transition from Python 2 to Python 3, PIL’s development stalled. Its last official release was in 2009, and it never received full support for Python 3. This lack of maintenance and incompatibility with newer Python versions presented a significant hurdle for developers looking to build modern, future-proof applications. The community desperately needed an updated, actively maintained alternative.
Embracing Pillow: The Modern Standard
Enter Pillow. Pillow is a friendly fork of the original PIL library, created to provide continued development, bug fixes, and crucially, Python 3 compatibility. It maintains a high degree of API compatibility with PIL, making the transition for existing projects relatively straightforward. Today, when developers refer to “PIL” in a modern Python context, they almost invariably mean Pillow.
Pillow offers a multitude of advantages over its predecessor:
-
Python 3 Support: Full compatibility with Python 3.x versions, making it relevant for all current development.
-
Active Maintenance: Regular updates, bug fixes, and new features from a dedicated community.
-
Improved Build System: Easier installation across various operating systems, often resolving common build issues that plagued the original PIL.
-
Expanded Format Support: Continuous improvements in handling a wider array of image formats.
-
Performance Enhancements: Optimizations for faster image processing.
For these reasons, it is highly recommended that all new and existing Python projects requiring image manipulation capabilities use Pillow. Installing Pillow effectively means installing the modern, functional equivalent of PIL.
Preparing Your Environment for Pillow Installation
A smooth installation process often begins with proper environmental preparation. Taking a few moments to set up your Python environment correctly can prevent common pitfalls and ensure a stable development experience.
Python Installation and Virtual Environments
The primary prerequisite for installing Pillow is, naturally, a working Python installation. Pillow supports Python 3.7 and newer. You can check your Python version by opening a terminal or command prompt and typing:
python --version
or
python3 --version
If Python is not installed or your version is too old, visit the official Python website (python.org) to download and install the latest stable release.
Crucially, it is best practice to install Python packages, including Pillow, within a virtual environment. Virtual environments create isolated Python environments for your projects, preventing conflicts between different package versions required by different projects. This practice keeps your global Python installation clean and ensures project dependencies are self-contained.
To create and activate a virtual environment (using Python’s built-in venv module):
-
Navigate to your project directory:
cd my_project_directory -
Create a virtual environment (named
venvby convention):python -m venv venv -
Activate the virtual environment:
-
On macOS/Linux:
source venv/bin/activate -
On Windows (Command Prompt):
venvScriptsactivate.bat -
On Windows (PowerShell):
venvScriptsActivate.ps1
Once activated, your terminal prompt will usually show
(venv)indicating you are inside the virtual environment. -
Essential System Dependencies (For Advanced Users/Troubleshooting)
While pip (Python’s package installer) often handles many complexities, Pillow, being an image processing library, relies on underlying system libraries to support various image formats (like JPEG, PNG, TIFF, WebP, etc.). For most users, pip install Pillow will automatically download pre-compiled binary wheels that include these dependencies, making manual installation unnecessary.
However, if you encounter errors during installation, particularly “build failed” messages related to missing encoders/decoders, you might need to manually install these system libraries. The specific commands vary by operating system:
-
Debian/Ubuntu (Linux):
sudo apt-get update sudo apt-get install libjpeg-dev zlib1g-dev libtiff-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl-dev tk-dev python3-tk -
Fedora/RHEL/CentOS (Linux):
sudo dnf install libjpeg-devel zlib-devel libtiff-devel freetype-devel lcms2-devel libwebp-devel tkinter -
macOS (using Homebrew):
brew install libjpeg zlib libtiff webp little-cms2 freetype -
Windows: On Windows, it’s highly recommended to use the official Python installers, which include
pipconfigured to download pre-compiled wheels for Pillow. These wheels bundle the necessary C libraries, usually eliminating the need for manual system-level installations. If you’re building from source on Windows (rare for Pillow), you’d need to install a C compiler (like Visual Studio Build Tools).
Only proceed with installing these system dependencies if your pip install Pillow command fails with specific errors indicating missing libraries.
The Standard Installation Method: Using Pip
With your environment prepared, installing Pillow is typically a straightforward one-liner using pip.
Basic Installation Command
Ensure your virtual environment is activated, then run:
pip install Pillow
Pip will connect to the Python Package Index (PyPI), download the latest stable version of Pillow (usually a pre-compiled wheel for your system), and install it. You’ll see output indicating the download progress, potentially a build step if a wheel isn’t available for your exact configuration (less common now), and finally, a success message.
Upgrading an Existing Installation
If you already have Pillow installed and want to upgrade to the latest version (e.g., for new features, bug fixes, or security patches), use the --upgrade flag:
pip install --upgrade Pillow
This command will check the installed version against the latest available on PyPI and upgrade it if a newer version exists.

Installing Specific Versions
Occasionally, you might need to install a specific version of Pillow, perhaps to ensure compatibility with an older project or to replicate a known working environment. You can do this by specifying the version number:
pip install Pillow==9.5.0 # Replace with your desired version
This command will install exactly version 9.5.0 of Pillow. You can find available versions on Pillow’s page on PyPI.
Verifying the Installation
After installation, it’s good practice to verify that Pillow is correctly installed and accessible within your Python environment.
-
Check installed packages with
pip:pip listYou should see
Pillowlisted along with its version number. -
Run a simple Python script:
Create a file named
check_pillow.pywith the following content:import PIL from PIL import Image import sys print(f"Pillow version: {PIL.__version__}") print(f"Python version: {sys.version}") try:# Try to create a simple image to test functionality img = Image.new('RGB', (100, 100), color = 'red') img.save('test_image.png') print("Pillow installed successfully and can create images.")except Exception as e:
print(f"Error testing Pillow functionality: {e}")Run this script from your terminal (with the virtual environment activated):
python check_pillow.pyIf successful, you should see the Pillow version printed, and a
test_image.pngfile created in your directory.
Common Issues and Troubleshooting During Installation
While Pillow installation is usually smooth, issues can arise. Here’s how to address some common problems.
“Command pip not found” or pip issues
-
Problem: Your system doesn’t recognize
pip. -
Solution: Ensure Python is correctly installed and its
Scripts(Windows) orbin(macOS/Linux) directory is in your system’s PATH. Alternatively, you can always invokepipusing thepython -msyntax, which uses thepipmodule associated with your current Python interpreter:python -m pip install Pillow
Build Failures and Missing Dependencies
-
Problem: Installation fails with errors indicating missing C headers or libraries (e.g.,
libjpeg,zlib,freetype). This happens whenpipcan’t find a pre-compiled wheel for your system or Python version and attempts to compile Pillow from source, but the necessary development tools or system libraries are absent. -
Solution: Refer back to the “Essential System Dependencies” section. Install the development packages for
libjpeg,zlib,libtiff,freetype, etc., using your operating system’s package manager (apt,dnf,brew). For Windows, ensure you are using an official Python installer, which typically ensures compatible pre-compiled wheels are used.
Permissions Errors
-
Problem:
pip install Pillowresults in “Permission denied” errors. This often occurs when you try to install packages globally (outside a virtual environment) without sufficient permissions. -
Solution: Never use
sudo pip install(on Linux/macOS) unless you explicitly understand the implications and absolutely need to install globally (which is highly discouraged). The best solution is to always use a virtual environment, which gives you full control over package installations without needing root privileges. If, for some reason, a virtual environment isn’t an option, you can trypip install --user Pillowto install the package to your user-specific site-packages directory.
Conflicts with Classic PIL
-
Problem: Very old environments might have the classic
PILlibrary installed, which can conflict with Pillow. -
Solution: If you suspect a conflict, you should uninstall the old
PILpackage before installing Pillow:pip uninstall PIL pip install PillowNote: It’s rare to encounter
PILin modern Python 3 environments, as it was primarily for Python 2.
Getting Started with Pillow: A Quick Test Drive
Once Pillow is successfully installed, you can immediately begin leveraging its powerful features. Here’s a brief example to get you started:
from PIL import Image, ImageFilter
# 1. Open an image
try:
img = Image.open("input_image.jpg") # Replace with your image file
print(f"Original image size: {img.size}")
print(f"Original image format: {img.format}")
# 2. Basic image operations
# Resize the image
resized_img = img.resize((300, 200))
resized_img.save("resized_image.jpg")
print(f"Resized image saved: resized_image.jpg (Size: {resized_img.size})")
# Convert to grayscale
grayscale_img = img.convert("L")
grayscale_img.save("grayscale_image.jpg")
print("Grayscale image saved: grayscale_image.jpg")
# Apply a blur filter
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save("blurred_image.jpg")
print("Blurred image saved: blurred_image.jpg")
# Crop a portion of the image (left, upper, right, lower)
cropped_img = img.crop((100, 100, 400, 400))
cropped_img.save("cropped_image.jpg")
print("Cropped image saved: cropped_image.jpg")
# Create a new image from scratch
new_img = Image.new('RGB', (800, 600), color = 'green')
new_img.save('new_green_image.png')
print("New green image created: new_green_image.png")
# Show the original image (requires an image viewer installed)
# img.show()
except FileNotFoundError:
print("Error: 'input_image.jpg' not found. Please create or provide an image file.")
except Exception as e:
print(f"An error occurred: {e}")
Save this code as a Python file (e.g., pillow_demo.py), place an image file named input_image.jpg in the same directory, and run it. You’ll see new images generated, demonstrating Pillow’s capabilities.

Conclusion
Installing Pillow (the modern iteration of PIL) is an indispensable step for any Python developer needing robust image processing functionalities. By understanding its role as the active successor to the original PIL, preparing your environment with virtual environments, and utilizing pip for installation, you can quickly equip your projects with powerful image manipulation tools. While troubleshooting may occasionally be required, the steps outlined above cover the most common scenarios, ensuring a smooth setup. With Pillow successfully installed, you’re ready to unlock a world of possibilities, from simple resizing and format conversions to complex image analysis and generative art. Embrace Pillow, and elevate your Python image processing endeavors. For deeper dives, always consult the official Pillow documentation for the latest features and advanced usage patterns.
