【问题标题】:Python, converting png to gif using ImageMagickPython,使用 ImageMagick 将 png 转换为 gif
【发布时间】:2014-03-17 09:47:17
【问题描述】:

我使用的是 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")

这是我遇到的错误

参数无效 - 1

【问题讨论】:

  • 您使用os.system 而非subprocess 是否有原因,正如the os.system docs 所建议的那样?或者,更好的是,使用 Python 绑定到 ImageMagick,而不是尝试编写命令行工具的脚本?
  • 另外,output_dir 中有什么内容?它是否有任何空格、引号或其他特殊字符?更一般地说,您可以print 发送给os.system 的完全相同的字符串来查看它的样子吗?然后验证是否将完全相同的字符串粘贴到 shell 中是否有效?
  • 附带说明,如果您的终端实际上​​显示“ParamŠtre non valide”而不是“Paramétre non valide”,则您的编码或语言环境可能在某处设置错误。 (这看起来就像您在某些西欧字符集(例如 Latin-1)中输出文本,然后将其显示为某些东欧字符集(例如 Latin-9)所得到的结果。)

标签: python imagemagick png gif os.system


【解决方案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 而不是让 shell去做吧。

当您使用它时,使用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 命令行工具。

【讨论】:

  • 谢谢,这对我帮助很大。
  • 我知道是旧线程,但可能会发生此错误,因为它正在执行另一个转换实用程序,可能是 windows 转换分区实用程序。您是否安装了带有“旧版”程序的 Inagemagick?或者你检查过路径吗?
猜你喜欢
  • 2016-06-30
  • 2023-03-23
  • 2011-03-12
  • 2011-06-21
  • 2020-06-14
  • 2011-02-21
  • 2021-07-26
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多