以编程方式在Python中生成video或animationGIF?

我有一系列想要从中创buildvideo的图像。 理想情况下,我可以为每个帧指定帧持续时间,但固定帧速率也可以。 我在wxPython中这样做,所以我可以渲染到一个wxDC,或者我可以将图像保存到文件,如PNG。 有没有一个Python库,可以让我从这些帧创buildvideo(AVI,MPG等)或animationGIF?

编辑:我已经试过PIL,它似乎并没有工作。 有人可以用这个结论纠正我,还是build议另一个工具包? 这个链接似乎支持我关于PIL的结论: http : //www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/

我build议不要使用visvisa中的images2gif,因为它有PIL / Pillow的问题,并且没有被主动维护(我应该知道,因为我是作者)。

相反,请使用为解决这个问题而开发的imageio ,并且是为了留下。

快速肮脏的解决scheme

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

对于较长的电影,请使用stream媒体方式:

 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年6月,最初引用的博客文章有一个方法来创buildanimationGIF 的评论 。 下载脚本images2gif.py (原图片2gif.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文件,然后从Python调用ImageMagick的convert.exe来创build一个animationGIF。 这种方法的好处是我可以为每个帧分别指定帧持续时间。 不幸的是这取决于ImageMagick被安装在机器上。 他们有一个Python包装,但它看起来很蹩脚,不受支持。 仍然打开其他build议。

我使用了很容易使用的images2gif.py 。 它似乎加倍了文件的大小,虽然..

26个110kb的PNG文件,我预计26 * 110kb = 2860kb,但是my_gif.GIF是5.7mb

也是因为GIF是8位的,在PNG里,好的PNG变得有点模糊了

这是我使用的代码:

 __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 

这是26帧中的3个:

这里有26个帧中的3个

缩小图像缩小了尺寸:

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

更小的gif

要创build一个video,你可以使用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可以做到这一点: 从多个input图像文件进行编码 。 你可以像这样从python执行mencoder:

 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) 

该任务可以通过运行与图片文件序列相同的文件夹中的两行python脚本来完成。 对于png格式的文件,脚本是 –

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

老问题,很多很好的答案,但可能仍然有兴趣在另一个select…

我最近放在github上的numpngw模块( https://github.com/WarrenWeckesser/numpngw )可以从numpy数组中写入animationPNG文件。 ( 更新numpngw现在在pypi上: https : 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) 

创build:

动画PNG

您需要支持animationPNG的浏览器才能看到animation。 火狐浏览器,Safari不,Chrome有一个插件。

去年沃伦所说,这是一个老问题。 由于人们似乎还在浏览页面,所以我想将它们redirect到更现代的解决scheme。 像Blakev 在这里说的, 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中调用shell命令。

如果您的图像存储为诸如dummy_image_1.png,dummy_image_2.png … dummy_image_N.png,那么您可以使用以下function:

 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") 

这将构build你的gif文件my_output.gif。

我正在寻找一个单行代码,并发现以下为我的应用程序工作。 这是我做的:

第一步: 从下面的链接安装ImageMagick

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

在这里输入图像描述

第二步: 将cmd行指向放置图像(以我的.png格式)的文件夹

在这里输入图像描述

第三步: input以下命令

 magick -quality 100 *.png outvideo.mpeg 

在这里输入图像描述

感谢FogleBird的想法!

我只是尝试以下,非常有用:

首先将库Figtodatimages2gif下载到本地目录。

其次收集数组中的数字,并将其转换为animationgif:

 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)