Python ModulesPillow TutorialFile Handling with Pillow

File Handling with Pillow

Pillow supports a wide range of file formats, making it versatile for reading, writing, and managing images. This guide covers handling common and large image files efficiently.


Reading Images from Different Formats

Pillow can open images in formats like JPEG, PNG, BMP, GIF, TIFF, and more using the Image.open() method.

Example: Reading an Image

from PIL import Image
 
# Open an image file
img = Image.open("example.jpg")
 
# Display image format and size
print(f"Format: {img.format}")
print(f"Size: {img.size}")
img.show()

Supported formats:

  • JPEG (.jpg, .jpeg)
  • PNG (.png)
  • BMP (.bmp)
  • GIF (.gif)
  • TIFF (.tiff)

Writing Images to Various Formats

The save() method allows saving images in different formats. Ensure the format is supported by Pillow.

Example: Saving an Image

# Save the image in another format
img.save("example.png")

Example: Saving with Custom Options

# Save with quality and optimization
img.save("example_optimized.jpg", quality=85, optimize=True)

Handling Large Image Files

Large images can consume significant memory. Pillow offers methods to handle such files efficiently.

Example: Reducing Image Size

Use the thumbnail() method to resize large images while maintaining aspect ratio.

# Create a thumbnail
img.thumbnail((800, 800))
img.save("example_thumbnail.jpg")

Example: Loading Images Lazily

Open images in draft mode for lower resolution.

# Open image in draft mode
img = Image.open("large_image.jpg")
img.draft("RGB", (800, 800))
print(f"Draft size: {img.size}")
img.show()

Example: Converting to Grayscale to Reduce Size

# Convert to grayscale
img_gray = img.convert("L")
img_gray.save("example_gray.jpg")

Practical Applications

Example 1: Batch Conversion of Image Formats

Convert all .png files in a folder to .jpg.

import os
from PIL import Image
 
input_folder = "images/pngs"
output_folder = "images/jpgs"
os.makedirs(output_folder, exist_ok=True)
 
for filename in os.listdir(input_folder):
    if filename.endswith(".png"):
        img = Image.open(os.path.join(input_folder, filename))
        output_file = os.path.join(output_folder, filename.replace(".png", ".jpg"))
        img.save(output_file)

Example 2: Extracting and Saving Image Metadata

# Extract metadata and save it
exif_data = img.getexif()
with open("metadata.txt", "w") as f:
    for tag, value in exif_data.items():
        tag_name = Image.ExifTags.TAGS.get(tag, tag)
        f.write(f"{tag_name}: {value}\n")

Try It Yourself

Problem 1: Resize and Save Multiple Images

Write a script to resize all images in a folder to 600x600 pixels and save them in a new folder.

Show Solution
import os
from PIL import Image
 
input_folder = "images"
output_folder = "resized_images"
os.makedirs(output_folder, exist_ok=True)
 
for filename in os.listdir(input_folder):
    if filename.endswith(('.jpg', '.png')):
        img = Image.open(os.path.join(input_folder, filename))
        img.thumbnail((600, 600))
        img.save(os.path.join(output_folder, filename))

Problem 2: Convert Images to Grayscale

Write a script to convert all .jpg images in a folder to grayscale and save them with a _gray suffix.

Show Solution
import os
from PIL import Image
 
input_folder = "images"
os.makedirs("grayscale_images", exist_ok=True)
 
for filename in os.listdir(input_folder):
    if filename.endswith(".jpg"):
        img = Image.open(os.path.join(input_folder, filename)).convert("L")
        new_filename = os.path.join("grayscale_images", filename.replace(".jpg", "_gray.jpg"))
        img.save(new_filename)

Pillow’s robust file handling features make it an excellent tool for managing image formats and efficiently working with large files. Start experimenting to streamline your workflows!