失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > php imagemagick gif 用R制作gif动态图以及从gif中提取图片

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

时间:2023-01-13 11:06:49

相关推荐

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

想获取本文完整代码和数据的下载链接,可关注微信公众号"R语言和Python学堂",并回复发文日期"1121"。

熟悉R的朋友,肯定知道animation包,它可将一系列用R绘制的静态图转化为各种格式的动图或视频(比如:gif, mp4, avi等格式)。事实上,它是通过R去调用一些图片或视频处理程序(比如:ImageMagick, GraphicsMagick, FFmpeg等)来实现这些功能的,因此如果要使用这些功能,相应外部程序也必须要安装。关于animation包的详情可参考https://cran.r-/web/packages/animation/。

由于animation包只能将R绘制的静态图转化为动图,它不能处理外部图片以及gif动态图。因此我将在这篇博客教大家如何用R从gif中提取图片以及如何将外部图片制作成gif动态图,我将以下面的gif动图为例:

1. 下载ImageMagick

ImageMagick是一款功能强大、稳定而且免费开源的图片处理工具集,可以用来读、写和处理超过200种不同格式的图片文件,详情可参考其官网。

这里我们也将通过R来调用ImageMagick来实现我们的功能。我们用的是ImageMagick的Windows portable版(便携版,也即免安装版),我将安装压缩包已上传至百度网盘(包括32位和64位系统的,解压就可以用,无需安装),你也可从官网下载/script/download.php。

2. 从gif动图中提取每帧图片

在ImageMagick中可通过命令行模式来实现这个功能,其一般命令为convert test.gif-coalesce result_%05d.png。下面通过R来调用这个命令,我将其封装成一个叫gif2frames()的函数,其各参数的意义见函数内部的注释:

gif2frames

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

#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

pathOut

ImageMagick_path

gif2frames(pathIn, pathOut,ImageMagick_path)

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

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

3. 制作gif

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

frames2gif

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

dir.create(tempdir)

files

index

file.copy(files[index], tempdir)

command

'-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

pathOut

ImageMagick_path

frames2gif(pathIn, pathOut,

ImageMagick_path,

delay=2)

结果如下图:

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

pathOut

frames2gif(pathIn, pathOut,

ImageMagick_path,

resize_ratio=0.5,

delay=4)

结果如下图:

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

pathOut

frames2gif(pathIn, pathOut,

ImageMagick_path,

everyFrame=2,

delay=4)

结果如下图:

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

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

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

感谢您的阅读!想了解更多有关R语言技巧,请关注我的微信公众号“R语言和Python学堂”,我将定期更新相关文章。同时也欢迎大家积极投稿,促进交流。

为了方便在电脑上阅读,文章也同步更新到相应专栏:

知乎:/people/zoro-3-92/posts

简书:/u/981ba7d6b4a6

如果觉得《php imagemagick gif 用R制作gif动态图以及从gif中提取图片》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。