【问题标题】:ImageMagick Command-Line Option Order (and Categories of Command-Line Parameters)ImageMagick 命令行选项顺序(和命令行参数的类别)
【发布时间】:2014-12-22 03:27:13
【问题描述】:

我的主管要求我将 Perl 脚本中使用 PerlMagick 的部分转换为管道并使用 ImageMagick 的命令行版本(出于各种不相关的原因)。

使用我们现有的界面(裁剪、缩放、保存等),我正在构建用户想要对图像执行的操作列表,构建要管道的语句,然后执行它。

我想知道的是:

  1. 是否从左到右执行转换操作?即我通过它们的顺序
  2. 如果我通过两次相同的选项会发生什么?它们是分开执行的吗?

显然,对图像执行操作的顺序至关重要,因此我正在尝试确定我是否可以一次性执行所有操作(可能会提高效率?)或者我是否打算这样做必须分别执行每个操作。 谢谢

【问题讨论】:

标签: perl imagemagick command-line-arguments imagemagick-convert perlmagick


【解决方案1】:

转换操作是从左到右执行的吗?即我的订单 通过他们

是的。如果我举以下两个例子,除了操作顺序之外,它们是相同的,我可以预期从左到右的不同结果。

convert rose: -sample 300% -wave 5x10 rose_post_wave.png
convert rose: -wave 5x10 -sample 300% rose_pre_wave.png

您可以在图像采样之后或之前看到波形操作对图像的影响。

如果我通过两次相同的选项会发生什么?他们执行了吗 分开?

将执行两次。不存在特殊锁定或自动操作计数。

convert rose: -blur 0.5x0.5 -scale 300% rose_blur1.png
convert rose: -blur 0.5x0.5 -blur 0.5x0.5 -scale 300% rose_blur2.png

【讨论】:

  • 太好了,谢谢!因此,通过重复一个选项(在您的示例中为模糊),它会将它们都视为操作吗?这很方便知道!
  • 好答案! (当显示特定命令的示例时,我总是喜欢它,尤其是当它们的输出得到很好的说明时......)
【解决方案2】:

不幸的是,这个问题的公认答案尚未完成...... :-)

三(主要)类参数

假设您的 ImageMagick 版本是最新版本,这里有一个重要的修正:

  • 您应该区分 3 类主要的命令行参数:

    1. 图像设置
    2. 图像运算符
    3. 图像序列运算符

这三个类的行为确实不同:

  1. 图像设置

    1. 图像设置在命令行中显示时会持续存在。 它可能会影响所有后续处理(但不影响之前的处理):

      • 稍后在命令行中读取图像或更多图像等处理;
      • 由以下图像操作员完成处理;
      • 通过将图像写入输出来进行处理。
    2. 图像设置保持有效...

      • ...直到它被重置或被相同类型的不同设置替换,
      • ...或直到命令行终止。
  2. 图像运算符

    1. 图像运算符 应用于(单个)图像并被遗忘。 它不同于图像设置,因为它会在图像出现在命令行时立即影响图像。 (记住:图像设置会一直持续到命令行终止,或者直到它被重置。)

    2. 如果您需要在同一命令行中将相同的图像运算符应用于第二张图像,则必须在命令行中重复该运算符。

    3. 严格来说,按照 ImageMagick 命令行的新架构,所有图像操作符都应该写在要加载的图像之后. 但是,IM 开发人员妥协了: 为了向后兼容,图像操作符仍然可以在加载图像之前出现——然后它们将被应用到它们可用的第一个图像。

  3. 图像序列运算符

    1. 一个图像sequence 运算符应用于所有当前加载的图像(然后被遗忘)。

    2. 它与简单的图像运算符的不同之处在于它不仅仅影响单个图像。 (一些操作符只有在他们的操作有多个图像供消费时才有意义:想想-append、-combine、-composite、-morph...)

根据以上原则,您已经可以得出结论:在大多数情况下,命令行参数的顺序很重要。(如果您知道它们的作用,那么您也知道应用它们需要使用哪个顺序.)

(为了完整起见,我应该补充一下:还有另一类 miscellanious 或 other 参数,它们不属于上面列出的任何类别。想想-debug、-verbose 或 -version。)

不幸的是,这 3 类 IM 命令行参数之间的明显区别在 IM 用户(否则非常精通)中还不是常识。因此,获得更多曝光是值得的。

ImageMagick 主要版本 6 引入了这种明显的区别。之前,它更加令人困惑:一些设置的语义随着上下文以及它们的给出顺序而变化。复杂命令的结果并不总是可预测的,有时甚至令人惊讶且不合逻辑。 (现在它们有时也可能令人惊讶,但是当您仔细观察它们并理解上述内容时,它们总是很合乎逻辑的。)

哪个是哪个?!?

当您不确定某个特定参数属于哪个类时,运行

 convert -help | less

搜索您的参数。找到后,向后滚动:然后您应该找到它所在的“标题”。现在您可以确定它是哪种类型:Image Setting、Image Operator 或 Image Sequence Operator——并考虑到我在上面对他们说过的话。

更多建议

如果您的工作是将 ImageMagick 界面从 PerlMagick 移植到 CLI,您应该了解另一个技巧:您可以插入

 +write output-destination

在命令行的任何地方(甚至多次)。然后,这会将当前加载的图像(或当前加载的图像序列)以其当前处理状态写出到给定的输出目的地。 (把它想象成类似于 tee-shell/终端使用命令,它将 <stdout> 的副本重定向到一个文件中 .) 输出目的地可以是一个文件,或show: 或其他任何对IM 输出有效的东西。写入输出后,将继续处理完整的命令。

当然,只有在第一个(或任何其他)图像运算符之后插入+write 才有意义——否则当前图像列表不会改变。

如果有多个输出图像(因为当前图像列表包含多个图像),那么 ImageMagick 会自动为相应的文件名分配索引号。

这对于调试(或优化、精简、简化...)复杂的命令设置很有帮助。

【讨论】:

    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 2020-07-20
    • 2017-02-05
    • 1970-01-01
    • 2021-01-27
    • 2016-03-25
    • 2021-08-21
    相关资源
    最近更新 更多