Используя библиотеку обработки изображений Pillow (PIL), в Python можно создать анимированные GIF изображения.
Содержание статьи
- Сохранение файла GIF в Python с помощью метода Image.save()
- Код для генерации анимированной картинки GIF в Python
- Параметры метода Image.save() в Python
- Параметр append_images метода Image.save() в Python
- Параметр optimize метода Image.save() в Python
- Параметр loop метода Image.save() в Python
- Параметр duration метода Image.save() в Python
В данной статье будут описаны следующие аспекты:
- Сохранение GIF с помощью метода
Image.save()
; - Создание кода для генерации анимированной GIF картинки;
- Параметры метода
Image.save()
:append_images
;optimize
;loop
;duration
.
Создание простого GIF из кадров
У нас есть 10 кадров с бегущим Гомером Симпсоном. Мы будем использовать их для создания одной целой гифки. Для удобства, можете скачать уже готовые zip архив с кадрами.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Скачать архив: homer.zip
Воспользуемся циклом for и range, чтобы открыть каждый кадр и добавить его объект в специальный список с кадрами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from PIL import Image # Список для хранения кадров. frames = [] for frame_number in range(1, 11): # Открываем изображение каждого кадра. frame = Image.open(f'homer/homer-{frame_number}.jpg') # Добавляем кадр в список с кадрами. frames.append(frame) # Берем первый кадр и в него добавляем оставшееся кадры. frames[0].save( 'homer.gif', save_all=True, append_images=frames[1:], # Срез который игнорирует первый кадр. optimize=True, duration=100, loop=0 ) |
Полученный результат:
Ниже мы обсудим каждый параметр от метода Image.save()
в частности, но давайте изменим время отображения каждого кадра по отдельности. Для этого нам нужно передать параметру duration список с целыми числами (время отображения в миллисекундах) для каждого кадра по отдельности.
1 2 3 4 5 6 7 8 |
frames[0].save( 'homer-random.gif', save_all=True, append_images=frames[1:], optimize=True, duration=[100, 150, 200, 400, 500, 600, 700, 800, 900, 1000], # Разное время отображения для кадров. loop=0 ) |
Вот результат, он еле заметен, но видно, что в самом начале Гомер шагает быстрее — так как первые три кадра имеют по 100, 200 и 200 миллисекунд на отображение.
Сохранение GIF с помощью метода Image.save()
В Python вы можете создать GIF картинку из нескольких изображений и сохранить ее, используя метод Image.save()
:
1 |
im.save('out.gif', save_all=True, append_images=[im1, im2, ...]) |
Список изображений [im1, im2, ...]
прикрепляются к изображению с первым кадром из переменой im
, затем генерируется и сохраняется анимированный файл GIF под названием out.gif
.
Ниже будет разобран пример кода с описанием всех параметров.
Генерации анимированной GIF картинки
Далее представлен код для рисования кругов, размер которых увеличивается, с помощью модуля ImageDraw
из библиотеки PIL и потом сохраняем гифу в файл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
from PIL import Image, ImageDraw images = [] width = 200 center = width // 2 color_1 = (0, 0, 0) color_2 = (255, 255, 255) max_radius = int(center * 1.5) step = 8 for i in range(0, max_radius, step): im = Image.new('RGB', (width, width), color_1) draw = ImageDraw.Draw(im) draw.ellipse((center - i, center - i, center + i, center + i), fill=color_2) images.append(im) for i in range(0, max_radius, step): im = Image.new('RGB', (width, width), color_2) draw = ImageDraw.Draw(im) draw.ellipse((center - i, center - i, center + i, center + i), fill=color_1) images.append(im) images[0].save( 'pillow_imagedraw.gif', save_all=True, append_images=images[1:], optimize=False, duration=40, loop=0 ) |
В результате генерируется вот такая GIF-ка.
Для получения более подробной информации о том, как рисовать геометрические фигуры в Python, можете ознакомиться со следующей статьей:
- Связанная статья: Рисуем геометрические фигуры в Python с помощью Pillow
Параметры метода Image.save()
В конечном итоге, если у вас есть список изображений, вы можете создать анимированную GIFку с помощью следующего кода:
1 2 3 4 5 6 7 8 |
images[0].save( 'pillow_imagedraw.gif', save_all=True, append_images=images[1:], optimize=False, duration=40, loop=0 ) |
Если вы хотите создать 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
указывает на время отображения на экране каждого кадра в миллисекундах. Если значение будет слишком маленьким, тогда оно будет проигнорировано.
Ему можно передать список с индивидуальной продолжительностью отображения для каждого кадра.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»