Введение
Работа с изображениями — ключевая часть многих проектов: от веб-разработки и генерации превью до машинного зрения и графических редакторов. Pillow, форк и преемник оригинальной библиотеки PIL (Python Imaging Library), является стандартом де-факто для работы с изображениями в Python.
Pillow прост в использовании, поддерживает десятки форматов, предоставляет богатый набор инструментов для редактирования, анализа и рендеринга изображений. В этом руководстве мы подробно разберём его возможности, API, примеры и рекомендации по работе с графикой.
Основная часть
Установка
pip install pillow
Открытие изображений
from PIL import Image
img = Image.open("example.jpg")
print(img.format, img.size, img.mode)
Сохранение изображений
img.save("output.png")
img.save("compressed.jpg", quality=85)
Изменение размеров, поворот, обрезка
resized = img.resize((300, 300))
rotated = img.rotate(45)
cropped = img.crop((100, 100, 400, 400))
Конвертация форматов и цветовых моделей
grayscale = img.convert("L") # черно-белое
rgba = img.convert("RGBA")
Рисование и добавление текста
from PIL import ImageDraw, ImageFont
img = Image.new("RGB", (500, 200), color=(255, 255, 255))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 40)
draw.text((10, 60), "Привет, мир!", font=font, fill=(0, 0, 0))
Применение фильтров
from PIL import ImageFilter
blurred = img.filter(ImageFilter.GaussianBlur(5))
sharpened = img.filter(ImageFilter.SHARPEN)
Слияние и наложение изображений
background = Image.open("bg.jpg")
overlay = Image.open("logo.png").convert("RGBA")
background.paste(overlay, (50, 50), overlay)
Анимации и работа с GIF
frames = [Image.open(f"frame_{i}.png") for i in range(5)]
frames[0].save("animated.gif", save_all=True, append_images=frames[1:], duration=300, loop=0)
Работа с пикселями
pixels = img.load()
for x in range(img.width):
for y in range(img.height):
r, g, b = pixels[x, y]
pixels[x, y] = (255 - r, 255 - g, 255 - b)
Поддерживаемые форматы
Формат | Поддержка чтения | Поддержка записи |
---|---|---|
JPEG | Да | Да |
PNG | Да | Да |
BMP | Да | Да |
GIF | Да | Да (анимация — частично) |
TIFF | Да | Да |
WebP | Да | Да |
Примеры применения
-
Генерация динамических баннеров и аватарок
-
Обработка изображений перед ML-моделью
-
Конвертация форматов и минификация
-
OCR-подготовка (предобработка для Tesseract)
-
Создание превью и водяных знаков
Сравнение с другими библиотеками
Библиотека | Основное назначение | Работа с текстом | Поддержка форматов |
Pillow | Общая обработка изображений | Да | Широкая |
OpenCV | Компьютерное зрение | Ограничено | Широкая |
imageio | Чтение/запись кадров и видео | Нет | Средняя |
Полный список функций и методов библиотеки Pillow
для Python, сгруппированных по категориям
Загрузка и сохранение изображений
Функция | Описание |
---|---|
Image.open(fp) |
Загружает изображение из файла или потока. |
Image.save(fp, format=None, ...) |
Сохраняет изображение в файл. Формат можно указать явно ("JPEG" , "PNG" и др.). |
Image.frombytes(mode, size, data) |
Создаёт изображение из сырых байтов. |
Image.fromarray(array) |
Преобразует NumPy-массив в изображение. |
Image.new(mode, size, color=0) |
Создаёт новое пустое изображение. |
Image.copy() |
Возвращает копию изображения. |
Получение информации
Атрибут / Метод | Описание |
---|---|
img.format |
Формат изображения (JPEG , PNG , и т.д.). |
img.mode |
Цветовой режим (RGB , RGBA , L , CMYK ). |
img.size |
Размер изображения (ширина, высота). |
img.info |
Метаданные изображения (EXIF, DPI и т.п.). |
img.getbands() |
Возвращает каналы изображения (R , G , B и т.д.). |
img.getpixel((x, y)) |
Возвращает цвет пикселя по координатам. |
img.histogram() |
Гистограмма изображения. |
Обработка изображений
Метод | Описание |
---|---|
img.resize(size, resample) |
Изменяет размер изображения. |
img.crop(box) |
Вырезает прямоугольную область. |
img.rotate(angle, expand=False) |
Поворачивает изображение. |
img.transpose(method) |
Зеркальные отражения, повороты (FLIP_LEFT_RIGHT , ROTATE_90 , и т.д.). |
img.paste(im, box) |
Вставляет другое изображение или цвет. |
img.convert(mode) |
Преобразует в другой цветовой режим (L , RGB , RGBA , и др.). |
img.filter(filter) |
Применяет фильтр (из модуля ImageFilter ). |
img.point(function) |
Преобразует значения пикселей через функцию. |
Рисование и текст
Функция / Класс | Описание |
---|---|
ImageDraw.Draw(img) |
Позволяет рисовать на изображении. |
draw.line(xy, fill, width) |
Рисует линию. |
draw.rectangle(xy, fill, outline) |
Рисует прямоугольник. |
draw.ellipse(xy, fill, outline) |
Рисует эллипс. |
draw.text((x, y), text, font, fill) |
Печатает текст. |
ImageFont.truetype(path, size) |
Загружает TrueType-шрифт для текста. |
Работа с альфа-каналом и масками
Функция | Описание |
---|---|
img.putalpha(alpha) |
Добавляет альфа-канал. |
img.split() |
Разбивает изображение на отдельные каналы. |
Image.merge(mode, bands) |
Объединяет каналы в одно изображение. |
img.putpixel((x, y), value) |
Устанавливает значение пикселя. |
Фильтры и улучшения
Фильтр / Класс | Описание |
---|---|
ImageFilter.BLUR |
Размытие. |
ImageFilter.CONTOUR |
Контур. |
ImageFilter.DETAIL |
Повышение детализации. |
ImageFilter.SHARPEN |
Резкость. |
ImageEnhance.Brightness(img).enhance(factor) |
Изменение яркости. |
ImageEnhance.Contrast(img).enhance(factor) |
Изменение контрастности. |
ImageEnhance.Color(img).enhance(factor) |
Изменение насыщенности. |
Сохранение в буфер и интеграция с другими библиотеками
Функция | Описание |
---|---|
BytesIO() |
Создание потока для хранения изображения в памяти. |
img.save(buffer, format="PNG") |
Сохраняет изображение в поток. |
Image.fromarray(numpy_array) |
Преобразует массив NumPy в изображение. |
numpy.array(img) |
Преобразует изображение в массив NumPy. |
Пример: изменение размера и наложение текста
Заключение
Pillow — универсальный инструмент для манипуляций с изображениями в Python. Он прост, гибок и покрывает широкий спектр задач: от элементарной обработки до генерации сложных изображений. Его используют в веб-приложениях, автоматизации, графических интерфейсах и нейросетевых пайплайнах.