不幸的是,这个问题的公认答案尚未完成...... :-)
三(主要)类参数
假设您的 ImageMagick 版本是最近的版本,这里有一个重要的修正:
您应该区分 3 类主要的命令行参数:
- 图像设置
- 图像运算符
- 图像序列运算符
这三个类的行为确实不同:
图像设置
图像设置在命令行上显示时会持续存在。它可能会影响所有后续处理(但不会影响之前的处理):
- 处理,例如稍后在命令行中读取图像或更多图像;
- 由以下图像操作员完成的处理;
- 通过写入图像作为输出进行的处理。
图像设置保持有效...
- ...直到它被重置或被相同类型的不同设置替换,
- ...或直到命令行终止。
图像运算符
图像运算符应用于(单个)图像并被遗忘。它与图像设置不同,因为它会在图像出现在命令行时立即影响图像。(记住:一个图像设置会一直持续到命令行终止,或者直到它被重置。)
如果您需要将相同的图像运算符应用于同一命令行中的第二个图像,则必须在命令行上重复该运算符。
严格来说,为了符合 ImageMagick 命令行的新架构,所有的图像操作符都应该在加载它所针对的图像之后编写。然而,IM 开发人员妥协了:为了向后兼容,图像操作符仍然可以在加载图像之前出现——然后它们将应用于他们可用的第一个图像。
图像序列运算符
图像序列运算符应用于所有当前加载的图像(然后被遗忘)。
它与简单的图像运算符的不同之处在于它不仅影响单个图像。(一些操作符只有在他们的操作有多个要消费的图像时才有意义:想想-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 将自动为相应的文件名分配索引号。
这对调试(或优化、精简、简化...)复杂的命令设置有很大帮助。