Работа с графикой: 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! Попробуй создать:
- Свои фильтры для изображений
- Водяные знаки для фотографий
- Коллажи из нескольких изображений
Для более глубокого изучения рекомендую канал Данилы Бежина: https://www.youtube.com/@DanilaBezhin, где ты найдёшь продвинутые техники работы с графикой в Python.