Работа с графикой: Pillow, рисование, фильтрация, обрезка

Установка и начало работы с Pillow 🛠️

Pillow — это мощная библиотека для обработки изображений в Python. Она позволяет работать с графикой на профессиональном уровне. Давай начнём с установки:

pip install pillow

Импортируем необходимые модули:

from PIL import Image, ImageDraw, ImageFilter

Теперь можно загружать изображения:

image = Image.open("example.jpg")  # Открываем изображение
image.show()  # Показываем изображение

Основные операции с изображениями 🔄

Pillow позволяет легко выполнять базовые манипуляции:

# Изменение размера
resized_image = image.resize((300, 200))
resized_image.save("resized.jpg")

# Поворот изображения
rotated_image = image.rotate(45)  # Поворот на 45 градусов
rotated_image.save("rotated.jpg")

# Конвертация в чёрно-белое
grayscale_image = image.convert("L")
grayscale_image.save("grayscale.jpg")

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

Создадим новое изображение и нарисуем на нём:

# Создаём пустое изображение 400x400 с белым фоном
new_image = Image.new("RGB", (400, 400), "white")
draw = ImageDraw.Draw(new_image)

# Рисуем линию (от (50,50) до (350,350) красного цвета)
draw.line((50, 50, 350, 350), fill="red", width=5)

# Рисуем прямоугольник (синий контур)
draw.rectangle((100, 100, 300, 300), outline="blue", width=3)

# Рисуем текст (чёрный, размер 30)
draw.text((150, 150), "Hello Pillow!", fill="black", font_size=30)

new_image.save("drawing.png")
new_image.show()

Применение фильтров ✨

Pillow предлагает множество встроенных фильтров:

# Размытие
blurred = image.filter(ImageFilter.BLUR)
blurred.save("blurred.jpg")

# Контур
contour = image.filter(ImageFilter.CONTOUR)
contour.save("contour.jpg")

# Детализация
detail = image.filter(ImageFilter.DETAIL)
detail.save("detail.jpg")

Работа с областями изображения 🔍

Часто нужно работать только с частью изображения:

# Обрезка изображения (левый верхний и правый нижний углы)
cropped_image = image.crop((100, 100, 300, 300))
cropped_image.save("cropped.jpg")

# Можно объединять изображения
image1 = Image.open("image1.jpg")
image2 = Image.open("image2.jpg")
image1.paste(image2, (50, 50))  # Вставляем image2 в image1 в координаты (50,50)
image1.save("merged.jpg")

Пример практического применения: создание миниатюр 🖼️

Давай создадим функцию для генерации миниатюр:

def create_thumbnail(input_path, output_path, size=(128, 128)):
    try:
        img = Image.open(input_path)
        img.thumbnail(size)
        img.save(output_path)
        print(f"Миниатюра создана: {output_path}")
    except IOError:
        print("Не удалось создать миниатюру")

create_thumbnail("example.jpg", "thumbnail.jpg")

Этот код сохраняет изображение в уменьшенном размере, сохраняя пропорции.

Расширенные возможности: работа с прозрачностью и каналами 🌈

Pillow поддерживает работу с альфа-каналом:

# Создаём изображение с прозрачностью
transparent_img = Image.new("RGBA", (200, 200), (255, 0, 0, 128))  # Полупрозрачный красный
draw = ImageDraw.Draw(transparent_img)

# Рисуем прозрачный зелёный круг
draw.ellipse((50, 50, 150, 150), fill=(0, 255, 0, 128))
transparent_img.save("transparent.png")

# Разделение и объединение каналов
r, g, b = image.split()  # Разделяем на каналы
merged = Image.merge("RGB", (g, r, b))  # Меняем каналы местами
merged.save("swapped_channels.jpg")

Оптимизация производительности ⚡

При работе с большими изображениями важно учитывать производительность:

# Используем thumbnail вместо resize для сохранения пропорций
image.thumbnail((800, 800))  # Максимальные размеры 800x800

# Оптимизация при сохранении JPEG
image.save("optimized.jpg", quality=85, optimize=True)  # Качество 85% с оптимизацией

# Работа с большими изображениями по частям
for y in range(0, image.height, 100):
    for x in range(0, image.width, 100):
        box = (x, y, x+100, y+100)
        region = image.crop(box)
        # Обработка региона

Подведение итогов 🏁

Теперь ты знаешь основы работы с Pillow! Попробуй создать:

  1. Свои фильтры для изображений
  2. Водяные знаки для фотографий
  3. Коллажи из нескольких изображений

Для более глубокого изучения рекомендую канал Данилы Бежина: https://www.youtube.com/@DanilaBezhin, где ты найдёшь продвинутые техники работы с графикой в Python.

Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty