Создание видео или GIF из изображений в Python: руководство
Быстрый ответ
Если вам необходимо быстро создать анимированные GIF или видео на Python, воспользуйтесь библиотекой imageio. Установить её можно командой pip install imageio
. Ниже приведен пример, как создать GIF из набора изображений:
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]
), чтобы работать с видео.
Дополнительная информация
Работа с большим набором изображений
Если вы работаете с большим количеством изображений, стоит задуматься о экономии памяти и времени обработки. В этом может помочь "ленивая" загрузка, используемая, например, в Image.open
из библиотеки PIL
.
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
и методом сортировки.
import glob
image_paths = sorted(glob.glob('images/*.png'))
# Теперь изображения идут в правильной последовательности
Контроль длительности каждого кадра
Для различных сцен в GIF могут требоваться разные временные рамки. Для управления временем показа каждого кадра используйте параметр duration
в методе append_data
.
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. Используйте изображения высокого разрешения для достижения наилучших результатов.
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.
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 можно подходить как к организации кукольного театра:
Этап | Кукольное театральное представление |
---|---|
Выбор изображений | Выбор кукол 🎭 |
Настройка продолжительности кадров | Репетиция сцен ⏱️ |
Упорядочивание и сортировка кадров | Постановка сцен 🎬 |
Запись и сохранение | Финальные аплодисменты и завершение представления 📽️ |
Каждый кадр оживляет следующую сцену!
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.
convert -delay 20 -loop 0 frame0.png frame1.png frame2.png animation.gif
Просто убедитесь, что ImageMagick установлен на вашем компьютере.
Возможности Pillow
Библиотека Python Pillow дает дополнительные функции для управления повторами проигрывания и цветовым дизерингом при создании GIF, что может быть полезно.
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") # Отключение цветового дизеринга при сохранении
Полезные материалы
- Документация Pillow (PIL Fork) — полный разбор функционала для работы с изображениями на Python.
- Руководство пользователя MoviePy — обзор инструментов для редактирования видео на Python.
- Документация imageio — подробное руководство по созданию анимаций на Python.
- matplotlib.animation в документации Matplotlib — пошаговая инструкция по созданию анимаций в Python с помощью matplotlib.
- Обсуждение создания видео и GIF на Python на Stack Overflow — полезные советы от сообщества разработчиков.
- GitHub – Zulko/gizeh: векторная графика для Python — введение в работу с векторной графикой и анимацией на Python.
- pygifsicle на PyPI — утилита для оптимизации GIF'ов на Python.