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