Создание видео или GIF из изображений в Python: руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам необходимо быстро создать анимированные GIF или видео на Python, воспользуйтесь библиотекой imageio. Установить её можно командой pip install imageio. Ниже приведен пример, как создать GIF из набора изображений:

Python
Скопировать код
import imageio

images = ['image1.png', 'image2.png', ...]  # Список изображений
with imageio.get_writer('animation.gif', mode='I') as writer:
    for img in images:
        writer.append_data(imageio.imread(img))  # Добавление каждого изображения в отдельности

Если вместо создания анимированного GIF вы планируете создавать видео, замените строку 'animation.gif' на 'video.mp4'. Для управления частотой кадров используйте параметр fps в методе get_writer. Не забудьте установить FFmpeg (pip install imageio[ffmpeg]), чтобы работать с видео.

Кинга Идем в IT: пошаговый план для смены профессии

Дополнительная информация

Работа с большим набором изображений

Если вы работаете с большим количеством изображений, стоит задуматься о экономии памяти и времени обработки. В этом может помочь "ленивая" загрузка, используемая, например, в Image.open из библиотеки PIL.

Python
Скопировать код
from PIL import Image
images = ['image1.png', 'image2.png', ...]  # Список изображений
with imageio.get_writer('animation.gif', mode='I', fps=20) as writer:
    for img in images:
        with Image.open(img) as im:
            writer.append_data(np.array(im))  # Последовательная запись изображений

Сортировка изображений

Для того чтобы ваше видео или анимированный GIF воспроизводились в нужном порядке, важно правильно сортировать изображения. Для этого можно воспользоваться функцией glob.glob и методом сортировки.

Python
Скопировать код
import glob

image_paths = sorted(glob.glob('images/*.png')) 
# Теперь изображения идут в правильной последовательности

Контроль длительности каждого кадра

Для различных сцен в GIF могут требоваться разные временные рамки. Для управления временем показа каждого кадра используйте параметр duration в методе append_data.

Python
Скопировать код
frame_durations = [0\.2, 0.1, ...]  # Время показа каждого кадра

with imageio.get_writer('animation.gif', mode='I') as writer:
    for img, duration in zip(images, frame_durations):
        image = imageio.imread(img)
        writer.append_data(image, duration=duration)  # Управление временем показа каждого кадра

Улучшаем качество ваших GIF

Важность высокого качества

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

Python
Скопировать код
from PIL import ImageSequence, Image

with Image.open('source.gif') as im:
    frames = [frame.copy() for frame in ImageSequence.Iterator(im)]
frames = [np.array(frame.convert('RGBA')) for frame in frames]
imageio.mimsave('high_quality.gif', frames, 'GIF', fps=5)  # Создание GIF высокого качества

Борьба за объем файла!

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

Python
Скопировать код
from PIL import Image

# Сжатие изображений до ширины 640px, с сохранением пропорций
resized_images = []
for img in images:
    with Image.open(img) as im:
        im.thumbnail((640, im.size[1]))
        resized_images.append(im)

# Преобразование в массивы numpy и создание GIF меньшего размера с помощью imageio
frames = [np.array(img.convert('RGBA')) for img in resized_images]
imageio.mimsave('resized_animation.gif', frames, 'GIF', fps=5)  # Создание GIF меньшего размера

Визуализация

К процессу создания видео или GIF в Python можно подходить как к организации кукольного театра:

ЭтапКукольное театральное представление
Выбор изображенийВыбор кукол 🎭
Настройка продолжительности кадровРепетиция сцен ⏱️
Упорядочивание и сортировка кадровПостановка сцен 🎬
Запись и сохранениеФинальные аплодисменты и завершение представления 📽️

Каждый кадр оживляет следующую сцену!

Python
Скопировать код
import imageio

# Начинаем кукольное представление 🎭
with imageio.get_writer('puppet_show.gif', mode='I', duration=0.2) as writer:
    for frame in puppet_frames:
        writer.append_data(frame)  # Воплощение каждой сцены 🎬
# И... конец спектакля! 📽️

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

Дополнительные инструменты

Волшебство командной строки!

Использование convert из пакета ImageMagick в командной строке дает дополнительные возможности для создания и настройки GIF.

Bash
Скопировать код
convert -delay 20 -loop 0 frame0.png frame1.png frame2.png animation.gif

Просто убедитесь, что ImageMagick установлен на вашем компьютере.

Возможности Pillow

Библиотека Python Pillow дает дополнительные функции для управления повторами проигрывания и цветовым дизерингом при создании GIF, что может быть полезно.

Python
Скопировать код
from PIL import ImageSequence, GifImagePlugin

with Image.open('source.gif') as im:
    im.info['loop'] = 0  # Бесконечное проигрывание
    im.save('looping.gif', 'GIF', save_all=True, dither="None")  # Отключение цветового дизеринга при сохранении

Полезные материалы

  1. Документация Pillow (PIL Fork) — полный разбор функционала для работы с изображениями на Python.
  2. Руководство пользователя MoviePy — обзор инструментов для редактирования видео на Python.
  3. Документация imageio — подробное руководство по созданию анимаций на Python.
  4. matplotlib.animation в документации Matplotlib — пошаговая инструкция по созданию анимаций в Python с помощью matplotlib.
  5. Обсуждение создания видео и GIF на Python на Stack Overflow — полезные советы от сообщества разработчиков.
  6. GitHub – Zulko/gizeh: векторная графика для Python — введение в работу с векторной графикой и анимацией на Python.
  7. pygifsicle на PyPI — утилита для оптимизации GIF'ов на Python.