GIF-изображения в Pillow

Создание и редактирование GIF-анимаций с использованием Pillow

Графический формат GIF (Graphics Interchange Format) широко используется в интернете для создания анимированных изображений. Рассмотрим процесс создания, редактирования и управления GIF-изображениями с использованием библиотеки Pillow в Python, а также предоставим примеры использования.

Создание GIF-изображений

Pillow обеспечивает простой способ создания анимаций. Рассмотрим пример создания GIF:

from PIL import Image, ImageSequence

# Создание списка изображений для GIF
frames = [Image.open(image) for image in ['frame1.png', 'frame2.png', 'frame3.png', 'frame2.png', 'frame1.png']]


# Указываем длительность показа каждого кадра в миллисекундах
duration = 500  # 0.5 секунды для каждого кадра

# Сохраняем кадры как анимированный GIF
frames[0].save('output.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=duration, loop=0)

Этот пример показывает, как просто создать анимированный GIF из набора PNG-изображений с помощью Pillow. В последующих разделах статьи мы рассмотрим, как можно редактировать анимацию и управлять её характеристиками.

Набор изображений из которых мы создали GIF:

Результат:

Редактирование GIF

Перейдем к следующему шагу - редактированию существующих GIF-анимаций с помощью Pillow. Вот пример кода, который показывает, как можно извлекать кадры, изменять их, а затем собирать обратно в новую GIF-анимацию.

from PIL import Image, ImageSequence

# Открываем исходный GIF-файл
with Image.open('output.gif') as img:
    # Создаем список кадров из исходного GIF
    frames = [frame.copy() for frame in ImageSequence.Iterator(img)]


# Допустим, мы хотим изменить порядок кадров, добавить новый кадр и удалить последний
new_frame = Image.open('new_frame.png')

frames.insert(1, new_frame)  # Вставляем новый кадр как второй кадр

frames = frames[:-1]  # Удаляем последний кадр


# Сохраняем измененные кадры как новый GIF
frames[0].save('edited.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=500, loop=0)

Новый кадр:

Результат:

В этом примере мы извлекаем кадры из существующего GIF, изменяем порядок, добавляем новый кадр и удаляем последний кадр, после чего сохраняем все кадры как новую анимацию.

Теперь давайте рассмотрим, как можно управлять скоростью анимации:

from PIL import Image, ImageSequence

# Открываем исходный GIF-файл
with Image.open('output.gif') as img:
    # Создаем список кадров из исходного GIF
    frames = [frame.copy() for frame in ImageSequence.Iterator(img)]

# Устанавливаем другую задержку для кадров (100 мс вместо 500 мс)
frames[0].save('faster.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=100, loop=0)

Результат:

Здесь мы уменьшили время задержки между кадрами, что приведет к увеличению скорости анимации.

И последний пример для продвинутых техник работы с GIF-изображениями:

from PIL import Image, ImageOps, ImageSequence

# Открываем исходный GIF-файл
with Image.open('output.gif') as img:
    # Создаем список кадров из исходного GIF, обрабатываем каждый кадр
    frames = [ImageOps.grayscale(frame) for frame in ImageSequence.Iterator(img)]

# Сохраняем кадры как черно-белый GIF
frames[0].save('grayscale.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=500, loop=0)

Результат:

В этом фрагменте кода мы конвертируем каждый кадр анимации в черно-белый формат и сохраняем их как новый GIF.

Это базовые примеры того, как можно использовать Pillow для работы с GIF-изображениями в Python.

Заключение

Библиотека Pillow предоставляет обширные возможности для создания, редактирования и управления GIF-изображениями. Используйте вышеописанные методы, экспериментируйте с параметрами и давайте жизнь вашим анимациям!

Содержание: