gif图就是动态图,它的原理和视频有点类似,也是通过很多静态图片合成的.本篇文章主要介绍,如何利用Python快速合成gif图,主要利用Python的第三方库imageio
imageio提供了很多方便读写图片的接口、包括读取网络图片、读取视频、生成gif图等。imageio提供许多的接口,
imageio API:https://imageio.readthedocs.io/en/latest/userapi.html
示例程序:https://imageio.readthedocs.io/en/latest/examples.html
pip install imageio
合成gif图
import imageio def compose_gif(): img_paths = ["img/1.jpg","img/2.jpg","img/3.jpg","img/4.jpg" ,"img/5.jpg","img/6.jpg"] gif_images = [] for path in img_paths: gif_images.append(imageio.imread(path)) imageio.mimsave("test.gif",gif_images,fps=1)
通过fps参数可以控制合成gif图片播放图片的速度和视频的播放帧率是一样的,fps参数越大播放的速率越大,fps越小播放的速度越慢.
import imageio import matplotlib.pyplot as plt def read_special_url_image(): img = imageio.imread("imageio:chelsea.png") plt.imshow(img) plt.show()
url = 'http://upload.wikimedia.org/wikipedia/ commons/d/de/Wikipedia_Logo_1.0.png' img = imageio.imread(url)
在使用url读取图片的时候可能会报seek的错误,这时候可以改成下面的形式
url = "https://timgsa.baidu.com/timg?image&quality=80&size= b9999_10000&sec=1545324012100&di=77a4ba3d60cdfc60 d161bd6ed97c2319&imgtype=0&src=http%3A%2F%2Fwww.hxzyt j.com%2Fthemes%2Ftheme_3%2Fpc%2Fimages%2Fpython%2Fimg_01.jpg" img = imageio.imread(imageio.core.urlopen(url).read(), '.jpg')
#截屏 img = imageio.imread("<screen>") #读取粘贴板的图片 img = imageio.imread("<clipboard>")
def get_video_per_frame(): reader = imageio.get_reader("test.mp4") for i,im in enumerate(reader): print("Mean of frame %i is %1.1f"%(i,im.mean()))
在使用imageio读取视频的时候可能会报上面的错误,提示需要安装ffmpeg,可以根据提示进行安装即可.除此之外,imageio还提供了许多方便的接口,有兴趣的可以去了解一下.
了参加最近的StackExchange的“time”主题比赛,我制作了一个Gif来展示StackOverflow网站从2008年 到今天的发展历程:
这里是一张GIF图片,可以点击阅读原文查看。图片太大,无法插入公众号文章。
第一步是为Internet Archive找到一个合适的API。它支持Memento,这是2013年RFC 7089中定义的基于http的协议。使用memento_client包装器,我们可以使用以下Python代码得到网站最接近给定日期的快照:
不要忘记安装memento_client库哦:
pip install memento_client
请注意,此代码会给我们一个最接近的快照,所以不可能确切地是两周以前的。
通过使用一个持续增加的时间增量,我们可以循环此段代码来获取不同 时间的快照。但我们不只是想获取URL。我们还想对每一个网页都做一个截图。
以编程方式获取网页截图的最简单方法可能是使用Selenium。我用Chrome作为驱动程序;你可以从ChromeDriver网站下载,也可以在使用Homebrew包管理器的Mac电脑上运行以下命令:
brew install bfontaine /utils/ chromedriver
我们还需要为Python安装Selenium:
pip install selenium
代码很短:
如果你运行上面的代码,你会看到一个Chrome窗口自动打开,并自动去访问URL,当页面全部加载后自动关闭。然后你就获得了一个该页面的截图,文件名是 stackoverflow_20181119211854.png!然而,很快你就会注意到这个截图中网站的最上面有Wayback Machine(一款网页备份工具)的页眉。
这在手动浏览快照时非常方便,但在从Python访问快照时就不那么方便了。
幸运的是,我们可以通过稍微修改URL来获得一个无页眉的URL:我们可以将 id _ 添加到日期的末尾,以便获得与机器爬取时完全相同的页面。当然,这意味着它会链接到可能不再存在的CSS和JS文件。通过用im_替代id_,我们也可以得到一个链接到经过稍微修改的存档页面的URL,用它来替换原始的存档页面。
带有页眉和重写链接的页面:
https://web.archive.org/web/20181119211854/...
原始页面,跟爬取的页面一样:
https://web.archive.org/web/20181119211854id_/...
重写链接后的原始页面:
https://web.archive.org/web/20181119211854im_/...
使用修改后的URL重新运行代码会得到正确的截图:
将这两段代码组合起来,我们可以在不同的时间间隔对URL进行截图。你可能想在截图完成时检查图片,并删除不一致的图片。例如,谷歌主页的存档快照并不是一直都是同一种语言。
一旦得到了所有的图片,我们就可以使用Imagemagick生成一个gif:
convert –delay 50 –loop 1 *.jpg stackoverflow.gif
我使用了以下参数:
–delay 50:每0.5s改变画面。数字代表每1/100秒。
–loop 1:对所有画面只循环一次。默认情况下是进行无限循环,但在这里没有意义。
你可能想要使用-delay参数进行播放,这取决于你有多少图片以及网站改变的频率。
我也做了一个谷歌版本(约10MB)的gif,每秒5帧,并使用了 –delay 20参数。我使用了与StackOverflow gif相同的延迟时间::每个截图之间至少间隔5周。通过查看每张图片的底部,你可以看到每个截图来自哪一年。
2018年 12月3日-#experiments,#imagemagick,#python,#selenium
——Baptiste Fontaine"s Blog
英文原文:https://qiniumedia.freelycode.com/vcdn/1/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE2/record-website-change-gif.pdf
译者:浣熊君( ・᷄৺・᷅ )
在人们经常会看到很多由视频片段制作而来的动图,这种截取视频片段内容来制作成GIF表情包的方法其实并不困难,接下来我将推荐三种方法来快速完成视频到GIF动图的转换。简单几步就可以轻松搞定。
一、万兴优转桌面端
1、启动万兴优转然后选择工具箱板块,单击GIF动图制作功能
2、在新的弹窗中选择视频转GIF动图功能,然后点击添加图标将本地的视频文件导入至产品当中。
3、导入视频后你可以直接拖动进度条两端来控制转换的视频片段,另一种方法是直接设定开始和结束的时间。然后自定义输出的大小和帧率,直接点击创建GIF动图即可。
二、万兴优转在线端
1、在浏览器中登录https://www.media.io/zh/gif-maker.html,进入视频转GIF功能页面,点击选择文件按钮将视频内容导入至工具中。
2、接下来选择GIF动图的开始时间和结束时间,你还可以控制输出的大小和帧速率,最后点击创建GIF按钮即可完成工作。
三、美图秀秀
如果你只是将多张图片进行合并来做成动图的效果,那你可以使用美图秀秀的图片合并功能,只需要依次放入多张图片即可,效果就会是按顺序来播放图片。
当然这种图片拼接的效果有限,更多时候我们会需要选择将视频的片段截取为GIF动图,所以万兴优转还是你的最优选择。另外有个好消息分享给大家,万兴优转双十二优惠活动已经于12月1日上线了,这次活动还新增了月度增值服务包的限时特卖,有需要的小伙伴可以前往官网了解。
*请认真填写需求信息,我们会在24小时内与您取得联系。