Создание GIF анимации в Python

Создание GIF в Python

Используя библиотеку обработки изображений Pillow (PIL), в Python можно создать анимированные GIF изображения.

Содержание статьи

В данной статье будут описаны следующие аспекты:

  • Сохранение GIF с помощью метода Image.save();
  • Создание кода для генерации анимированной GIF картинки;
  • Параметры метода Image.save():
    • append_images;
    • optimize;
    • loop;
    • duration.

Создание простого GIF из кадров

У нас есть 10 кадров с бегущим Гомером Симпсоном. Мы будем использовать их для создания одной целой гифки. Для удобства, можете скачать уже готовые zip архив с кадрами.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Создание GIF анимации в Python Создание GIF анимации в Python Создание GIF анимации в Python
Создание GIF анимации в Python Создание GIF анимации в Python Создание GIF анимации в Python
Создание GIF анимации в Python Создание GIF анимации в Python Создание GIF анимации в Python
Создание GIF анимации в Python

Скачать архив: homer.zip

Воспользуемся циклом for и range, чтобы открыть каждый кадр и добавить его объект в специальный список с кадрами.

Полученный результат:

Создание GIF анимации в Python

Ниже мы обсудим каждый параметр от метода Image.save() в частности, но давайте изменим время отображения каждого кадра по отдельности. Для этого нам нужно передать параметру duration список с целыми числами (время отображения в миллисекундах) для каждого кадра по отдельности.

Вот результат, он еле заметен, но видно, что в самом начале Гомер шагает быстрее — так как первые три кадра имеют по 100, 200 и 200 миллисекунд на отображение.

Создание GIF анимации в Python

Сохранение GIF с помощью метода Image.save()

В Python вы можете создать GIF картинку из нескольких изображений и сохранить ее, используя метод Image.save():

Список изображений [im1, im2, ...] прикрепляются к изображению с первым кадром из переменой im, затем генерируется и сохраняется анимированный файл GIF под названием out.gif.

Ниже будет разобран пример кода с описанием всех параметров.

Генерации анимированной GIF картинки

Далее представлен код для рисования кругов, размер которых увеличивается, с помощью модуля ImageDraw из библиотеки PIL и потом сохраняем гифу в файл.

В результате генерируется вот такая GIF-ка.

создание gif в python

Для получения более подробной информации о том, как рисовать геометрические фигуры в Python, можете ознакомиться со следующей статьей:

Параметры метода Image.save()

В конечном итоге, если у вас есть список изображений, вы можете создать анимированную GIFку с помощью следующего кода:

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

Параметр append_images метода Image.save()

Вызываем метод save() и передаем список с другими изображениями параметру append_images.

Обратите внимание, что если вы напишите append_images=images, первый кадр будет повторяться дважды. В примере выше вторая и последующие картинки выбираются через срез images[1:].

Параметр optimize метода Image.save()

Если данный параметр указан как True, тогда Pillow попытается сжать палитру, удалив неиспользуемые цвета. Тем самым вес нашего изображения будет меньше.

Параметр loop метода Image.save()

Параметр loop указывает количество циклов которое будет выполнять наше GIF анимация. Если указать значение loop=0, цикл становится бесконечным.

Обратите внимание, что по умолчанию анимация закончится через один цикл. Так, что лучше всего задать значение 0.

Параметр duration метода Image.save()

Параметр duration указывает на время отображения на экране каждого кадра в миллисекундах. Если значение будет слишком маленьким, тогда оно будет проигнорировано.

Ему можно передать список с индивидуальной продолжительностью отображения для каждого кадра.