TL;DR
本文末尾给出了一种非常简单、独立于引用的跨平台编写 ImageMagick 脚本的方法...
关于引号和引用以及转义和转义 ImageMagick 命令bash
、CMD32 和 Powershell
由于其纯粹的多功能性和力量,图像魔术师提供比大多数命令行程序更丰富的选项、开关和参数(列出了大约 300 个选项和开关)here)并且它使用字符和符号来让用户以非常自然的方式表达事物。因此,使用时需要一定程度的谨慎图像魔术师在它可以运行的许多环境中,即:
- under
bash
或其他 Unix/Linux shell,例如zsh
, ksh
, tcsh
,
- 在 Windows CMD32 和 Windows BATCH 文件中,
- under
Powershell
- 在 MinGW、MSYS、Cygwin 等工具下
例如,就其本身而言,不考虑外壳,图像魔术师了解以下内容:
-
#
或哈希,又名井号,用于以自然的方式表达十六进制颜色,例如-fill #ff0000
用于红色填充颜色。然而,bash
将相同的字符解释为引入注释,所以在bash
你通常会写-fill '#ff0000'
-
()
或括号。图像魔术师使用括号将处理应用于堆栈中的特定图像,也称为“搁置处理”。因此,此命令加载两个图像并调整两个图像的大小magick IMAGE1.PNG IMAGE2.PNG -resize 800x600 ...
但如果你只想调整第二个的大小,你会这样做magick IMAGE1.PNG ( IMAGE2.PNG -resize 800x600 ) ...
然而,bash
对子流程使用括号,因此它会认为您想要运行一个名为的子流程IMAGE2.PNG
除非你用转义括号magick IMAGE1.PNG \( IMAGE2.PNG -resize 800x600 \) ...
。同样地,Powershell
会反对括号,并且您必须在左括号和右括号之前加上反引号。 CMD32 根本不将括号视为特殊的,因此它们在该环境中不需要转义。
-
()
或括号。图像魔术师使用它们来引入十六进制或 hsl 颜色,例如-fill RGBA(255,0,0)
or -fill hsl(50,60,70)
。再次,bash
会不喜欢这样,认为你想要一个子 shell,所以人们写-fill "rgb(255,0,0)"
。我假设Powershell
也不会喜欢。
-
%
或百分比。图像魔术师通常使用它和类似的方法将图像大小调整为其原始大小的 50%-resize 50%
。但是,如果您在 Windows BATCH 文件中使用百分号,则需要将它们加倍,否则它会认为您正在引用其命令行参数。
-
<
and >
,或小于和大于。图像魔术师 uses >
意味着您只想将调整大小应用于大于特定尺寸的图像,例如-resize 800>
这意味着您只想将大于 800 的图像缩小到 800,但不希望将 800 以下的图像放大。同样与<
。然而,bash
使用这些字符来重定向输入和输出,所以在bash
你通常会写-resize '800>'
同样在 CMD32 中,您需要转义两者<
and >
前面加上插入符号^
。并在前面加上反引号Powershell
.
-
!
或感叹号,又名"bang". 图像魔术师用这个来表示“去做就对了!”。所以,举例来说,-resize 800x600
表示您要调整大小,使宽度不超过 800,高度不超过 600,并且应尊重宽高比。然而,当你像这样添加刘海时-resize 800x600!
即使图像严重扭曲,您也将获得精确的 800x600 像素。 shell 可以将感叹号解释为对其先前命令的历史记录进行一些操作,因此您经常会看到转义
-
[
and ]
,或方括号。图像魔术师使用它们来引用多页文档(例如 PDF 或 TIFF)中的页面或页面子集。例如,以下内容表示 PDF 的第一页和最后一页,magick DOCUMENT.PDF[0,-1] ...
如果您不小心处理它,这可能会与用于交替的 shell 语法混淆
-
*
或星号。图像魔术师将星号理解为通配符以扩展所有匹配文件的列表,例如*.tif
表示当前目录中的所有 TIFF 文件。那是一样的bash
,但这里有一些细微差别。如果你使用magick *.tif ...
,您的 shell 将扩展 TIFF 列表bash
这将取决于您的系统ARGMAX
。但如果你这样做magick '*.TIF' ...
它将在内部扩展图像魔术师且不受此类限制。
bash 和 Unix/Linux shell 的一般提示
-
行继续符是反斜杠
-
必须在左括号和右括号前使用反斜杠进行转义
-
哈希值必须位于双引号或单引号字符串内
的例子bash
command
magick IMAGE1.PNG \
\( IMAGE2.PNG -resize 50% -fill '#ff0000' -colorize 100% \) \
-composite -transparent 'hsl(40,50,60)' result.png
Windows CMD32 的一般提示
-
插入符号^
用作转义字符
-
CMD32 通常不喜欢任何单引号的使用。
一般来说,如果从bash
的咒语图像魔术师,尝试用双引号替换单引号。例外情况是当已经在双引号内时,您可以使用单引号,例如-draw "text 100,100 'Works like magick'"
-
插入符号用作行继续字符,以这种方式使用时后面不能跟任何空格
-
BATCH 中的百分号必须加倍
-
括号不需要转义
Windows CMD32 BATCH 命令示例
magick IMAGE1.PNG ^
( IMAGE2.PNG -resize 50%% -fill "#ff0000" -colorize 100% ) ^
-composite -transparent "hsl(40,50,60)" result.png
Powershell 的一般提示
- 反引号用作转义字符,行继续字符
- 左括号和右括号必须用前面的反引号转义
Powershell 命令示例
magick IMAGE1.PNG `
`( IMAGE2.PNG -resize 50% -fill "#ff0000" -colorize 100% `) `
-composite -transparent "hsl(40,50,60)" result.png
TL;DR
如果您想要跨平台或独立于平台的编写方式图像魔术师脚本,最简单的是将所有命令放在一个文件中,该文件的内容只能由图像魔术师它本身而不是依赖于你的 shell。所以,写一个像这样的脚本,它是纯粹的,没有引用,并将其另存为script.mgk
:
-size 640x480 xc:#ffff00
( foreground.png -resize 50% )
-gravity center -composite -write result.png
然后用以下命令调用它:
magick -script script.mgk
而你的 shell,无论是什么,甚至看不到引号、百分号、井号、续行符或括号:
比较和对比bash
你需要的地方:
magick -size 640x480 xc:'#ffff00' \
\( foreground.png -resize 50% \) \
-gravity centre -composite result.png
和窗户CMD32.EXE
你需要的地方:
magick -size 640x480 xc:#ffff00 ^
( foreground.png -resize 50%% ) ^
-gravity centre -composite result.png