从R运行ImageMagick时出现错误:参数无效。

10

我正在尝试在R中制作GIF动画。我有一个矩阵数组,希望将其转换为GIF动画。我的策略受到此示例的启发:

http://ryouready.wordpress.com/2010/11/21/animate-gif-images-in-r-imagemagick/

其中以下代码使用R中的“png”函数生成11个PNG图片。接下来,它调用外部ImageMagick程序“convert”编译GIF动画。

dir.create("examples")
setwd("examples")

# Animated countdown from 10 to "GO!".
png(file="example%02d.png", width=200, height=200)
for (i in c(10:1, "G0!")){
plot.new()
text(.5, .5, i, cex = 6)
}
dev.off()

# convert the .png files to one .gif file using ImageMagick. 
system("convert -delay 80 *.png example_1.gif")
#shell("convert -delay 80 *.png example_1.gif")

问题在于R似乎无法找到ImageMagick中的"convert"可执行文件,该文件已经安装在C驱动器(C:\Program Files\ImageMagick-6.8.5-Q16)中。在我之前引用的网站评论中,建议Windows用户使用"shell"而不是"system"来运行外部程序,但这两种方法都不起作用。错误消息为:

Invalid parameter - 80
Warning message:
running command 'convert -delay 80 *.png example_1.gif' had status 4

我已经尝试根据这个答案的建议,在系统属性中更改Windows PATH环境变量,但是在我的系统上,PATH变量已经被正确定义了。我还尝试指定整个convert.exe文件的字符串,但仍然没有运气...

如何通过R运行ImageMagick?

规格: Windows 7 Servicepack 1, R 3.0.0

提前感谢...


system("where convert", intern = TRUE) 会给你什么结果? - flodel
1
convert 变量中的第一个文件路径是 ImageMagick 文件路径,我再次检查了一下。当我运行代码 system("C:/Program Files/ImageMagick-6.8.5-Q16/convert -delay 80 *.png example_1.gif") 时,似乎什么也没有发生。 当我运行 shell("C:/Program Files/ImageMagick-6.8.5-Q16/convert -delay 80 *.png example_1.gif") 时,我收到错误消息: 'C:/Program' was not recognized as an internal or external command, program or batch file. 然后是一系列 R 错误。 - Duffau
尝试使用以下命令:system("C:/Program Files/ImageMagick-6.8.5-Q16/convert -delay 80 *.png example_1.gif", intern = TRUE) - flodel
当“显然没有任何反应”时,是否创建了文件example_1.gif - flodel
5
也许可以这样:system('"C:\\Program Files\\ImageMagick-6.8.5-Q16\\convert.exe" -delay 80 *.png example_1.gif', intern = TRUE) - flodel
显示剩余7条评论
4个回答

7
在Windows上,有几个convert.exe命令,它们都在PATH中。因此,您必须指定正确的convert.exe可执行文件的路径。在我的情况下,我将其放在LyX文件夹中(但是,您也可以在ImageMagick安装中找到它)。
如果您要粘贴,请注意引号、反斜杠和空格。例如,从R中:
system('"C:\\Program Files (x86)\\LyX 2.0\\imagemagick\\convert.exe" -delay 20 -loop 0 files_*.png animation.gif')

实际上,自从这个答案发布以来,Magick命令已经更改,以避免与system32冲突。只需使用以下命令:system(magick convert -delay 40 -loop 0 *.png example_1.gif)并且不要忘记在cd中指定您的路径,如果您的目标文件在不是您的工作目录的文件夹中。 system("cd YOUR PATH") - Xochitl C.

3

我是Windows 10用户,在定义了工作目录之后,我使用以下命令在R中运行:

shell("convert -set delay 80 -loop 0 *.jpg example_shell_test.gif")

在cmd中,每个命令都有以下含义:

convert = 打开ImageMagick的转换功能

-set delay x = 设置每帧之间的延迟时间为x(1000 = 1秒)

-loop 0 = 无限循环,如果设置为1,则只会遍历一次图像

*.[图像类型] = 和文件名.[图像类型]

[输出gif的名称].gif = 另存为新的.gif文件

我首先在命令提示符中通过导航到目录并运行以下命令使其工作:

convert -set delay 80 -loop 0 *.jpg example_cmd_test.gif

之前我在CMD中使用-delay = 80,而不是-set delay 80,结果出现了以下错误: convert: invalid argument for option '-delay': = @ error/convert.c/ConvertImageCommand/1277.

在R中,使用正确的“-set delay x”命令,我得到了以下错误:

> system("convert -set delay = 80 -loop 0 *.jpg example_3.gif")
Invalid Parameter - delay
Warning message:
running command 'convert -set delay = 80 -loop 0 *.jpg example_3.gif' had status 4 

shell()中的其他错误

> shell("convert -set delay = 80 -loop 0 *.jpg example_shell_test11.gif")
convert: unable to open image '80': No such file or directory @ error/blob.c/OpenBlob/3094.
convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/509.
Warning messages:
1: running command 'C:\WINDOWS\system32\cmd.exe /c convert -set delay = 80 -loop 0 *.jpg example_shell_test11.gif' had status 1 
2: In shell("convert -set delay = 80 -loop 0 *.jpg example_shell_test11.gif") :
  'convert -set delay = 80 -loop 0 *.jpg example_shell_test11.gif' execution failed with error code 1

我在使用R内的shell()函数运行它后,似乎它能够正常工作。

shell("convert -set delay = 80 -loop 0 *.jpg example_shell_test.gif")

请查看这个主题:ImageMagick - Issue with Windows和convert函数

0

我知道有人已经找到了解决方案,但是有一种更简单的方法可以解决它,而不必在system()中包含整个路径。只需在加载动画包后设置ani.options(convert = 'pathway/convert.exe')即可。


0

尝试了所有这些修复方法以及这些这些都没有成功后,我使用了替代软件进行转换,其中有几个在这里描述。我是Windows用户,在该网站上找到了VirtualDub的简单说明,很快就完成了此任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接