Python,使用ImageMagick将png转换为gif

时间:2014-02-17 22:07:39

标签: python imagemagick png gif os.system

我正在使用Python 2.7.6,我在将一些png文件转换为gif时遇到了问题(为了创建动画)

    os.system("convert -delay 1 -dispose Background +page " + str(output_dir)
      + "/*.png -loop 0 " + str(output_dir) + "/animation.gif")

这是我的错误

ParamŠtrenonvalide - 1

1 个答案:

答案 0 :(得分:1)

如果没有足够的信息继续下去,这只是猜测,但是......

如果output_dir有任何空格或引号或其他特殊字符,那么您无法逃避或引用它们,因此您的命令行将如下所示:

convert -delay 1 -dispose Background +page ~/My Pictures/*.png -loop 0 ~/My Pictures/animation.gif

也许~/My是发送输入的完全有效的参数,Pictures/*.png恰好解析为convert愿意处理的一大堆额外的相对路径输入,但是你输出~/My,这是无效的,因为它与输入相同,而Pictures/animation.gif作为一些额外的参数在convert结束时加上不知道该怎么办。

你可以通过使用repr(output_dir)来解决这个问题,这将使用适当的Python文字引用,这通常但不总是足以用作bash引用......但是这是一个非常糟糕的主意。


更好的方法是让Python为您做适当的引用。正如os.system文档所说:

  

subprocess模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。

使用subprocess,您只需传递一个参数列表,而不是尝试将它们组成一个有效的命令行,甚至不使用shell - 尽管那时你需要自己做globbing而不是让它们贝壳做到了。

当你使用它时,使用os.path方法而不是字符串方法来处理路径要好得多。

例如:

args = (['convert', '-delay', '1', '-dispose', 'Background', '+page'] +
        glob.glob(os.path.join(output_dir, '*.png')) +
        ['-loop', '0', os.path.join(output_dir, 'animation.gif')])
subprocess.check_call(args)

或者,您仍然可以使用shell,但随后使用shlex.quote为您引用每个参数,正如文档所解释的那样。


更好的解决方案是首先使用三个Python bindings to ImageMagick中的任何一个,而不是尝试构建命令行来驱动ImageMagick命令行工具。