用R制作gif动态图以及从gif中提取图片
作者:辉小宝同学
微信公众号:R语言和Python学堂
知乎:
https://www.zhihu.com/people/zoro-3-92/posts
简书:https://www.jianshu.com/u/981ba7d6b4a6
熟悉R的朋友,肯定知道 animation
包,它可将一系列用R绘制的静态图转化为各种格式的动图或视频(比如:gif, mp4, avi等格式)。事实上,它是通过R去调用一些图片或视频处理程序(比如:ImageMagick, GraphicsMagick, FFmpeg等)来实现这些功能的,因此如果要使用这些功能,相应外部程序也必须要安装。关于 animation
包的详情可参考https://cran.r-project.org/web/packages/animation/。
由于 animation
包只能将R绘制的静态图转化为动图,它不能处理外部图片以及gif动态图。因此我将在这篇博客教大家如何用R从gif中提取图片以及如何将外部图片制作成gif动态图,我将以下面的gif动图为例:
1. 下载ImageMagick
ImageMagick是一款功能强大、稳定而且免费开源的图片处理工具集,可以用来读、写和处理超过200种不同格式的图片文件,详情可参考其官网https://www.imagemagick.org。
这里我们也将通过R来调用ImageMagick来实现我们的功能。我们用的是ImageMagick的Windows portable版(便携版,也即免安装版),我将安装压缩包已上传至百度网盘(包括32位和64位系统的,解压就可以用,无需安装),你也可从官网下载https://www.imagemagick.org/script/download.php。
2. 从gif动图中提取每帧图片
在ImageMagick中可通过命令行模式来实现这个功能,其一般命令为convert test.gif-coalesce result_%05d.png
。下面通过R来调用这个命令,我将其封装成一个叫 gif2frames()
的函数,其各参数的意义见函数内部的注释:
gif2frames <- function(pathIn='',
pathOut='',
ImageMagick_path='',
frameFormat='png',
prefixFrame='/frame_%05d.'){
##### arguments
# pathIn: gif文件所在路径
# pathOut: 图片保存路径
# ImageMagick_path: ImageMagick convert命令所在路径
# frameFormat: 图片保存的格式类型
# prefixFrame: 图片文件名的格式
##### return
# None
if(!dir.exists(pathOut)) ##自动创建保存图片的文件夹
dir.create(pathOut)
command <- paste(ImageMagick_path, pathIn, '-coalesce', paste0(pathOut, prefixFrame, frameFormat))
#system('F:R_tutorials/gif/ImageMagick-7.0.8-64bit/convert test.gif -coalesce ./frames/frame_%05d.png')
system(command) ##调用外部的ImageMagick程序
}
从上面代码可知,最后我们通过R中的
system()
函数来调用外部ImageMagick程序来实现所需功能。
来测试一下:
pathIn <- 'test.gif'
pathOut <- './frames/'
ImageMagick_path <- './ImageMagick-7.0.8-64bit/convert'
gif2frames(pathIn, pathOut, ImageMagick_path)
运行完上面代码后, test.gif
动图中的每一帧都保存在 frames
文件夹下,如下图:
用R提取gif中的每帧图片就算实现了,是不是很简单!!!
3. 制作gif
下面我将使用上一步提取到的图片(即 frames
文件夹下的170帧图片)为例,来介绍如何制作gif,这可以看作为上一步的逆过程。我也将其封装成一个叫 frames2gif
的函数:
frames2gif <- function(pathIn='',
pathOut='',
ImageMagick_path='',
resize_ratio=1,
delay=40,
frameFormat='png',
everyFrame=1){
##### arguments
# pathIn: 图片所在路径
# pathOut: 生成的gif所保存的路径
# ImageMagick_path: ImageMagick convert命令所在路径
# resize_ratio: 调节gif的尺寸,默认为1。如果为0.5,gif的长度和宽度将是图片尺寸的一半
# delay: 设置帧与帧之间的时间间隔,默认为40(表示0.4s)。如果为200,那么时间间隔即为2s
# frameFormat: 图片的格式
# everyFrame: 如果为3,只使用pathIn文件夹下的第1, 4, 7,10,13帧,.....图片来制作gif,默认使用所有图片
##### return
# None
## create temp dir to store frames used to create gif.
tempdir <- paste0(pathIn, '/temp')
dir.create(tempdir)
files <- list.files(pathIn, pattern=paste0('*.', frameFormat), recursive=FALSE, full.names=TRUE)
index <- seq(1, length(files), by=everyFrame)
file.copy(files[index], tempdir)
command <- paste(ImageMagick_path,
'-resize', paste0(as.integer(100L*resize_ratio), '%'),
'-delay', delay,
paste0(tempdir,'/*.', frameFormat),
pathOut)
#system('F:R_tutorials/gif/ImageMagick-7.0.8-64bit/convert -resize 90% -delay 40 *.png result.gif')
system(command)
## delete temp dir
unlink(tempdir, recursive=TRUE, force=TRUE)
}
来测试一下:
1. 设置 delay
参数为 2
(也即帧与帧之间的时间间隔为0.02s),使动画变得更快。
pathIn <- './frames/'
pathOut <- 'fast.gif'
ImageMagick_path <- './ImageMagick-7.0.8-64bit/convert'
frames2gif(pathIn, pathOut,
ImageMagick_path,
delay=2)
结果如下图:
2. 设置 resize_ratio
参数为 0.5
,使动画尺寸大小变为原来的一半。
pathOut <- 'small.gif'
frames2gif(pathIn, pathOut,
ImageMagick_path,
resize_ratio=0.5,
delay=4)
结果如下图:
3. 设置 everyFrame
参数为 2
,使动画的总帧数变为原来的1/2。
pathOut <- 'small_frames.gif'
frames2gif(pathIn, pathOut,
ImageMagick_path,
everyFrame=2,
delay=4)
结果如下图:
从上图可知,减少动画总帧数,其效果相当于缩短动画时间。
通过以上三个例子,我们知道如何使用 frames2gif()
函数来制作gif动图了。
以上就是本文的全部内容,希望对大家的学习有所帮助。如果觉得文章不错,动手转发支持一下哦!
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法
爱我请给我好看!
用R制作gif动态图以及从gif中提取图片相关推荐
- php imagemagick gif,用R制作gif动态图以及从gif中提取图片
想获取本文完整代码和数据的下载链接,可关注微信公众号"R语言和Python学堂",并回复发文日期"20181121". 熟悉R的朋友,肯定知道 animatio ...
- MATLAB 制作gif动态图
MATLAB 制作gif动态图的基本思想就是,将一张张的静态图组合成一张能动的gif图片,并保存到相应的位置. 那么,要想制作一张动态图,首先要有若干个静态图,并且他们的索引值是连续的.下面先说一下m ...
- r语言 html gif,哈佛教授公开R语言源码,教你用R制作gif动图
原标题:哈佛教授公开R语言源码,教你用R制作gif动图 作者Rafael Irizarry是哈佛大学以及the Dana-Farber Cancer Institute的应用统计教授,他专注于研究基因 ...
- 如何将图片序列化_PS如何将图片制作成gif动态图 ps制作gif动态图教程
想要制作gif动态图片,为何不试试万能的PS呢!使用PS可以帮助用户快速轻松的制作gif动图,操作简单又方便.那么如何利用PS快速将图片做成gif动态图,其实方法是很简单,制作这种gif动图其实就是把 ...
- 如何用计算机制作动态图,电脑怎么制作gif动态图
原标题:电脑怎么制作gif动态图 QQ和空间里我们经常能看到一些好玩的动态图,那么这些动态图究竟是如何制作的呢?其实这些GIF动态图制作起来不是特别困难,有一款迅捷GIF制作工具就能够轻松驾驭了,今天 ...
- Python制作gif动态图
想用C#做gif动态图,找了半天,没有能直接生成的方法,都需要用额外的dll文件.但是用Python倒是可以很简单的实现. 参考https://blog.csdn.net/qq_42554007/ar ...
- javacv开发详解之19:如何使用批量的多张图片制作apng动态图,再也不用担心不会制作动态图了
javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 前面写过视频.桌面屏幕录制apng和gif动态图,虽然已经满足大部分情况,但是没考虑到现在很多动态图都是使用多张 ...
- PS制作gif动态图
这两天突然对PS有了点兴趣.今天学了下使用PS制作gif动态图!记录下过程! 1.首先我们打开PS,然后(Ctrl + N)新建一个项目! 2.将我们需要的素材托到PS中,让后调整下大小,确定! 然后 ...
- 哪个软件可以制作GIF动态图
表情包已经成为我们必备的一个聊天小功能,各式各样的GIF给我们带来了很多的乐趣,但是我们很少有自己去制作GIF的经历,其实制作起来会很有趣,那哪个软件可以制作GIF动态图呢? 1.在电脑上运行迅捷GI ...
最新文章
- 河南单招哪所学校主学计算机,河南单招学校王牌专业 2021年河南单招王牌专业...
- 架构演化:云原生时代开启之系列一演化篇
- recv, recvfrom, recvmsg
- asp.net core mvc 管道之中间件
- “人,落魄时,千万别装可怜”你怎么看?
- 提高搜索引擎结果页面排名的各种技术
- Python 水仙花数练习
- iQOO Neo6 SE什么时候发布 iQOO Neo6 SE配置如何
- Java分布式架构:应用+特点+架构模式
- 寒门难出贵子,我当程序员让爸妈在老家长脸了
- VxWorks的漏洞分析与解决方案
- 图形化的电力通信光纤资源管理系统概述与功能特点
- pe下修复linux磁盘分区,找回丢失的Linux分区及Grub修复过程
- PAT甲级刷题计划-树
- Apache Project LIst 所有项目介绍
- 我的Java和Android之路------菜冬瓜
- 写一个获取非行间样式的函数
- 如何在 Ubuntu 中禁用 motd 欢迎消息
- 51单片机生成二维码
- Java的堆内存和栈内存
热门文章
- excel 的选择性粘贴
- 为第九大股东;此前40次增持民生银行A股股份
- 计算机论文一千五,1.论文字数不够,正文要五千字,至少增加1000,但不要抄袭.DOC...
- Ice.ConnectFailedException
- 高职单招计算机基础知识题,高职单招计算机基础练习题
- 一个PHP程序员的职业生涯技术提升阶梯规划方案
- Java操作word指定位置插入数据
- # ffmpeg 将多幅图片压缩成视频 h264 avi
- 计算机桌面文件能单独设密码吗,电脑上文件夹怎么加密_桌面文件夹怎么加密码...
- vs2017 c++工程编译解析