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