Python
March 26

Основные возможности PIL (Pillow): работа с изображениями в Python

Pillow, проект-форк оригинальной библиотеки Python Imaging Library (PIL), является мощным инструментом для работы с изображениями в Python. Эта библиотека предлагает широкий спектр возможностей, от базовых операций с изображениями, таких как открытие, сохранение и отображение, до сложных манипуляций — масштабирование, обрезка, фильтрация и многое другое. Давайте рассмотрим наиболее часто используемые возможности Pillow и примеры их применения.

Открытие и сохранение изображений

Базовая операция с изображениями — их открытие и сохранение. Pillow поддерживает множество форматов, включая популярные JPEG, PNG и GIF.

from PIL import Image

# Открытие изображения
img = Image.open("path/to/image.jpg")

# Сохранение изображения в другом формате
img.save("path/to/new_image.png")
Чем это изображение отличается от предыдущего?

Манипуляции с размерами

Изменение размеров изображения — еще одна распространенная задача. Можно уменьшить или увеличить изображение, сохранив его пропорции или задав новые.

from PIL import Image

# Открытие изображения
img = Image.open("path/to/image.jpg")

# Обрезка изображения
new_img = img.resize((300, 300))
new_img.save("path/to/image_300x300.jpg")

Результат обрезки

Поворот и отражение

Pillow позволяет легко поворачивать и отражать изображения, что открывает дополнительные возможности для их обработки.

from PIL import Image
# Открытие изображения
img = Image.open("path/to/image.jpg")
# Поворот на 90 градусов
rotated_img = img.rotate(90)

# Отражение по горизонтали
flipped_img = rotated_img.transpose(Image.FLIP_LEFT_RIGHT)
flipped_img.save("path/to/image_flipped_rotated.jpg")

Работа с цветом

С Pillow можно изменять цветовые каналы изображения, применять к нему фильтры и выполнять цветокоррекцию.

from PIL import Image, ImageFilter
# Открытие изображения
img = Image.open("path/to/image.jpg")

# Конвертация в черно-белое
bw_img = img.convert("L")

# Применение фильтра (например, размытие)
blurred_img = bw_img.filter(ImageFilter.BLUR)
blurred_img.save("path/to/image_blurred_converted.jpg")

Получение размера изображения

Вам нужно сначала загрузить или открыть изображение, а затем использовать атрибут .size объекта изображения. Атрибут .size возвращает кортеж, содержащий ширину и высоту изображения в пикселях.

Вот простой пример, показывающий, как это делается:

from PIL import Image
# Открытие изображения
img = Image.open("path/to/image.jpg")
# Получение размера изображения
width, height = img.size
print(f"Ширина изображения: {width} пикселей")
print(f"Высота изображения: {height} пикселей")

Рисование на изображении

Библиотека предлагает инструменты для рисования на изображениях, такие как рисование текста, линий, кругов и других фигур.

from PIL import Image, ImageDraw, ImageFont

img = Image.open("path/to/image.jpg")

draw = ImageDraw.Draw(img)
font = ImageFont.truetype("path/to/font.ttf", 80)
draw.text((800, 200), "Cat", fill="white", font=font)
img.save("path/to/image_with_text.jpg")

Задание: попробуйте добавить надпись прямо по центру изображения.

Работа с метаданными

Pillow также позволяет читать и редактировать метаданные изображения, включая EXIF-данные, хранящиеся в файлах JPEG.

from PIL import Image

img = Image.open("path/to/image.jpg")

exif_data = img._getexif()
print(exif_data)  # "сырой" словарь с данными

Для получения данных EXIF из изображения и их преобразование в читаемый формат, вам потребуется выполнить несколько шагов. Данные EXIF хранятся в формате словаря, где ключи — это идентификаторы тегов EXIF, а значения — это соответствующие значения данных. Вот как вы можете извлечь и прочитать данные EXIF из изображения:

import sys

from PIL import Image
from PIL.ExifTags import TAGS

# Открытие изображения
img = Image.open("/home/user/Изображения/it_and_cats/cat_eyes.jpg")

# Получение данных EXIF
exif_data = img._getexif()

# Проверка, есть ли данные EXIF
if not exif_data:
    print("Изображение не содержит данных EXIF.")
    sys.exit(-1)  # выходим из программы с ошибкой
    
# Преобразование EXIF данных в читаемый формат
readable_exif = {TAGS.get(tag): value for tag, value in exif_data.items() if tag in TAGS}

# Вывод данных EXIF
for tag, value in readable_exif.items():
    print(f"{tag}: {value}")

Этот код сначала извлекает словарь с данными EXIF с помощью метода _getexif(). Затем он использует словарь TAGS из модуля PIL.ExifTags, который содержит человекочитаемые названия для большинства стандартных тегов EXIF. Цикл for перебирает элементы в словаре EXIF, преобразуя их в читаемый формат с использованием TAGS.get(tag), и выводит их.

Обратите внимание, что метод _getexif() является неофициальным и не документированным, поэтому в будущих версиях Pillow его поведение может измениться. Также стоит отметить, что не все изображения содержат данные EXIF, поэтому перед их использованием рекомендуется проверять наличие этих данных в изображении.

Заключение

Pillow — это невероятно мощная и гибкая библиотека для работы с изображениями в Python, подходящая как для простых задач, таких как изменение размеров или формата изображения, так и для более сложных операций, включая обработку и анализ изображений. Благодаря широкой поддержке форматов, простоте использования и большому количеству доступных функций, Pillow стала стандартом де-факто в области обработки изображений на Python.