⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://imagemagick.org/script/command-line-processing.php)

命令行的剖析

命令行的剖析 • 输入文件名 • 命令行选项 • 输出文件名

ImageMagick 命令行工具可以像这样简单:

magick image.jpg image.png

也可以像下面这样,带有大量选项而变得复杂:

magick label.gif -alpha Set \
  \( +clone  -shade 110x90 -normalize -negate +clone  -compose Plus -composite \) \
  \( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -alpha Off \) \
  -delete 0 +swap  -compose Multiply -composite  button.gif

这个示例命令足够长,必须分成多行书写,因此我们插入了反斜杠(\)进行格式化以便阅读。反斜杠是 Linux 的续行字符。在 Windows shell 中,续行使用脱字符(^)。在这些网页上,我们采用如上所示的 Linux 风格。不过,如果浏览器窗口足够小,有时这些行会被浏览器自动换行,但以白色显示的命令行仍然意在作为一行输入。续行字符无需输入。上面用反斜杠转义的括号,在 Windows 下不需要转义。Windows 与 Linux 之间还有一些其他差异(例如引号的处理),但我们会在后面遇到时再讨论这些问题。

本站的大多数命令行示例中,如果有可在 Windows 上运行的等效转换版本,右下角会显示一个下拉菜单,让你切换正在预览的命令针对哪个操作系统。

即使对 ImageMagick 命令行了解不多,你也大概能推测出上面第一个命令是将 JPEG 格式的图像转换为 PNG 格式。然而,很少有人能意识到第二个更复杂的命令,是赋予平面的二维标签以丰富纹理和模拟深度的三维外观:

label ==> button

这里我们将任务的完成百分比显示为一个带阴影的圆柱:

Shaded Cylinder

考虑到这种渲染的复杂程度,你可能会惊讶它竟是由单条命令行完成的:

magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
  -draw 'roundrectangle 264, 5, 304, 85  20,40' -tile gradient:chartreuse-green \
  -draw 'roundrectangle 16,  5, 180, 85  20,40' -tile gradient:chartreuse1-chartreuse3 \
  -draw 'roundrectangle 140, 5, 180, 85  20,40' +tile -fill none \
  -draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
  -strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
  -append -background white -gravity center -extent 320x200 cylinder_shaded.png

运行这个由 Geemack 贡献的脚本。你将一窥 ImageMagick 命令行的强大与多才:

magick -background none -size 960x960 xc:black \( xc:darkred -duplicate 1 +append \) \
  xc:gold \( xc:teal -duplicate 2 +append \) -modulate 100,100,"%[fx:rand()*200]" \
  xc:white -scale x1 +append -write mpr:clut +delete radial-gradient: mpr:clut \
  -clut -scale 100x4% -wave "%[fx:rand()*24+24]"x"%[fx:w/ceil(rand()*4+1)]" -extent "%[w]x%[w]" \
  -roll +0+"%[fx:(rand()*w*0.05)+(w*0.51)]" \( +clone -blur 0x4 \) -insert 0 -composite \
  -duplicate "%[fx:floor(rand()*3+3)*2-1]" -set option:rot "%[fx:180/n]" -virtual-pixel tile \
  -virtual-pixel none -distort SRT "%[fx:t*360/n]" +repage -flatten -extent 100x50% \
  \( +clone -rotate 180 \) -append +channel -virtual-pixel none -distort SRT "0.96 %[fx:rand()*360]" \
  \( +clone -flop \) +repage -insert "%[fx:round(rand())]" -background black \
  -flatten -brightness-contrast 20,20 -normalize dragonFire.png

为确保脚本能在 Windows 下运行,请把所有反斜杠加括号(\()改为单纯的括号,把反斜杠(\)改为 ^,并将百分号(%)成对加倍。

在接下来的各节中,我们将剖析 ImageMagick 命令行的结构。仔细阅读并更好地理解命令行的工作原理后,希望你能够完成复杂的图像处理任务,而无需求助于有时令人望而生畏的程序接口

在命令行中使用 ImageMagick 时,更多帮助请参阅 Examples of ImageMagick Usage

命令行的剖析

ImageMagick 命令行由以下部分构成:

  • 一个或多个必需的输入文件名。
  • 零个、一个或多个图像设置(image settings)。
  • 零个、一个或多个图像算子(image operators)。
  • 零个、一个或多个图像序列算子(image sequence operators)。
  • 零个、一个或多个图像栈(image stacks)。
  • 零个或一个输出图像文件名(magickconvertcompositemontagecompareimportconjure 需要)。

关于构成命令行的各组成部分的详细说明,请参阅后续各节。

输入文件名

ImageMagick 将输入文件名的概念扩展为包括:

  • 文件名通配(globbing)
  • 显式的图像格式
  • 使用内置图像和图案
  • STDIN、STDOUT 和文件描述符
  • 从图像中选择某些帧
  • 选择图像的某个区域
  • 强制内联图像调整尺寸
  • 强制内联图像裁剪
  • 使用文件名引用

这些扩展将在接下来的几段中说明。

注意,默认情况下,如果某个命令行选项同时也是一个文件名(例如 -quality),它会被解释为文件名。要改为将其解释为选项,请使用 -define registry:option:pedantic=true。

文件名通配(Globbing)

在 Linux shell 中,星号(*)和问号(?)等特定字符会基于模式匹配自动生成文件名列表。此功能称为通配(globbing)。ImageMagick 为像 Windows 这样原生不支持通配的系统提供了文件名通配支持。例如,假设你想把当前目录下的 1.jpg、2.jpg、3.jpg、4.jpg 和 5.jpg 转换为一个 GIF 动画。你可以用这条命令方便地引用所有 JPEG 文件:

magick *.jpg images.gif

显式的图像格式

图像以无数种图像格式存储,包括较知名的 JPEG、PNG、TIFF 等。ImageMagick 必须先知道图像的格式才能读取和处理它。大多数格式在图像内部都有一个唯一标识该格式的签名。若没有,ImageMagick 会借助文件名扩展名来判定格式。例如,image.jpg 或 image.JPG 会告诉 ImageMagick 它正在读取 JPEG 格式的图像。

某些情况下,图像可能不包含签名,且/或文件名无法标识图像格式。这时必须显式指定图像格式。例如,假设我们的图像名为 image,包含原始的红、绿、蓝强度值。ImageMagick 无法自动判定图像格式,所以我们显式设定一个:

magick -size 640x480 -depth 8 rgb:image image.png

内置图像和图案

ImageMagick 有许多内置图像图案。例如,要使用棋盘格(checkerboard)图案,请用:

magick -size 640x480 pattern:checkerboard checkerboard.png

STDIN、STDOUT 和文件描述符

Linux 和 Windows 允许将一个命令的输出通过管道传给另一个命令的输入。ImageMagick 允许使用伪文件名 - 从标准流 STDIN(标准输入)和 STDOUT(标准输出)分别读取和写入图像数据。在这个例子中,我们把 magick 的输出通过管道传给 display 程序:

magick logo: gif:- | magick display gif:-

在上面的例子中,第二个显式格式 "gif:" 是可选的。GIF 图像格式在图像内部有唯一的签名,因此 ImageMagick 的 display 命令能够轻易将该格式识别为 GIF。magick 程序也以这种方式接受 STDIN 作为输入:

magick rose: gif:- | magick - -resize "200%" bigrose.jpg'

其他管道可以通过其文件描述符访问(自 6.4.9-3 版本起)。文件描述符 0、1、2 分别保留给标准流 STDIN、STDOUT 和 STDERR,但与描述符编号 N>2 关联的管道可以使用伪名 fd:N 访问。(伪名 fd:0 和 fd:1 可用于 STDIN 和 STDOUT。)下一个例子展示了如何把从描述符 3 和 4 管道传入的图像数据追加起来,并将结果定向到描述符编号 5 的文件:

magick fd:3 fd:4 -append fd:5

需要时,可以像前面提到的那样给出显式图像格式,如下所示:

magick gif:fd:3 jpg:fd:4 -append tif:fd:5

选择帧

某些图像格式包含不止一个图像帧。也许你只想要第一个图像、最后一个,或介于其间的若干个。你可以通过在图像文件名后追加用方括号括起的帧范围来指定要读取哪些图像帧。这里我们的图像(一个动画 GIF)包含不止一帧,但我们只想要第一帧:

magick 'images.gif[0]' image.png

Linux shell 通常会解释方括号,因此上面我们将文件名用引号括起。在 Windows 命令 shell 中方括号不会被解释,但使用引号无妨。不过,在大多数情况下,单引号和双引号的角色在 Linux 与 Windows 之间是相反的,因此 Windows 用户在我们显示单引号的地方通常应改用双引号,反之亦然。

你可以用帧范围从一个序列中读取多个图像。例如,可以提取图像序列的前四帧:

magick 'images.gif[0-3]' images.mng

默认每次步进一帧,因此返回帧 0、1、2 和 3。用 -define frames:step=2 将步长设为 2,则改为得到帧 0 和 2。

最后,你可以从序列中无序地读取多个图像。下面这条命令获取序列中的第四个图像,接着是第三个,然后是第五个:

magick 'images.gif[3,2,4]' images.mng

注意,在最后两条命令中写出的是单个图像。在此情况下,由于图像类型为 MNG,而 MNG 格式支持多帧,所以输出是一个多帧文件。如果输出格式是只支持单帧的 JPG,则输出将由分开的多帧组成。关于这一点,将在下面“输出文件名”一节中进一步说明。

选择图像区域

原始(raw)图像是一串颜色强度值,不带宽度、高度或图像签名等附加元信息。对于原始图像格式,你必须指定图像的宽和高,但也可以指定要读取的图像区域。在我们的例子中,图像为原始 8 位 RGB 格式,宽 6000 像素、高 4000 像素。然而,我们只想要图像中央附近 600×400 的区域:

magick -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg

-extract 选项可以得到相同的结果:

magick -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg

内联图像调整尺寸

在读取图像时同时调整其尺寸有时很方便。假设你有数百张大型 JPEG 图像,想转换为一系列 PNG 缩略图:

magick '*.jpg' -resize 120x120 thumbnail%03d.png

这里所有图像先被读取,随后再调整尺寸。在每张图像被读取时就调整其尺寸会更快,资源消耗也更少:

magick '*.jpg[120x120]' thumbnail%03d.png

内联图像裁剪

在读取图像时同时裁剪它有时很方便。假设你有数百张大型 JPEG 图像,想转换为一系列 PNG 缩略图:

magick '*.jpg' -crop 120x120+10+5 thumbnail%03d.png

这里所有图像先被读取,随后再裁剪。在每张图像被读取时就裁剪它会更快,资源消耗也更少:

magick '*.jpg[120x120+10+5]' thumbnail%03d.png

文件名引用

有两种方法可以用一个文件名来引用其他图像文件名。第一种是用 '@',它从指定文件中读取以空白分隔的图像文件名。假设文件 myimages.txt 由如下的文件名列表组成:

frame001.jpg
frame002.jpg
frame003.jpg

那么我们期望这条命令:

magick @myimages.txt mymovie.gif

会读取图像 frame001.jpg、frame002.jpg 和 frame003.jpg,并将它们转换为一个 GIF 图像序列。

如果图像路径包含一个或多个空格,请将路径用引号括起:

'my title.jpg'

某些 ImageMagick 命令行选项可能超出你的命令行处理器的能力。例如,Windows 将命令行限制为 8192 个字符。例如,如果你有一个带多边形点的 draw 选项超过了命令行长度限制,请改为把 draw 选项放入一个文件,并用 @ 引用该文件(例如 @mypoly.txt)。

引用其他图像文件的另一种方法是在文件名中嵌入格式化字符并附带场景范围。考虑文件名 image-%d.jpg[1-5]。这条命令

magick image-%d.jpg[1-5]

会使 ImageMagick 尝试读取这些文件名的图像:

image-1.jpg
image-2.jpg
image-3.jpg
image-4.jpg
image-5.jpg

流缓冲

默认情况下,输入流是带缓冲的。为确保源文件或终端上的信息一旦可用就被读取,请将缓冲区大小设为 0:

magick logo: gif:- | magick display -define stream:buffer-size=0 gif:-

命令行选项

你可以用这些命令行选项来引导 ImageMagick 工具的行为。某个选项的行为属于以下类别之一:

  • 图像设置(Image Setting)
  • 图像算子(Image Operator)
  • 图像通道算子(Image Channel Operator)
  • 图像序列算子(Image Sequence Operator)
  • 图像几何(Image Geometry)
  • 图像栈(Image Stack)

图像设置(Image Setting)

图像设置自其出现在命令行上起持续生效,并会适当地影响后续处理,例如读取图像、图像算子或写出图像。图像设置在被重置或命令行结束之前一直有效。图像设置包括:

在这个例子中,正如我们所说设置会持续生效,因此 -channel 会应用于每一张图像:

magick -channel RGB wand.png wizard.png images.png

图像算子(Image Operator)

图像算子与设置的不同之处在于,它在出现于命令行上时立即作用于图像。算子是指任何未被列为图像设置或图像序列算子的命令行选项。与会持续到命令行结束的图像设置不同,算子会应用于当前图像集然后被遗忘。图像算子包括:

在这个例子中,-negate 会反转 wand 图像,但不会反转 wizard:

magick wand.png -negate wizard.png images.png

注意,图像算子会应用于图像序列中的每一张图像。例如,如果你用 -resize 选项调整一个 GIF 图像的尺寸,每一帧都会被调整为给定的尺寸。然而,某些帧可能比整幅图像更小,将所有帧调整为相同尺寸可能导致非预期的输出。在这种情况下,应使用 -coalesce 来准备这些帧。

图像通道算子(Image Channel Operator)

直接作用于图像通道:

图像序列算子(Image Sequence Operator)

图像序列算子与设置的不同之处在于,它在出现于命令行上时立即作用于图像序列。可从以下图像序列算子中选择:

在这个例子中,-append 将三张图像连接成一张:

magick mikayla.png picnic.png beach.png -append vacation.png

图像几何(Image Geometry)

许多命令行选项接受一个几何参数,用于指定诸如图像期望的宽度和高度以及其他尺寸量。由于用户对结果的尺寸、大小和位置有非常多的变体需求(而 ImageMagick 也希望满足这些需求),几何参数可以采用多种形式。我们在本节中描述其中许多形式。

接受某种形式几何参数的图像选项和设置包括以下这些。请记住,其中一些会以略有不同的方式解析其参数。更具体的信息请参阅各个选项或设置的文档。

几何参数可以采用下表所列形式中的任意一种。这些将在表后的各小节中更详细地说明。通常的形式是 size[offset],意为 size 是必需的而 offset 是可选的。偶尔也可以是 [size]offset。无论何种情况,几何参数内都不允许有空格。

size 一般说明(实际行为对不同的选项和设置可能有所不同)
scale% 高度和宽度都按指定百分比缩放。
scale-x%xscale-y% 高度和宽度按各自指定的百分比分别缩放。(只需一个 % 符号。)
width 给定宽度,高度自动选择以保持纵横比。
xheight 给定高度,宽度自动选择以保持纵横比。
widthxheight 给定高度和宽度的最大值,保持纵横比。
widthxheight^ 给定宽度和高度的最小值,保持纵横比。
widthxheight! 强制给定宽度和高度,忽略原始纵横比。
widthxheight> 缩小尺寸大于对应宽度和/或高度参数的图像。
widthxheight< 放大尺寸小于对应宽度和/或高度参数的图像。
area@ 将图像调整为具有指定的像素面积。保持纵横比。
x:y^ 删除行或列以达到给定的纵横比。
x:y# 增加行或列以达到给定的纵横比。
{size}{offset} 指定偏移量(默认为 +0+0)。下文中 {size} 指上面任意一种形式。
{size}{+-}x{+-}y 以像素指定水平和垂直偏移量 x 和 y。两者都必须带符号。偏移量受 -gravity 设置影响。偏移量不受 % 或其他 size 算子影响。注意,对于除 'center' 外的所有 -gravity 选项,正的 X 和 Y 偏移量是朝向图像中心的内向方向。对 East,+X 是向左;对 South,+Y 是向上;对 SouthEast,+X 是向左、+Y 是向上。对 center,使用通常的 X、Y 方向约定(+X 向右,+Y 向下)。

对宽度和高度的基本调整: 算子 %、^ 和 !

紧接下面是几个简单的几何示例,展示它如何作为 -resize 选项的参数使用。我们用内部图像 logo: 作为输入图像。这幅精美的图像宽 640 像素、高 480 像素。我们说它的尺寸是 640x480。当我们给出图像的尺寸时,宽度(水平维度)总是先于高度(垂直维度)。在我们谈论图像内的坐标或偏移量时也是如此,总是 x 值后跟 y 值。回想一下你高中代数课和 xy 平面就好。(不过几乎如此:我们的 y 轴总是向下!)

magick logo: -resize '200%' bigWiz.png
magick logo: -resize '200x50%' longShortWiz.png
magick logo: -resize '100x200' notThinWiz.png
magick logo: -resize '100x200^' biggerNotThinWiz.png
magick logo: -resize '100x200!' dochThinWiz.png

这四条命令中的第一条很简单——它将输入图像的宽度和高度在各方向上拉伸 200%;它把整体放大两倍。第二条为每个方向指定不同的百分比,将宽度拉伸到 200%,将高度压缩到 50%。(在此例中)结果图像的尺寸为 1280x240。注意百分号无需重复;以下是等效的: 200x50%、200%x50、200%x50%。

默认情况下,除非指定了百分比,几何参数中给定的宽度和高度都是最大值。也就是说,图像会在保持纵横比(其高度与宽度之比)的同时,被放大或缩小以适配指定的宽高值。例如,上面第三条命令“试图”将尺寸设为 100x200。想象一下逐渐缩小原始图像(即 640x480),保持其纵横比不变,直到它恰好装入一个 100x200 的矩形。由于图像横向比纵向长,它会在宽度缩到 100 像素时装入。为保持纵横比,高度因此必须变为 (480/640)×100 像素 = 75 像素,所以最终尺寸将是 100x75。

注意在前一个例子中,指定尺寸中至少有一个会被达到(在此情况下是宽度 100 像素)。结果图像恰好装入原始之内。可以通过调用 ^ 算子做相反的事,如上面第四个例子所示。在那种情况下,当给出 100x200^ 作为参数时,同样至少有一个尺寸会被达到,但这次结果图像能恰好包含原始图像。这里几何参数给出的是最小值。在我们的例子中,高度将变为 200,宽度将被缩放以保持纵横比,变为 (640/480)×200 像素 = 267 像素。使用 ^ 算子时,其中一个尺寸会与请求的尺寸匹配,但图像很可能会超出所请求的尺寸以保持其纵横比。(^ 功能是 IM 6.3.8-2 起的新功能。)

我们看到 ImageMagick 在保持图像纵横比方面非常出色,可防止你心爱的照片和图像变形。但你也许真的想让尺寸为 100x200,从而拉伸图像。在这种情况下,只需通过在几何参数后追加感叹号算子(!)来告诉 ImageMagick 你是认真的。这会强制图像尺寸正好为你所指定的值。例如,如果你指定 100x200!,尺寸将正好变为 100x200(得到一个小巧、纵向拉长的 wizard)。

限定宽度、高度和面积: 算子 >、< 和 @

这里再举几个例子:

magick logo: -resize '100' wiz1.png
magick logo: -resize 'x200' wiz2.png
magick logo: -resize '100x200>' wiz3.png
magick logo: -resize '100x200<' wiz4.png

如果只给出一个尺寸,则将其视为宽度。当只指定宽度时(如上面第一个例子),宽度按给定值接受,高度则被选择以保持输入图像的纵横比。同样,如果只指定高度(如上面第二个例子),高度被接受,宽度则被选择以保持纵横比。

使用 > 仅在图像尺寸大于对应的宽度和/或高度参数时缩小它。使用 < 仅在图像尺寸小于对应的宽度和/或高度参数时放大它。无论哪种情况,如果发生了变更,其结果就如同 > 或 < 算子不存在一样。所以在上面第三个例子中,我们指定了 100x200>,而原始图像尺寸为 640x480,因此图像尺寸会被缩小,如同我们指定了 100x200 一样。然而在上面第四个例子中,其尺寸不会有任何变化。

最后,使用 @ 可以指定图像的最大面积(以像素计),同样会尝试保持纵横比。(像素只能取整数值,所以总是存在一定的近似。)在下面的例子中,请求了 10000 像素的面积。结果文件的尺寸为 115x86,即 9890 像素:

magick logo: -resize '10000@' wiz10000.png

在上面以及下面的所有例子中,我们都将几何参数用引号括起。在许多情况下这样做是可选的,但并非总是如此。当使用 < 或 > 时,我们必须将几何指定用引号括起,以防止这些字符被 shell 解释为文件重定向。在 Windows 系统上,脱字符 ^ 需要放在引号内,否则会被忽略。为安全起见,最好像我们这里这样,保持把所有几何参数用引号括起的习惯。

几何中的偏移量

这里有一些例子来说明几何参数中偏移量的用法。偏移量的一种典型用法是与 -region 选项配合使用。该选项允许许多其他选项修改图像中指定矩形子区域内的像素。因此,需要给它该区域的宽度和高度,以及一个进入图像的偏移量,即一对坐标,用于指示该区域在较大图像内的位置。下面,在第一个例子中,我们指定一个大小为 100x200、位于 xy 坐标 x=10, y=20 的区域。为方便起见,让我们使用通常的代数记法 (x,y)=(10,20)。

magick logo: -region '100x200+10+20' -negate wizNeg1.png
magick logo: -region '100x200-10+20' -negate wizNeg2.png
magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png

注意偏移量总是需要 +/− 符号。偏移量实际上并不是图像内的真实位置;它的坐标必须加到某个其他位置上。我们把那个位置称为当前位置(current location)。不过,在上面第一个和第二个例子中,那个位置是图像的左上角,其坐标为 (0,0)。(这是没有给出改变它的其他指令时的默认情形。)上面第一个例子把 100x200 矩形自身的左上角置于 (10,20)。

负偏移量在许多情况下也是有意义的。在上面第二个例子中,偏移量为 (-10,20),由 -10+20 指定。在这种情况下,所得到的(虚拟)矩形中只有位于图像之内的部分会被反转;这里它等同于将几何指定为 90x200+0+20。

在上面第三个例子中,-gravity 设置先于其他出现,将图像内的当前位置设为图像的正中心。在此情况下,由于图像尺寸为 640x480,那就是像素 (320,240)。这意味着偏移量应用于该位置,于是该位置在此情况下移动到 (320-10,240+20)=(310,260)。但 100x200 区域本身也受 -gravity 设置影响,因此确定的不是它的左上角,而是该区域自身的中心(位于其内部的 (+50,+100))。因此 100x200 矩形的中心移动到 (310,260)。反转后矩形的左上角现在位于 (310-50,260-100)=(260,160)。

图像栈(Image Stack)

在学校里,老师大概允许你在草稿纸上解题,然后把结果抄到试卷上。图像栈与此类似。它允许你单独处理一张图像或一个图像序列,随后把结果引回命令行。图像栈用括号界定。图像算子只影响当前栈中的图像。例如,我们可以像这样将图像旋转仅限定于 wizard 图像:

magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif

再次注意,括号通过在前面加反斜杠来转义。这在括号是特殊 shell 字符的 Linux 下是必需的。反斜杠告诉 shell 不要解释这些字符,而是将它们直接传给被执行的命令。在 Windows 下不要转义括号。每个括号(或转义的括号)两侧都必须有空格,如上面所示的例子。

除了已经讨论过的图像算子之外,以下图像算子在处理图像栈中的图像时最为有用:

这些算子的参数是按编号进入图像序列的索引,从零开始表示第一张图像,依此类推。然而,如果你给出负索引,则图像从末尾(最后添加的图像)开始索引。也就是说,索引 -1 是当前图像序列中的最后一张图像,-2 是倒数第二张,依此类推。

输出文件名

ImageMagick 将输出文件名的概念扩展为包括:

  1. 显式的图像格式
  2. 写入标准输出
  3. 文件名引用

这些扩展将在接下来的几段中说明。

你可以使用 -exit 来代替输出文件名,从而完全阻止任何图像写出。

显式的图像格式

图像可以以无数种图像格式存储,包括较知名的 JPEG、PNG、TIFF 等。ImageMagick 必须先知道图像期望的格式才能写出它。ImageMagick 借助文件名扩展名来判定格式。例如,image.jpg 告诉 ImageMagick 以 JPEG 格式写出图像。某些情况下文件名无法标识图像格式。这时,除非指定了显式的图像格式,否则图像会以其最初被读取时的格式写出。例如,假设我们想以原始的红、绿、蓝强度格式把图像写到名为 image 的文件:

magick image.jpg rgb:image

标准输出

Linux 允许将一个命令的输出通过管道传给另一个命令。ImageMagick 允许用文件名 - 将一个命令通过管道传给另一个命令。在这个例子中,我们把 magick 的输出通过管道传给 display 程序:

magick logo: gif:- | magick display gif:-

这里显式格式是可选的。GIF 图像格式有一个唯一标识它的签名,因此 ImageMagick 能够轻易将该格式识别为 GIF。

文件名引用

可选地,使用嵌入的格式化字符来写出连续的图像列表。假设我们的输出文件名是 image-%d.jpg,而我们的图像列表包含 3 张图像。你可以预期会写出这些图像文件:

image-0.jpg
image-1.jpg
image-2.jpg

或者,检索图像属性以修改图像文件名。例如,这条命令

magick rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'

会写出具有此文件名的图像:

rose-70x46.png

最后,要把多张 JPEG 图像转换为各自独立的 PDF 页面,请用:

magick *.jpg +adjoin page-%d.pdf

使用 -define filename:literal=true 可以绕过对嵌入格式化字符的解释,转而按字面使用文件名。

流缓冲

默认情况下,输出流是带缓冲的。为确保写出的信息一旦写入就出现在目标文件或终端上,请将缓冲区大小设为 0:

magick -define stream:buffer-size=0 logo: gif:- | magick display gif:-