作者:辉小宝同学

微信公众号: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()的函数,其各参数的意义见函数内部的注释:

  1. gif2frames <- function(pathIn='',

  2.                       pathOut='',

  3.                       ImageMagick_path='',

  4.                       frameFormat='png',

  5.                       prefixFrame='/frame_%05d.'){

  6.  ##### arguments

  7.  # pathIn: gif文件所在路径

  8.  # pathOut: 图片保存路径

  9.  # ImageMagick_path: ImageMagick convert命令所在路径

  10.  # frameFormat: 图片保存的格式类型

  11.  # prefixFrame: 图片文件名的格式

  12.  ##### return

  13.  # None

  14.  if(!dir.exists(pathOut))  ##自动创建保存图片的文件夹

  15.    dir.create(pathOut)

  16.  command <- paste(ImageMagick_path, pathIn, '-coalesce', paste0(pathOut, prefixFrame, frameFormat))

  17.  #system('F:R_tutorials/gif/ImageMagick-7.0.8-64bit/convert test.gif -coalesce ./frames/frame_%05d.png')

  18.  system(command)  ##调用外部的ImageMagick程序

  19. }

从上面代码可知,最后我们通过R中的 system()函数来调用外部ImageMagick程序来实现所需功能。

来测试一下:

  1. pathIn <- 'test.gif'

  2. pathOut <- './frames/'

  3. ImageMagick_path <- './ImageMagick-7.0.8-64bit/convert'


  4. gif2frames(pathIn, pathOut, ImageMagick_path)

运行完上面代码后, test.gif动图中的每一帧都保存在 frames文件夹下,如下图:

用R提取gif中的每帧图片就算实现了,是不是很简单!!!

3. 制作gif

下面我将使用上一步提取到的图片(即 frames文件夹下的170帧图片)为例,来介绍如何制作gif,这可以看作为上一步的逆过程。我也将其封装成一个叫 frames2gif的函数:

  1. frames2gif <- function(pathIn='',

  2.                       pathOut='',

  3.                       ImageMagick_path='',

  4.                       resize_ratio=1,

  5.                       delay=40,

  6.                       frameFormat='png',

  7.                       everyFrame=1){

  8.  ##### arguments

  9.  # pathIn: 图片所在路径

  10.  # pathOut: 生成的gif所保存的路径

  11.  # ImageMagick_path: ImageMagick convert命令所在路径

  12.  # resize_ratio: 调节gif的尺寸,默认为1。如果为0.5,gif的长度和宽度将是图片尺寸的一半

  13.  # delay: 设置帧与帧之间的时间间隔,默认为40(表示0.4s)。如果为200,那么时间间隔即为2s

  14.  # frameFormat: 图片的格式

  15.  # everyFrame: 如果为3,只使用pathIn文件夹下的第1, 4, 7,10,13帧,.....图片来制作gif,默认使用所有图片

  16.  ##### return

  17.  # None


  18.  ## create temp dir to store frames used to create gif.

  19.  tempdir <- paste0(pathIn, '/temp')

  20.  dir.create(tempdir)

  21.  files <- list.files(pathIn, pattern=paste0('*.', frameFormat), recursive=FALSE, full.names=TRUE)

  22.  index <- seq(1, length(files), by=everyFrame)

  23.  file.copy(files[index], tempdir)

  24.  command <- paste(ImageMagick_path,

  25.                   '-resize', paste0(as.integer(100L*resize_ratio), '%'),

  26.                   '-delay', delay,

  27.                   paste0(tempdir,'/*.', frameFormat),

  28.                   pathOut)

  29.  #system('F:R_tutorials/gif/ImageMagick-7.0.8-64bit/convert -resize 90% -delay 40 *.png result.gif')

  30.  system(command)

  31.  ## delete temp dir

  32.  unlink(tempdir, recursive=TRUE, force=TRUE)

  33. }

来测试一下:

1. 设置 delay参数为 2(也即帧与帧之间的时间间隔为0.02s),使动画变得更快。

  1. pathIn <- './frames/'

  2. pathOut <- 'fast.gif'

  3. ImageMagick_path <- './ImageMagick-7.0.8-64bit/convert'


  4. frames2gif(pathIn, pathOut,

  5.           ImageMagick_path,

  6.           delay=2)

结果如下图:

2. 设置 resize_ratio参数为 0.5,使动画尺寸大小变为原来的一半。

  1. pathOut <- 'small.gif'


  2. frames2gif(pathIn, pathOut,

  3.           ImageMagick_path,

  4.           resize_ratio=0.5,

  5.           delay=4)

结果如下图:

3. 设置 everyFrame参数为 2,使动画的总帧数变为原来的1/2。

  1. pathOut <- 'small_frames.gif'


  2. frames2gif(pathIn, pathOut,

  3.           ImageMagick_path,

  4.           everyFrame=2,

  5.           delay=4)

结果如下图:

从上图可知,减少动画总帧数,其效果相当于缩短动画时间。

通过以上三个例子,我们知道如何使用 frames2gif()函数来制作gif动图了。

以上就是本文的全部内容,希望对大家的学习有所帮助。如果觉得文章不错,动手转发支持一下哦!

公众号后台回复关键字即可学习

回复 爬虫             爬虫三大案例实战  
回复 Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

爱我请给我好看!

用R制作gif动态图以及从gif中提取图片相关推荐

  1. php imagemagick gif,用R制作gif动态图以及从gif中提取图片

    想获取本文完整代码和数据的下载链接,可关注微信公众号"R语言和Python学堂",并回复发文日期"20181121". 熟悉R的朋友,肯定知道 animatio ...

  2. MATLAB 制作gif动态图

    MATLAB 制作gif动态图的基本思想就是,将一张张的静态图组合成一张能动的gif图片,并保存到相应的位置. 那么,要想制作一张动态图,首先要有若干个静态图,并且他们的索引值是连续的.下面先说一下m ...

  3. r语言 html gif,哈佛教授公开R语言源码,教你用R制作gif动图

    原标题:哈佛教授公开R语言源码,教你用R制作gif动图 作者Rafael Irizarry是哈佛大学以及the Dana-Farber Cancer Institute的应用统计教授,他专注于研究基因 ...

  4. 如何将图片序列化_PS如何将图片制作成gif动态图 ps制作gif动态图教程

    想要制作gif动态图片,为何不试试万能的PS呢!使用PS可以帮助用户快速轻松的制作gif动图,操作简单又方便.那么如何利用PS快速将图片做成gif动态图,其实方法是很简单,制作这种gif动图其实就是把 ...

  5. 如何用计算机制作动态图,电脑怎么制作gif动态图

    原标题:电脑怎么制作gif动态图 QQ和空间里我们经常能看到一些好玩的动态图,那么这些动态图究竟是如何制作的呢?其实这些GIF动态图制作起来不是特别困难,有一款迅捷GIF制作工具就能够轻松驾驭了,今天 ...

  6. Python制作gif动态图

    想用C#做gif动态图,找了半天,没有能直接生成的方法,都需要用额外的dll文件.但是用Python倒是可以很简单的实现. 参考https://blog.csdn.net/qq_42554007/ar ...

  7. javacv开发详解之19:如何使用批量的多张图片制作apng动态图,再也不用担心不会制作动态图了

    javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 前面写过视频.桌面屏幕录制apng和gif动态图,虽然已经满足大部分情况,但是没考虑到现在很多动态图都是使用多张 ...

  8. PS制作gif动态图

    这两天突然对PS有了点兴趣.今天学了下使用PS制作gif动态图!记录下过程! 1.首先我们打开PS,然后(Ctrl + N)新建一个项目! 2.将我们需要的素材托到PS中,让后调整下大小,确定! 然后 ...

  9. 哪个软件可以制作GIF动态图

    表情包已经成为我们必备的一个聊天小功能,各式各样的GIF给我们带来了很多的乐趣,但是我们很少有自己去制作GIF的经历,其实制作起来会很有趣,那哪个软件可以制作GIF动态图呢? 1.在电脑上运行迅捷GI ...

最新文章

  1. 河南单招哪所学校主学计算机,河南单招学校王牌专业 2021年河南单招王牌专业...
  2. 架构演化:云原生时代开启之系列一演化篇
  3. recv, recvfrom, recvmsg
  4. asp.net core mvc 管道之中间件
  5. “人,落魄时,千万别装可怜”你怎么看?
  6. 提高搜索引擎结果页面排名的各种技术
  7. Python 水仙花数练习
  8. iQOO Neo6 SE什么时候发布 iQOO Neo6 SE配置如何
  9. Java分布式架构:应用+特点+架构模式
  10. 寒门难出贵子,我当程序员让爸妈在老家长脸了
  11. VxWorks的漏洞分析与解决方案
  12. 图形化的电力通信光纤资源管理系统概述与功能特点
  13. pe下修复linux磁盘分区,找回丢失的Linux分区及Grub修复过程
  14. PAT甲级刷题计划-树
  15. Apache Project LIst 所有项目介绍
  16. 我的Java和Android之路------菜冬瓜
  17. 写一个获取非行间样式的函数
  18. 如何在 Ubuntu 中禁用 motd 欢迎消息
  19. 51单片机生成二维码
  20. Java的堆内存和栈内存

热门文章

  1. excel 的选择性粘贴
  2. 为第九大股东;此前40次增持民生银行A股股份
  3. 计算机论文一千五,1.论文字数不够,正文要五千字,至少增加1000,但不要抄袭.DOC...
  4. Ice.ConnectFailedException
  5. 高职单招计算机基础知识题,高职单招计算机基础练习题
  6. 一个PHP程序员的职业生涯技术提升阶梯规划方案
  7. Java操作word指定位置插入数据
  8. # ffmpeg 将多幅图片压缩成视频 h264 avi
  9. 计算机桌面文件能单独设密码吗,电脑上文件夹怎么加密_桌面文件夹怎么加密码...
  10. vs2017 c++工程编译解析