2

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

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

我想知道的是:

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

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

4

2 回答 2

11

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

三(主要)类参数

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

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

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

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

  1. 图像设置

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

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

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

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

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

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

  3. 图像序列运算符

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

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

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

(为了完整起见,我应该补充一下:还有另一类miscellanious其他参数,它们不属于上述任何类别。想想-debug-verbose-version。)

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

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

哪个是哪个?!?

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

 convert -help | less

搜索您的参数。找到后,向后滚动:然后您应该找到它所在的“标题”。现在您可以确定它是哪种类型:图像设置图像运算符图像序列运算符- 并考虑我在上面所说的。

更多建议

如果你的工作是将你的 ImageMagick 接口从 PerlMagick 移植到 CLI,你应该知道另一个技巧:你可以插入

 +write output-destination

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

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

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

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

于 2014-11-14T22:54:50.470 回答
6

转换操作是从左到右执行的吗?即我通过它们的顺序

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

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

一模糊 两个模糊

于 2014-10-27T11:35:23.207 回答