Основные возможности 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.