Программно генерировать видео или анимированный GIF в Python?

У меня есть серия изображений, из которых я хочу создать видео. В идеале я мог бы указать продолжительность кадра для каждого кадра, но фиксированная частота кадров тоже будет прекрасной. Я делаю это в wxPython, поэтому я могу отображать wxDC или я могу сохранить изображения в файлах, например PNG. Есть ли библиотека Python, которая позволит мне создавать либо видео (AVI, MPG и т. Д.), Либо анимированный GIF из этих фреймов?

Изменить: я уже пробовал PIL, и он, похоже, не работает. Может ли кто-то поправить меня этим заключением или предложить другой инструментарий? Эта ссылка, похоже, подкрепляет мой вывод о PIL: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/

  • Когда требуется «я»?
  • Быстро и просто: лоток с питоном?
  • Проблемы с Py2exe lxml
  • Хороший wxpython GUI builder?
  • Эффективное управление Thumbnail изображениями для Python?
  • wx.TaskBarIcon на Ubuntu 11.04
  • Травление объектов
  • Как захватить вывод сценария оболочки, запущенного в отдельном процессе, в wxPython TextCtrl?
  • 14 Solutions collect form web for “Программно генерировать видео или анимированный GIF в Python?”

    Я бы рекомендовал не использовать images2gif из visvis, потому что у него проблемы с PIL / Pillow и он не поддерживается (я должен знать, потому что я автор).

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

    Быстрое и грязное решение:

    import imageio images = [] for filename in filenames: images.append(imageio.imread(filename)) imageio.mimsave('/path/to/movie.gif', images) 

    Для более длинных фильмов используйте подход потоковой передачи:

     import imageio with imageio.get_writer('/path/to/movie.gif', mode='I') as writer: for filename in filenames: image = imageio.imread(filename) writer.append_data(image) 

    По состоянию на июнь 2009 года изначально цитируемый пост в блоге имеет метод создания анимированных GIF -комментариев в комментариях . Загрузите скрипт images2gif.py (ранее images2gif.py , обновите любезность @geographika).

    Затем, чтобы отменить рамки в gif, например:

     #!/usr/bin/env python from PIL import Image, ImageSequence import sys, os filename = sys.argv[1] im = Image.open(filename) original_duration = im.info['duration'] frames = [frame.copy() for frame in ImageSequence.Iterator(im)] frames.reverse() from images2gif import writeGif writeGif("reverse_" + os.path.basename(filename), frames, duration=original_duration/1000.0, dither=0) 

    Ну, теперь я использую ImageMagick. Я сохраняю свои кадры в виде файлов PNG, а затем выворачиваю конвертировать ImageMagick из Python для создания анимированного GIF. Самое приятное в этом подходе – я могу указать продолжительность кадра для каждого кадра отдельно. К сожалению, это зависит от установки ImageMagick на машине. У них есть оболочка Python, но она выглядит довольно дрянной и неподдерживаемой. Все еще открыт для других предложений.

    Я использовал images2gif.py, который был прост в использовании. Кажется, он удваивает размер файла, хотя ..

    26 110kb PNG-файлов, я ожидал 26 * 110kb = 2860kb, но my_gif.GIF был 5.7mb

    Кроме того, поскольку GIF был 8 бит, приятные png стали немного нечеткими в GIF

    Вот код, который я использовал:

     __author__ = 'Robert' from images2gif import writeGif from PIL import Image import os file_names = sorted((fn for fn in os.listdir('.') if fn.endswith('.png'))) #['animationframa.png', 'animationframb.png', 'animationframc.png', ...] " images = [Image.open(fn) for fn in file_names] print writeGif.__doc__ # writeGif(filename, images, duration=0.1, loops=0, dither=1) # Write an animated gif from the specified images. # images should be a list of numpy arrays of PIL images. # Numpy images of type float should have pixels between 0 and 1. # Numpy images of other types are expected to have values between 0 and 255. #images.extend(reversed(images)) #infinit loop will go backwards and forwards. filename = "my_gif.GIF" writeGif(filename, images, duration=0.2) #54 frames written # #Process finished with exit code 0 

    Вот 3 из 26 кадров:

    Вот 3 из 26 кадров

    сокращение изображений уменьшило размер:

     size = (150,150) for im in images: im.thumbnail(size, Image.ANTIALIAS) 

    меньший gif

    Чтобы создать видео, вы можете использовать opencv ,

     #load your frames frames = ... #create a video writer writer = cvCreateVideoWriter(filename, -1, fps, frame_size, is_color=1) #and write your frames in a loop if you want cvWriteFrame(writer, frames[i]) 

    Это не библиотека python, но mencoder может это сделать: Кодирование из нескольких файлов входных изображений . Вы можете выполнить mencoder из python следующим образом:

     import os os.system("mencoder ...") 

    Вы пробовали PyMedia ? Я не уверен на 100%, но похоже, что этот пример учебника нацелен на вашу проблему.

    С windows7, python2.7, opencv 3.0, для меня работает следующее:

     import cv2 import os vvw = cv2.VideoWriter('mymovie.avi',cv2.VideoWriter_fourcc('X','V','I','D'),24,(640,480)) frameslist = os.listdir('.\\frames') howmanyframes = len(frameslist) print('Frames count: '+str(howmanyframes)) #just for debugging for i in range(0,howmanyframes): print(i) theframe = cv2.imread('.\\frames\\'+frameslist[i]) vvw.write(theframe) 

    Старый вопрос, много хороших ответов, но все равно может быть интерес к другой альтернативе …

    Модуль numpngw который я недавно установил на github ( https://github.com/WarrenWeckesser/numpngw ), может записывать анимированные PNG-файлы из массивов numpy. ( Обновление : numpngw теперь находится на pypi: https://pypi.python.org/pypi/numpngw .)

    Например, этот скрипт:

     import numpy as np import numpngw img0 = np.zeros((64, 64, 3), dtype=np.uint8) img0[:32, :32, :] = 255 img1 = np.zeros((64, 64, 3), dtype=np.uint8) img1[32:, :32, 0] = 255 img2 = np.zeros((64, 64, 3), dtype=np.uint8) img2[32:, 32:, 1] = 255 img3 = np.zeros((64, 64, 3), dtype=np.uint8) img3[:32, 32:, 2] = 255 seq = [img0, img1, img2, img3] for img in seq: img[16:-16, 16:-16] = 127 img[0, :] = 127 img[-1, :] = 127 img[:, 0] = 127 img[:, -1] = 127 numpngw.write_apng('foo.png', seq, delay=250, use_palette=True) 

    создает:

    анимированный png

    Для просмотра анимации вам понадобится браузер, поддерживающий анимированный PNG. Firefox делает, Safari этого не делает, и у Chrome есть плагин для него.

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

      import ImageSequence import Image import gifmaker sequence = [] im = Image.open(....) # im is your original image frames = [frame.copy() for frame in ImageSequence.Iterator(im)] # write GIF animation fp = open("out.gif", "wb") gifmaker.makedelta(fp, frames) fp.close() 

    Задачу можно завершить, запустив скрипт из двух строк python из той же папки, что и последовательность файлов изображений. Для файлов в формате png скрипт –

     from scitools.std import movie movie('*.png',fps=1,output_file='thisismygif.gif') 

    Самое легкое, что заставляет его работать для меня, – это вызвать команду оболочки в Python.

    Если ваши изображения хранятся, например dummy_image_1.png, dummy_image_2.png … dummy_image_N.png, то вы можете использовать эту функцию:

     import subprocess def grid2gif(image_str, output_gif): str1 = 'convert -delay 100 -loop 1 ' + image_str + ' ' + output_gif subprocess.call(str1, shell=True) 

    Просто выполните:

     grid2gif("dummy_image*.png", "my_output.gif") 

    Это создаст ваш gif-файл my_output.gif.

    Я искал один код строки и нашел следующее для работы в моем приложении. Вот что я сделал:

    Первый шаг: установите ImageMagick из приведенной ниже ссылки

    https://www.imagemagick.org/script/download.php

    введите описание изображения здесь

    Второй шаг: укажите строку cmd в папку, в которой размещены изображения (в моем случае .png-формат)

    введите описание изображения здесь

    Третий шаг: введите следующую команду

     magick -quality 100 *.png outvideo.mpeg 

    введите описание изображения здесь

    Спасибо FogleBird за идею!

    Я просто попробовал следующее и был очень полезен:

    Сначала загрузите библиотеки Figtodat и images2gif в свой локальный каталог.

    Во-вторых собрать фигуры в массиве и преобразовать их в анимированный gif:

     import sys sys.path.insert(0,"/path/to/your/local/directory") import Figtodat from images2gif import writeGif import matplotlib.pyplot as plt import numpy figure = plt.figure() plot = figure.add_subplot (111) plot.hold(False) # draw a cardinal sine plot images=[] y = numpy.random.randn(100,5) for i in range(y.shape[1]): plot.plot (numpy.sin(y[:,i])) plot.set_ylim(-3.0,3) plot.text(90,-2.5,str(i)) im = Figtodat.fig2img(figure) images.append(im) writeGif("images.gif",images,duration=0.3,dither=0) 
    Python - лучший язык программирования в мире.