命令行的构成 • 输入文件名 • 命令行选项 • 输出文件名
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 格式的图像。但是,很少有人会意识到第二个更复杂的命令会使二维平面标签呈现出三维外观,并具有丰富的纹理和模拟深度。
这里我们显示任务的完成百分比,作为一个阴影圆柱体。
鉴于渲染的复杂性,您可能会惊讶地发现它是通过单个命令行完成的。
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 使用示例,以在从命令行使用 ImageMagick 时获得更多帮助。
命令行的构成
ImageMagick 命令行由以下部分组成:
- 一个或多个必需的输入文件名。
- 零个、一个或多个图像设置。
- 零个、一个或多个图像操作符。
- 零个、一个或多个图像序列操作符。
- 零个、一个或多个图像堆栈。
- 零个或一个输出图像文件名(由magick、convert、composite、montage、compare、import、conjure需要)。
您可以在接下来的部分中找到命令行每个组成部分的详细说明。
输入文件名
ImageMagick 将输入文件名的概念扩展到包括:
- 文件名通配
- 显式图像格式
- 使用内置图像和图案
- STDIN、STDOUT 和文件描述符
- 从图像中选择特定帧
- 选择图像区域
- 强制内联图像调整大小
- 强制内联图像裁剪
- 使用文件名引用
这些扩展将在接下来的几段中解释。
请注意,默认情况下,如果命令行选项也是文件名(例如,-quality),则将其解释为文件名。使用-define registry:option:pedantic=true将其解释为选项。
文件名通配
在 Linux shell 中,某些字符(如星号 (*) 和问号 (?))会自动根据模式匹配生成文件名列表。此功能称为通配。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 有许多内置图像和图案。例如,要使用棋盘格图案,请使用:
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(仅支持单帧),则输出将由单独的帧组成。更多内容请参见下面有关输出文件名的部分。
选择图像区域
原始图像是一系列颜色强度,没有其他元信息,例如宽度、高度或图像签名。对于原始图像格式,您必须指定图像宽度和高度,但您也可以指定要读取的图像区域。在我们的示例中,图像采用原始 8 位 RGB 格式,宽 6000 像素,高 4000 像素。但是,我们只需要图像中心附近 600 x 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 个字符。例如,如果您有一个带有超过命令行长度限制的多边形点的绘图选项,请将绘图选项放在文件中,并使用@引用该文件(例如@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 实用程序的行为。选项的行为属于以下类别之一:
图像设置
图像设置会持续存在,因为它出现在命令行上,并且可能会影响后续处理,例如读取图像、图像操作符或在适当时写入图像。图像设置会一直有效,直到它被重置或命令行终止。图像设置包括:
-
-adjoin •-affine •-alpha •-antialias •-authenticate •-background •-bias •-black-point-compensation •-blue-primary •-bordercolor •-caption •-channel •-comment •-compress •-debug •-define •-delay •-density •-depth •-direction •-display •-dispose •-dither •-encoding •-endian •-extract •-family •-fill •-filter •-font •-format •-fuzz •-geometry •-gravity •-green-primary •-interlace •-intent •-interpolate •-label •-limit •-linewidth •-log •-loop •-mattecolor •-monitor •-orient •-page •-pointsize •-preview •-quality •-quiet •-read-mask •-red-primary •-region •-render •-repage •-sampling-factor •-scene •-seed •-size •-stretch •-stroke •-strokewidth •-style •-texture •-tile •-transparent-color •-treedepth •-type •-undercolor •-units •-verbose •-virtual-pixel •-weight •-write-mask
在这个示例中,-channel 应用于每个图像,因为正如我们提到的,设置会持续存在。
magick -channel RGB wand.png wizard.png images.png
图像操作符
图像操作符与设置的不同之处在于,它会立即影响命令行中显示的图像。操作符是命令行中选项,而不是列为图像设置或图像序列操作符。与图像设置(持续到命令行终止)不同,操作符应用于当前图像集并被遗忘。图像操作符包括:
-
-annotate •-black-threshold •-blur •-border •-charcoal •-chop •-clip •-clip-path •-clip-mask •-colors •-colorize •-colorspace •-color-threshold •-compose •-contrast •-convolve •-crop •-cycle •-despeckle •-draw •-edge •-emboss •-enhance •-equalize •-evaluate •-extent •-flip •-flop •-floodfill •-frame •-fx •-gamma •-gaussian-blur •-grayscale •-implode •-integral •-kmeans •-lat •-level •-map •-median •-modulate •-monochrome •-negate •-noise •-normalize •-opaque •-ordered-dither •-paint •-posterize •-raise •-profile •-raise •-random-threshold •-resample •-resize •-roll •-rotate •-rotational-blur •-sample •-scale •-sepia-tone •-segment •-shade •-shadow •-sharpen •-shave •-shear •-sigmoidal-contrast •-solarize •-splice •-spread •-strip •-swirl •-threshold •-transparent •-thumbnail •-tint •-transform •-trim •-unsharp •-version •-wave •-white-balance •-white-point •-white-threshold
在这个示例中,-negate 反转了魔杖图像,但没有反转巫师。
magick wand.png -negate wizard.png images.png
请注意,图像操作符将应用于图像序列中的每个图像。例如,如果使用-resize 选项调整 GIF 图像的大小,则每个帧都将调整为指定的大小。但是,某些帧可能小于整个图像,并且将所有帧调整为相同的大小可能会导致意外输出。在这种情况下,应使用-coalesce 来准备这些帧。
图像通道操作符
直接对图像通道进行操作。
图像序列操作符
图像序列操作符与设置的不同之处在于,它会立即影响命令行中显示的图像序列。从以下图像序列操作符中选择:
-
-append •-affinity •-average •-clut •-coalesce •-combine •-compare •-complex •-composite •-copy •-crop •-debug •-deconstruct •-delete •-evaluate-sequence •-fft •-flatten •-fx •-hald-clut •-ift •-identify •-insert •-layers •-limit •-map •-maximum •-minimum •-morph •-mosaic •-optimize •-print •-process •-quiet •-read •-swap •-write
在这个例子中,-append 将三个图像追加到一个图像中。
magick mikayla.png picnic.png beach.png -append vacation.png
图像几何
许多命令行选项 使用geometry 参数来指定诸如图像所需宽度和高度以及其他尺寸量等内容。由于用户希望对图像的最终尺寸、大小和位置进行多种变化(并且因为 ImageMagick 想要提供它们),因此geometry 参数可以采用多种形式。在本节中,我们将描述其中许多形式。
使用某种形式的geometry 参数的图像选项和设置包括以下内容。请记住,其中一些选项会以略微不同的方式解析其参数。有关更多详细信息,请参阅各个选项或设置的文档。
-
-adaptive-resize •-border •-borderwidth •-chop •-crop •-density •-extent •-extract •-frame •-geometry •-iconGeometry •-liquid-rescale •-page •-region •-repage •-resize •-sample •-scale •-shave •-splice •-thumbnail •-window
geometry 参数可能采用下表中列出的任何形式。这些将在表格后面的子部分中详细描述。通常的形式是size[offset],这意味着size 是必需的,而offset 是可选的。偶尔,[size]offset 是可能的。在任何情况下,geometry 参数中都不允许使用空格。
大小 | 常规描述(对于不同的选项和设置,实际行为可能会有所不同) |
---|---|
比例% | 高度和宽度都按指定的百分比缩放。 |
scale-x%xscale-y% | 高度和宽度分别按指定的百分比缩放。(只需要一个 % 符号。) |
宽度 | 给出宽度,自动选择高度以保持纵横比。 |
xheight | 给出高度,自动选择宽度以保持纵横比。 |
widthxheight | 给出高度和宽度的最大值,保持纵横比。 |
widthxheight^ | 给出宽度和高度的最小值,保持纵横比。 |
widthxheight! | 明确给出宽度和高度,忽略原始纵横比。 |
widthxheight> | 缩小尺寸大于相应width 和/或height 参数的图像。 |
widthxheight< | 放大尺寸小于相应width 和/或height 参数的图像。 |
面积@ | 调整图像大小,使其具有指定的像素面积。保持纵横比。 |
x:y | 这里 x 和 y 表示纵横比(例如 3:2 = 1.5)。 |
x:y^ | 删除行或列以达到给定的纵横比。 |
x:y# | 添加行或列以达到给定的纵横比。 |
{size}{offset} | 指定offset(默认为+0+0)。下面,{size} 指的是上述任何形式。 |
{size}{+-}x{+-}y | 水平和垂直偏移量x 和y,以像素为单位指定。两个都需要符号。偏移量受-gravity 设置的影响。偏移量不受% 或其他size 运算符的影响。请注意,对于所有-gravity 选项(除了“center”之外),正 X 和 Y 偏移量都朝向图像中心的内方向。对于东,+X 为左。对于南,+Y 为上。对于东南,+X 为左,+Y 为上。对于中心,使用正常的 X 和 Y 方向约定(+X 为右,+Y 为下)。 |
宽度和高度的基本调整;运算符%、^ 和!
这里,就在下面,是geometry 的几个简单示例,展示了它如何用作-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%。
默认情况下,除非指定百分比,否则geometry 参数中给出的宽度和高度是最大 值。也就是说,图像会扩展或收缩以适合指定的宽度和高度值,同时保持图像的纵横比(其高度与宽度的比率)。例如,上面第三个命令“尝试”将尺寸设置为100x200。想象一下逐渐缩小原始图像(它是 640x480),保持其纵横比不变,直到它正好适合 100x200 的矩形。由于图像的长度大于宽度,因此当其宽度缩小到 100 像素时,它将适合。为了保持纵横比,因此高度必须为 (480/640)×100 像素 = 75 像素,因此最终尺寸将为 100x75。
请注意,在前面的示例中,将获得至少一个指定的尺寸(在本例中为宽度,100 像素)。生成的图像紧密地适合原始图像。可以通过调用^ 运算符来执行与此相反的操作,如上面第四个示例所示。在这种情况下,当100x200^ 作为参数给出时,同样至少会获得一个尺寸,但在这种情况下,生成的图像可以紧密地包含原始图像。这里geometry 参数给出最小 值。在我们的示例中,高度将变为 200,宽度将按比例缩放以保持纵横比,变为 (640/480)×200 像素 = 267 像素。使用^ 运算符,其中一个尺寸将与请求的大小匹配,但图像可能会溢出请求的尺寸以保持其纵横比。(^ 功能是 IM 6.3.8-2 中的新功能。)
我们看到 ImageMagick 非常擅长保持图像的纵横比,以防止您最喜欢的照片和图像失真。但是您可能确实希望尺寸为100x200,从而拉伸图像。在这种情况下,只需告诉 ImageMagick 您确实是这样想的(!)即可,方法是在几何图形后附加一个感叹号运算符。这将强制图像大小完全按照您指定的进行。因此,例如,如果您指定100x200!,则尺寸将完全变为 100x200(生成一个小的、垂直拉长的向导)。
限制宽度、高度和面积;运算符>、< 和@
以下是一些其他示例
magick logo: -resize '100' wiz1.png magick logo: -resize 'x200' wiz2.png magick logo: -resize '100x200>' wiz3.png magick logo: -resize '100x200<' wiz4.png
如果只给出一个维度,则将其视为宽度。当仅指定宽度时,如上面第一个示例所示,宽度被视为给定值,并且选择高度以保持输入图像的纵横比。类似地,如果仅指定高度,如上面第二个示例所示,则高度被视为给定值,并且选择宽度以保持纵横比。
使用> 仅在图像的维度大于相应的width 和/或height 参数时才缩小图像。使用< 仅在图像的维度小于相应的width 和/或height 参数时才放大图像。在任何一种情况下,如果进行了更改,则结果就像不存在> 或< 运算符一样。因此,在上面第三个示例中,我们指定了100x200>,原始图像大小为 640x480,因此图像大小会像我们指定了100x200 一样减小。但是,在上面第四个示例中,其大小不会发生任何变化。
最后,使用@ 指定图像的最大像素面积,同时再次尝试保持纵横比。(像素仅采用整数值,因此始终存在一些近似值。)在以下示例中,请求了 10000 像素的面积。生成的文
magick logo: -resize '10000@' wiz10000.png
在上面和下面的所有示例中,我们都将geometry 参数括在引号中。在许多情况下,这样做是可选的,但并非总是如此。当使用< 或> 时,我们必须 将几何图形规范括在引号中,以防止 shell 将这些字符解释为文件重定向。在 Windows 系统上,插入符号^ 需要在引号内,否则它会被忽略。为了安全起见,人们可能应该养成将所有geometry 参数括在引号中的习惯,就像我们在这里所做的那样。
几何图形中的偏移量
以下是一些示例,用于说明在geometry参数中使用offsets。偏移量的一个典型用法是与-region选项结合使用。此选项允许许多其他选项修改图像指定矩形子区域内的像素。因此,它需要给出该区域的宽度和高度,以及图像中的一个offset,这是一个坐标对,指示该区域在较大的图像中的位置。在下面第一个示例中,我们指定一个大小为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
请注意,偏移量始终需要+/-符号。偏移量实际上并不是图像中的真实位置;其坐标必须添加到其他某个位置。我们将其称为当前位置。但在以上的前两个示例中,该位置是图像的左上角,其坐标为(0,0)。(当没有其他指令指示更改时,这是默认情况。)上面的第一个示例将100x200矩形的左上角放置在(10,20)处。
在许多情况下,负偏移量是有意义的。在上面的第二个示例中,偏移量为(-10,20),由-10+20指定。在这种情况下,只能对获得的(虚拟)矩形位于图像内的部分取反;在这里,它等效于将几何图形指定为90x200+0+20。
在上面的第三个示例中,-gravity设置先于其他设置,并将图像中的当前位置设置为图像的中心。在这种情况下,它位于像素(320,240)处,因为图像的大小为640x480。这意味着偏移量适用于该位置,从而使该位置移动,在本例中移动到(320-10,240+20)=(310,260)。但100x200区域本身受-gravity设置的影响,因此它不会影响其左上角,而是确定区域自身的中心(在其内部的(+50,+100)处)。因此,100x200矩形的中心移动到(310,260)。取反矩形的左上角现在位于(310-50,260-100)=(260,160)处。
图像栈
在学校,你的老师可能允许你在草稿纸上解决问题,然后将结果复制到你的试卷上。图像栈与此类似。它允许你独立处理图像或图像序列,然后将结果重新引入命令行。图像栈用括号分隔。图像操作符仅影响当前栈中的图像。例如,我们可以将图像旋转限制在仅限于wizard图像,如下所示
magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif
再次注意,括号前面带有反斜杠,从而进行转义。在Linux下需要这样做,因为括号是特殊的shell字符。反斜杠告诉shell不要解释这些字符,而是将它们直接传递给正在执行的命令。在Windows下不要转义括号。每个括号(或转义的括号)两侧都必须有空格,如上面所示的示例。
除了已经讨论过的图像操作符之外,以下图像操作符在处理图像栈中的图像时最有用
这些操作符的参数是图像序列中的索引,从零开始,第一个图像为零,依此类推。但是,如果给出负索引,则图像将从末尾(最后添加的图像)进行索引。也就是说,索引-1是当前图像序列中的最后一个图像,-2是倒数第二个图像,依此类推。
输出文件名
ImageMagick将输出文件名的概念扩展到包括
- 显式图像格式
- 写入标准输出
- 文件名引用
在接下来的几段中将解释每个扩展。
不是使用输出文件名,而是使用-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:-