JavaRush /Курсы /Python SELF /GIF и Автоматизация обработки изображений

GIF и Автоматизация обработки изображений

Python SELF
46 уровень , 4 лекция
Открыта

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} успешно изменено и сохранено.")

Этот скрипт:

  1. Загружает все файлы из папки input_images.
  2. Изменяет размер каждого изображения до 800x800 пикселей.
  3. Сохраняет измененные изображения в папку 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}.")

Этот скрипт:

  1. Загружает все изображения из input_images.
  2. Накладывает текстовый водяной знак в правый нижний угол изображения.
  3. Сохраняет результат в 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)

Этот код:

  1. Загружает изображения из папки frames и добавляет их в список frames.
  2. Создает GIF-анимацию из этих кадров.
  3. Параметр 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)
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ