1. Автоматизация пакетной обработки изображений
Пакетная обработка изображений позволяет выполнять одинаковые действия на большом количестве файлов, что экономит время и усилия. Например, если у вас есть каталог изображений, которым нужно изменить размер или наложить водяной знак, Pillow позволяет создать один скрипт, который применит операции ко всем изображениям.
Изменение размера всех изображений в папке
В этом примере мы изменим размер всех изображений в папке input_images и сохраним результаты в папку output_images.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# Убедимся, что папка для сохранения изображений существует
os.makedirs(output_folder, exist_ok=True)
# Проходим по каждому файлу в папке input_folder
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Открываем изображение и изменяем его размер
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# Сохраняем изображение
resized_img.save(output_path)
print(f"Изображение {filename} успешно изменено и сохранено.")
Этот скрипт:
- Загружает все файлы из папки
input_images. - Изменяет размер каждого изображения до 800x800 пикселей.
- Сохраняет измененные изображения в папку
output_images.
Наложение водяного знака на изображения
Наложение водяного знака на все изображения в папке можно легко автоматизировать. В этом примере добавляется текстовый водяной знак в правый нижний угол каждого изображения.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# Убедимся, что папка для сохранения изображений существует
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Открываем изображение и создаем объект для рисования
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# Позиция для водяного знака
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# Добавляем водяной знак
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f"Водяной знак добавлен на изображение {filename}.")
Этот скрипт:
- Загружает все изображения из
input_images. - Накладывает текстовый водяной знак в правый нижний угол изображения.
- Сохраняет результат в
watermarked_images.
Конвертация изображений в формат PNG
Конвертация всех изображений в один формат также легко автоматизируется. В этом примере конвертируем все изображения из папки в формат PNG.
input_folder = "input_images/"
output_folder = "png_images/"
# Убедимся, что папка для сохранения изображений существует
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".bmp", ".tiff")):
image_path = os.path.join(input_folder, filename)
# Открываем и конвертируем изображение в PNG
with Image.open(image_path) as img:
base_filename = os.path.splitext(filename)[0]
output_path = os.path.join(output_folder, f"{base_filename}.png")
img.save(output_path, "PNG")
print(f"Изображение {filename} успешно конвертировано в PNG.")
Этот скрипт конвертирует изображения из форматов JPEG, BMP и TIFF в PNG, сохраняя их в папке png_images.
2. Работа с GIF-анимациями
GIF-анимации представляют собой последовательность изображений, которые показываются поочередно, создавая эффект движения. С помощью Pillow можно создавать и редактировать GIF-анимации, добавлять и изменять кадры, а также управлять скоростью анимации.
Создание простой GIF-анимации
Чтобы создать GIF-анимацию, нужно подготовить несколько изображений (кадров), которые будут показаны последовательно. В этом примере создаем GIF из изображений в папке frames.
# Список изображений для анимации
frames_folder = "frames/"
frames = []
for filename in sorted(os.listdir(frames_folder)):
if filename.endswith((".png", ".jpg")):
frame_path = os.path.join(frames_folder, filename)
frame = Image.open(frame_path)
frames.append(frame)
# Сохранение кадров в GIF-анимацию
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Этот код:
- Загружает изображения из папки
framesи добавляет их в списокframes. - Создает GIF-анимацию из этих кадров.
- Параметр
duration=100указывает продолжительность показа каждого кадра в миллисекундах, аloop=0задает бесконечный цикл воспроизведения.
Изменение скорости анимации GIF
Чтобы изменить скорость анимации, просто измените значение параметра duration.
# Создание анимации с увеличенной скоростью
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
В этом примере duration=50, что ускоряет воспроизведение GIF в два раза.
Добавление новых кадров в существующий GIF
Вы также можете открыть существующий GIF, добавить к нему новые кадры и сохранить обновленную анимацию.
# Открытие существующего GIF
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# Добавление нового кадра
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# Сохранение обновленной анимации
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Этот код добавляет новый кадр new_frame.png в конец анимации.
Извлечение кадров из GIF-анимации
Иногда нужно разделить GIF-анимацию на отдельные кадры. Pillow позволяет извлекать и сохранять каждый кадр отдельно.
from PIL import ImageSequence
# Открытие GIF-анимации и извлечение кадров
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
Этот код сохраняет каждый кадр из анимации в виде отдельного изображения PNG.
Пример полной работы с GIF-анимацией и пакетной обработкой
В заключение приведем пример, в котором объединяются автоматизация пакетной обработки и работа с GIF. Мы создаем анимацию из всех изображений в папке, изменяя размер каждого кадра перед добавлением.
# Загрузка изображений, изменение их размера и создание GIF
input_folder = "input_images/"
frames = []
new_size = (400, 400)
for filename in sorted(os.listdir(input_folder)):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:
resized_frame = img.resize(new_size)
frames.append(resized_frame)
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ