ImageMagick 示例 -- 拼贴(Montage),图像阵列
- 几何参数 - 平铺尺寸(图像缩放)
- 几何参数 - 平铺间距
- 平铺布局控制
- 边框装饰
- 边界装饰
- 阴影装饰
- 为拼贴图像添加标签
- 使用保存的图像元数据
- 拼贴控制设置
- 复用设置以进行图像读取/创建
-
HTML 缩略图图像映射(基础索引映射)
- 使用 JPEG 图像的更小 HTML 索引映射
- 可视索引(非 montage 方案)
-
宝丽来照片拼贴(精美索引映射)
- 重叠的拼贴平铺
- 拼贴拼接模式
- 零几何参数(需谨慎)
- 背景与透明度处理
"magick montage" 最初的用途是生成图像缩略图表格,也就是为大量图像(尤其是照片)的缩略图建立索引。虽然它至今仍可用于该目的,但它还能做更多事情。本页将探讨你能用 montage 做什么,以及如何在自己的图像上使用它。
拼贴(Montage),简介
"[magick montage](https://imagemagick.org/www/montage.html)" 命令的设计目的是生成一个缩略图阵列。有点像大量图像集合的校样表。不带任何选项的默认 "[magick montage](https://imagemagick.org/www/montage.html)" 非常朴素,包含很大的容纳方格,没有边框、标签或阴影。
magick montage balloon.gif medical.gif present.gif shading.gif montage.jpg
几何参数 - 平铺尺寸与图像缩放
"[-geometry](https://imagemagick.org/command-line-options/#geometry)" 设置是 "magick montage" 最重要的控制项。它定义了每个缩略图图像的尺寸,以及它们之间的间距。几何参数的尺寸部分被用作缩放运算符的参数,包括其所有专用标志。该选项的位置部分被解释为图像周围要留出的边界空间大小,因此把它调小会缩小图像之间的空隙。默认的 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 设置是 '120x120>+4+3',意思是把给定的任何图像装入一个 120x120 像素的框中。如果图像更大就缩小它,但不放大更小的图像(参见仅缩小较大者('>')标志)。'平铺' 尺寸随后被设为所有缩放后图像的最大尺寸,以及实际指定的尺寸。这意味着你永远不会得到比指定的 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 尺寸更小的平铺尺寸。你可以通过修改默认的 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 来去掉前一个示例中那些巨大的平铺空间。例如,去掉 'size'(尺寸)部分后,所有图像都不会被缩放,'平铺' 尺寸将被设为所有给定图像的最大尺寸。例如,这里我让 montage 用给定的最大图像进行平铺,并在平铺之间留出小空隙。当所有输入图像都很小且大小大致相同时,这是非常典型的设置。
magick montage balloon.gif medical.gif present.gif shading.gif \
-geometry +2+2 montage_geom.jpg
例如,这里我把其中一张图像换成了更大的 'logo' 图像,但把缩放设置设为 '48x48',以便同时缩放更小和更大的图像。
magick montage balloon.gif medical.gif present.gif logo: \
-geometry 48x48+2+2 montage_geom_size.jpg
这里我再次将缩放限制为仅作用于比指定平铺尺寸大的图像。
magick montage balloon.gif medical.gif present.gif logo: \
-geometry 48x48\>+2+2 montage_geom_larger.jpg
如你所见,图像之间的间距似乎大于所请求的 2 像素间距。但事实并非如此。各平铺之间仍然相隔 2 像素,只是图像本身没有填满所请求的 48x48 平铺尺寸。'logo' 图像仍然被缩放以装入 48x48 像素的平铺中。如果你不希望任何缩放,那就只定义平铺之间的间距即可。或者,使用诸如 '1x1<' 这样的特殊尺寸,它告诉 IM 只把更小的图像缩放到给定尺寸。由于没有图像能小于 1 像素,所以不会有图像被缩放。这样平铺尺寸将再次成为页面上所有图像的最大尺寸。关于你可能想这样做的原因,参见零几何参数,需谨慎。
几何参数 - 平铺间距
"[-geometry](https://imagemagick.org/command-line-options/#geometry)" 设置的位置部分会在各个 '平铺' 之间增加空间,方法是在把它们追加拼接到一起之前,给平铺周围加上一个相应尺寸的边界。这意味着对于默认的 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 设置 '+4+3',平铺与最终图像左右边缘之间会有 4 像素的间隔,而平铺之间水平方向上会有 8 像素(给定尺寸的两倍)的间隔。垂直间距同理。注意,当所有图像都被缩放时(倒数第二个示例),平铺之间的空隙是边缘周围空隙的两倍大小。
平铺布局控制
"magick montage" 中第二重要的选项是 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置。它告诉 montage 你希望对平铺图像在最终结果中的布局方式施加什么样的限制。在 ImageMagick 第 6 版中,当你不提供任何 "[-tile](https://imagemagick.org/command-line-options/#tile)" 提示时,"magick montage" 会对给定数量的图像如何最佳平铺做出有根据的推测。不过它假定被平铺的图像本质上大致是方形的,因为在决定使用何种平铺时,它并不查看图像的宽高比。
magick montage font_1.gif -geometry 16x16+1+1 tile_1.gif
magick montage font_[12].gif -geometry 16x16+1+1 tile_2.gif
magick montage font_[123].gif -geometry 16x16+1+1 tile_3.gif
magick montage font_[1-4].gif -geometry 16x16+1+1 tile_4.gif
magick montage font_[1-5].gif -geometry 16x16+1+1 tile_5.gif
magick montage font_[1-6].gif -geometry 16x16+1+1 tile_6.gif
magick montage font_[1-7].gif -geometry 16x16+1+1 tile_7.gif
magick montage font_[1-8].gif -geometry 16x16+1+1 tile_8.gif
magick montage font_[1-9].gif -geometry 16x16+1+1 tile_9.gif
magick montage font_[0-9].gif -geometry 16x16+1+1 tile_0.gif
| 奇怪的 "[1-5]" 语法是一种 UNIX shell 简写,会被展开成一个文件名列表。"magick montage" 命令本身看不到这些字符,只看到展开后得到的文件列表。
---|---
ImageMagick 在为特定数量的输入图像选择合适的 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置方面相当出色。下面是一张表,列出输入图像数量以及 IM 用来布局这些图像的平铺设置。 | 图像数量 | 平铺设置
---|---
1 | 1x1
2 | 2x1
3 | 3x1
4 | 2x2
5 - 6 | 3x2
7 - 8 | 4x2
| | 图像数量 | 平铺设置
---|---
9 | 3x3
10 - 12 | 4x3
13 - 15 | 5x3
16 - 20 | 5x4
21 - 24 | 6x4
25 | 5x5
| | 图像数量 | 平铺设置
---|---
26 - 30 | 6x5
31 - 36 | 7x5
31 - 35 | 7x5
36 | 6x6
37 - 42 | 7x6
43 - 48 | 8x6
然而请注意,IM 不会为 18 张图像自动选择一个 '完美契合' 的 6x3 平铺设置,也不会为 28 张图像选择 7x4 设置。不过,如果你指定了一个具体的 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置,montage 总会创建一个足够大的图像来容纳那么多 '平铺'。
magick montage font_[1-7].gif -tile 9x1 -geometry 16x16+1+1 tile_9x1.gif
magick montage font_[1-7].gif -tile 4x3 -geometry 16x16+1+1 tile_4x3.gif
magick montage font_[1-7].gif -tile 3x3 -geometry 16x16+1+1 tile_3x3.gif
magick montage font_1.gif -tile 2x3 -geometry 16x16+1+1 tile_2x3.gif
| 如你所见,montage 创建了一个足够大的图像来容纳所指定数量的平铺,而不管有多少图像可用来填充所请求的平铺空间,无论是 7 张图像还是仅 1 张图像。它只会逐行填充空间,目前没有提供逐列填充平铺空间的选项。 | 在 IM v6.1 之前,如果图像数量没有用满空间,montage 会自动截掉多余的空间。因此像第一个 "9x1" 这样的设置会被截短成 "7x1" 平铺图像。 正因如此,过去 montage 的用户常常使用诸如 "999x1" 之类的大数字来生成单行图像。如今这样的参数会生成一个非常长的图像,并且可能让 IM 花很长时间才能完成。因此…… 请避免在 IM montage 中使用非常大的平铺数字! |
|---|---|
对于多余空间和多张图像的问题,尤其是当输入图像数量未知时,你可以通过从 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置中去掉行数或列数其中之一来避免。被省略的那个数字会被 montage 视为可变,montage 只会创建足以容纳所有输入图像的平铺空间,仅生成一张图像,绝不生成多张图像。 |
magick montage font_[1-7].gif -tile x1 -geometry 16x16+1+1 tile_x1.gif
magick montage font_[1-7].gif -tile x2 -geometry 16x16+1+1 tile_x2.gif
magick montage font_[1-7].gif -tile x4 -geometry 16x16+1+1 tile_x4.gif
magick montage font_[1-7].gif -tile 4x -geometry 16x16+1+1 tile_4x.gif
magick montage font_[1-7].gif -tile 5x -geometry 16x16+1+1 tile_5x.gif
magick montage font_[1-7].gif -tile 9x -geometry 16x16+1+1 tile_9x.gif
这是 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置更典型的用法,因为它确保了拼贴尺寸正确,同时仍允许它在确定最终阵列大小时拥有一定的控制权。注意上面最后那张图像,我们请求了 9 列图像。即使给定的图像少于 9 张,IM 仍然生成了所请求的 9 列。另一方面,第一张图像(请求 1 行)的长度恰好足以容纳所有图像。如果你的输入图像数量超过 montage 能在 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置给定空间内平铺的数量,那么 montage 可能会生成多张图像,结果要么是给文件名添加图像序号,要么是创建某种 GIF 动画。详情参见写入多张图像。例如,这里我让 montage 为生成的每一页都保存单独的图像,方法是在每个图像文件名中提供一个 '%d' 作为帧/场景/页编号。
magick montage font_*.gif -tile 4x1 -geometry +2+2 multi_%d.gif
边框装饰
使用 montage 排列图像最妙的地方在于,它提供了大量额外的控制项来给每张图像周围添加额外的 '点缀'。例如,你可以通过给每张图像周围添加一个 "[-frame](https://imagemagick.org/command-line-options/#frame)"(边框)来更好地界定所显示的图像。
magick montage balloon.gif medical.gif present.gif shading.gif \
-tile x1 -frame 5 -geometry +5+5 frame.jpg
这与 "magick" 中的同名选项不同(参见添加 3D 边框示例)。montage 的 frame 选项会自动为边框的内外斜面推算默认值。因此只需要一个参数数字即可。
边界装饰
大约在 IM v6.1.0 时,"-border" 成为 montage 的一个新装饰选项。它现在会在每张图像按 "-geometry" 设置缩放之后,给图像周围添加额外的 '内边距'。
magick montage balloon.gif medical.gif present.gif shading.gif \
-tile x1 -border 5 -geometry +5+5 border.jpg
| 当同时应用边框装饰时,"-border" 装饰目前无法工作。
---|---
| 在 IM v6.1.0(约)之前,-border 会在它出现在 "magick montage" 命令行的那个位置被应用到图像上,就像在 "magick" 中那样。
也就是说,border 会在图像被缩放(按 "-geometry")之前很早就被添加到图像上,这导致每张图像周围的边界宽度因图像在那一刻的大小而不同。正是为了消除这种不一致性,-border 才成为了一个特殊的 montage 设置。
---|---
阴影装饰
与边框一起添加阴影也相当不错。
magick montage balloon.gif medical.gif present.gif shading.gif \
-tile x1 -frame 5 -shadow -geometry +5+5 frame_shadow.jpg
当然,你其实不需要边框就能生成图像阴影。
magick montage balloon.gif medical.gif present.gif shading.gif \
-tile x1 -shadow -geometry +5+5 -background lightblue \
shadow_noframe.jpg
从实现了 '柔和阴影' 的 IM v6.3.1 起,阴影现在会根据所显示图像的透明度来塑形! |
magick montage font_1.gif font_7.gif font_2.gif font_0.gif \
-tile x1 -shadow -geometry +3+5 -background none \
shadow_shaped.png
![[IM Output]](../static/img/montage/shadow_shaped.png)
如你所见,montage 所用的阴影实际上是一种半透明颜色,让背景能够影响其最终颜色。这意味着如果你创建一个带纹理背景的拼贴,或者使用透明背景再将其叠加上去,阴影都会正确处理。当然,你需要使用能够处理半透明颜色的图像格式,例如 PNG。请记住,由于 GIF 布尔透明度,你不能为此目的使用 GIF 图像文件格式。注意,阴影并不在意图像之间的 "-geometry" 间距。因此如果图像靠得太近,前面图像的阴影可能会被后面的图像遮挡。例如……
magick montage balloon.gif medical.gif present.gif shading.gif \
-tile x1 -shadow -geometry +1+1 -background none \
shadow_spacing.png
因此建议在使用阴影时提供适量的 "-geometry" 间距。为了避免阴影被边缘 '裁剪' 得太多,"-shadow" 选项会在最终图像的右边缘和下边缘额外增加 4 像素的边缘间距。这是在正常的 "-geometry" 间距之上额外增加的。然而如你在上面所见,这并不总是足够的空间。montage 目前还没有提供对所生成阴影的偏移、颜色或 '柔和度' 的控制项(至少现在还没有),不过话说回来,旧版本 montage 提供的硬质矩形阴影也没有这样的控制。
为拼贴图像添加标签
你也可以让 montage 用图像的源文件名给图像加标签,不过你可能需要调整图像框的大小,否则标签可能放不下,导致文本标签被截断。在这里我们给几何参数字符串添加了 "60x60>",告诉 IM 把更大的图像缩小以装入此空间,但不放大更小的图像。这大概是 montage 最典型的用法。
magick montage -label '%f' balloon.gif medical.gif rose: present.gif shading.gif \
-tile x1 -frame 5 -geometry '60x60+4+4>' label_fname.jpg
'%f' 是一个特殊的格式字符,可以提取出内存中图像的各种细节。关于你能从图像中提取的其他信息,详见图像属性转义。给缩略图加标签时你不一定要使用 "[-frame](https://imagemagick.org/command-line-options/#frame)"。标签不带阴影,以便保持清晰可读。
montage -label '%f' balloon.gif medical.gif logo: present.gif shading.gif \
-tile x1 -shadow -geometry '60x60+2+2>' label_shadow.jpg
并且从 IM v6.2.1 起,你现在可以在图像读入之后,使用 "[-set](https://imagemagick.org/command-line-options/#set)" 图像属性运算符重新给图像加标签。让我们用 "[-set](https://imagemagick.org/command-line-options/#set)" 运算符来添加更多关于图像的信息。同时再加上一些 montage 设置……
magick montage balloon.gif medical.gif logo: present.gif shading.gif \
-tile x1 -geometry '90x32+2+2>' -pointsize 10 \
-set label '%f\n%wx%h' -background SkyBlue label_fname3.jpg
正如上面的示例所示,你可以在图像读入时用 "[-label](https://imagemagick.org/command-line-options/#label)" 设置为图像定义默认标签,也可以之后用 "[-set](https://imagemagick.org/command-line-options/#set)" 运算符重新给图像加标签。 |
注意 '%wx%h' 给出的是图像在内存中的当前像素宽度和高度。如果图像尺寸被修改过,例如在输入期间,那么这可能与磁盘上(或创建时)的图像尺寸不同。如果你想要图像在内存中的像素尺寸,请改用 '%[width]x%[height]'。 |
|---|---|
你也可以通过设置单张图像的标签来给图像加上不同的标签。两种选项都可以使用,不过你需要使用圆括号来限定 "[-set](https://imagemagick.org/command-line-options/#set)" 运算符将作用于哪些图像。例如这里我们同时使用了两种加标签的形式。但既然能做到,我们也顺便给拼贴加个标题吧…… |
magick montage -label Balloon balloon.gif \
-label Medical medical.gif \
\( present.gif -set label Present \) \
\( shading.gif -set label Shading \) \
-tile x1 -frame 5 -geometry '60x60+2+2>' \
-title 'My Images' titled.jpg
你可以使用 "-label ''" 或 "+label" 来关闭后续图像的标签。然而正如你稍后会看到的,这两种设置并不完全相同。对于读入之后的标签 "[-set](https://imagemagick.org/command-line-options/#set)" 操作也是如此。
magick montage balloon.gif \
-label 'My Image' medical.gif \
+label present.gif \
-label ' ' shading.gif \
-tile x1 -frame 5 -geometry '60x60+2+2>' labeling.jpg
最后那张图像展示了如何用一个空格作为图像标签,从而创建出一个图像标签空间,但留空。这引出了使用 montage 时一条很好的经验法则……
要么给你所有的图像都加标签,要么一个都不加!
你不一定非要在 montage 操作本身期间给图像加标签。MIFF 和 PNG 两种格式都能把标签作为其图像格式的一部分存储。montage 会自动为任何已包含标签的读入图像加上标签。这是自动进行的,无需指定,我曾用这个技巧生成过一些非常复杂的图像拼贴。例如 Annotate 角度示例中的拼贴阵列就是用这个技巧创建的。如果你不想要这种自动加标签,就必须明确告诉 montage 把所有读入或创建的标签重置为空字符串,方法是在读入图像之前使用 "-label ''"。或者你也可以在读入图像之后,用 "+set label" 删除标签元数据。这就是 "[+label](https://imagemagick.org/command-line-options/#label)" 与使用空标签("-label ''")的区别所在。前者将默认行为重置回自动使用被读入图像可能带有的任何标签元数据,而后者用空字符串替换标签,从而有效地移除了标签。你也可以用 "-label '%l'" 保留图像的原始标签,这在图像处理脚本中可作为一个无操作(NO-OP)的加标签选项而很有用。注意,一旦图像的原始标签被修改或移除(无论是通过 "[-label](https://imagemagick.org/command-line-options/#label)" 还是 "[-set](https://imagemagick.org/command-line-options/#set)"),"[-set](https://imagemagick.org/command-line-options/#set)" 都无法恢复它。
magick -label 'medical' medical.gif label_medical.png
magick -label 'logo' logo: label_logo.png
magick -label 'rose' rose: label_rose.png
magick montage label_medical.png \
-label '' label_logo.png \
+label label_rose.png \
-tile x1 -frame 5 -geometry '60x60+2+2>' label_control.jpg
在上面你可以看到,第一张图像使用了随图像本身提供的标签。第二张图像由于 "-label ''" 设置而移除了传入的标签,而第三张图像也使用了图像的标签,因为我们用 "[+label](https://imagemagick.org/command-line-options/#label)" 关闭了 label 设置。
使用保存的图像元数据
在为日后供 montage 使用而生成图像时,重要的是要了解某种特定图像文件格式能保存何种图像元数据。例如,只有 PNG 和 MIFF 图像文件格式才能在其保存的图像文件格式中实际存储 'label' 元数据……
magick -label 'GIF' balloon.gif label.gif
magick -label 'JPG' medical.gif label.jpg
magick -label 'PNG' present.gif label.png
magick -label 'MIFF' shading.gif label.miff
montage label.gif label.jpg label.png label.miff \
-tile x1 -frame 5 -geometry '60x60+2+2>' label_files.jpg
rm label.*
不过,所有常见文件格式都允许你使用 'comment'(注释)元数据,你可以通过给 "[-label](https://imagemagick.org/command-line-options/#label)" 指定一个 '%c' 参数来使用它。
magick -comment 'GIF' balloon.gif comment.gif
magick -comment 'JPG' medical.gif comment.jpg
magick -comment 'PNG' present.gif comment.png
magick -comment 'MIFF' shading.gif comment.miff
magick montage -label '%c' comment.gif comment.jpg comment.png comment.miff \
-tile x1 -frame 5 -geometry '60x60+2+2>' comment_files.jpg
rm comment.*
这对于以 JPEG 文件格式保存的图片往往更有用,不过 JPEG 图像注释通常太长(往往是描述图像的整段文字),不适合用作 montage 标签,因为它们不会自动换行(关于使用图像 'comment' 元数据加标签的替代方法,参见宝丽来照片拼贴)。许多其他程序在保存图像时也会自动添加 '制作者' 标签和注释(真讨厌),因此建议保持一些谨慎。GIMP 程序尤其喜欢这样做,除非你叫它别这么干,否则它每次保存图像时都会添加这类注释和标签。注意,IM 一般不用来给保存的 JPEG 文件添加注释(由于 JPEG 有损压缩),除非出于其他原因正在处理它们。相反,这类注释通常通过其他方法添加,以避免读取和重新写入图像数据,从而避免降低你正在添加注释的 JPEG 图像文件的质量。关于一些此类方法,参见无损 JPEG 处理选项。同样重要的是要注意,加标签(以及图像 'comment')并非 montage 专有。montage 只是在标签存在时自动加以利用。标签和注释是附加在图像上的,并且与各自的文件格式相关,而非 montage 甚至 IM 专有。PNG 和 MIFF 文件格式还允许你使用一种不太常用的 'caption'(说明文字)元数据。
magick balloon.gif -set caption 'GIF' caption.gif
magick medical.gif -set caption 'JPG' caption.jpg
magick present.gif -set caption 'PNG' caption.png
magick shading.gif -set caption 'MIFF' caption.miff
magick montage -label '%[caption]' caption.gif caption.jpg caption.png caption.miff \
-tile x1 -frame 5 -geometry '60x60+2+2>' caption_files.jpg
rm caption.*
实际上,这两种文件格式都允许你保存图像在保存时可能存在的任意图像属性元数据!
magick balloon.gif -set my_data 'GIF' my_data.gif
magick medical.gif -set my_data 'JPG' my_data.jpg
magick present.gif -set my_data 'PNG' my_data.png
magick shading.gif -set my_data 'MIFF' my_data.miff
magick montage -label '%[my_data]' my_data.gif my_data.jpg my_data.png my_data.miff \
-tile x1 -frame 5 -geometry '60x60+2+2>' my_data_files.jpg
rm my_data.*
在拼贴中留出空隙
虽然你可以通过巧妙运用 "[-tile](https://imagemagick.org/command-line-options/#tile)" 设置并控制给定图像数量,在拼贴底部留出额外空间,但要在拼贴中间留出一个空的平铺空间,则需要使用一种特殊图像。"null:" 生成的图像正是为此目的而定义的。它所出现的位置不会收到任何标签(即使定义了标签),也不会添加任何边框或阴影 '点缀'。该平铺除了 montage 绘制画布本身的背景颜色(或纹理)之外,完全是空的。
magick montage -label 'Image' medical.gif null: present.gif \
-tile x1 -frame 5 -geometry +2+2 montage_null.jpg
注意,对于其他 IM 命令而言,"null:" 图像表示一个单像素的透明图像。它也被用作诸如 "[-crop](https://imagemagick.org/command-line-options/#crop)" 或 "[-trim](https://imagemagick.org/command-line-options/#trim)" 等选项的 '错误图像',这些选项可能因操作结果而产生一个 '零' 或空图像。这种特殊图像不能被保存然后日后用来留空隙,目前它仅在 "magick montage" 命令行中给出时才是 '特殊的'。 | _目前没有任何方法可以让拼贴的图像像 HTML 表格那样跨越多行或多列。你也无法生成可变大小的行和列以最佳契合所生成的图像阵列。
如果你确实需要这种能力,你将需要开发自己的 montage 类应用程序。如果你确实开发了什么,那么请贡献出来,我们会考虑把它合并进现有的 montage 应用程序。
对此的一些解决方案包括:自己给图像缩略图加标签和边框,然后使用追加图像,或者使用更自由的图层化图像技术。
_
---|---
更多拼贴设置 我上面展示的 "magick montage" 设置只是 montage 的基本控制项。还有许多其他设置你可能想根据自己的需要加以考虑。 拼贴颜色设置 [**-background**](https://imagemagick.org/command-line-options/#background) |
绘制边框之外的颜色。通常它被设为 'none' 或 'transparent',以便用于网页。如果给出了 -texture 设置,则会改用它。 |
|---|---|
[**-bordercolor**](https://imagemagick.org/command-line-options/#bordercolor) |
边框内部用于图像的填充颜色,或任何边界内边距的填充颜色。图像中任何透明区域都会变成此颜色,除非没有添加此类装饰。 |
[**-mattecolor**](https://imagemagick.org/command-line-options/#mattecolor) |
用作边框颜色的颜色。注意,该颜色还会被调亮和调暗,以赋予边框斜面 3D 外观。所以这个设置实际上定义了 5 种颜色。(另见为图像加边框) |
[**-fill**](https://imagemagick.org/command-line-options/#fill) |
文本标签和标题的填充颜色。 |
[**-stroke**](https://imagemagick.org/command-line-options/#stroke) |
文本标签和标题的描边颜色。 |
| 拼贴控制设置 |
[**-tile**](https://imagemagick.org/command-line-options/#tile) {_cols_}x{_rows_}用于填充单张拼贴图像的横向和纵向图像数量。如果读入或创建的图像超过单张拼贴图像所能容纳的数量,则会创建多张图像。(参见上面的平铺控制)[**-title**](https://imagemagick.org/command-line-options/#title) {_string_}在整个拼贴上方设置一个标题,使用与给单张图像加标签相同(但更大)的字体。[**-frame**](https://imagemagick.org/command-line-options/#frame) {_width_}在包含图像的方格周围创建一个边框,使用所提供的 width(必须至少为 2,但 5 或 6 是个不错的值)。如果使用,图像中的任何透明部分也会变成边界颜色。[**-border**](https://imagemagick.org/command-line-options/#frame) {_width_}在图像周围创建一个边界,使用所提供的 width。如果使用,图像中的任何透明部分也会变成边界颜色。[**-shadow**](https://imagemagick.org/command-line-options/#shadow)为边框生成阴影。注意,不需要也不期望任何参数。[**-texture**](https://imagemagick.org/command-line-options/#texture) {_filename_}使用给定的纹理(平铺图像)作为背景,而不是某种特定颜色。更多信息参见下面的背景与透明度一节。[**-geometry**](https://imagemagick.org/command-line-options/#geometry) {_W_}x{_H_}+{_X_}+{_Y_}在 montage 把图像叠加到画布上之前,把所有图像读入后调整其大小。它还定义了图像被绘入的平铺的尺寸和平铺之间的间距。如果未指定尺寸,则图像不会被缩放。[**-gravity**](https://imagemagick.org/command-line-options/#gravity) {_direction_}如果图像比方框小,则图像放在方框中的何处。默认情况下居中。
除上述以外,还有 "label:" 图像创建运算符所理解的所有字体设置(参见标签图像生成器)。这些设置用于创建添加在所显示图像下方的标签。其中包括诸如 "[-font](https://imagemagick.org/command-line-options/#font)"、"[-pointsize](https://imagemagick.org/command-line-options/#pointsize)"(对 "[-title](https://imagemagick.org/command-line-options/#title)" 忽略)、"[-density](https://imagemagick.org/command-line-options/#density)"、"[-fill](https://imagemagick.org/command-line-options/#fill)"、"[-stroke](https://imagemagick.org/command-line-options/#stroke)" 以及 "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" 等设置。只要上述任何或全部设置在最终的 '输出文件名' 参数之前被定义或重置,montage 就会按你的要求使用它们。 复用设置以进行图像读取/创建 不过请注意,这些选项中有许多也用于其他目的,无论是在图像生成中还是在图像处理期间。但得益于 IM v6 上 '所见即所做' 的命令行处理方式,这对 "magick montage" 命令并不构成问题。这意味着你可以自由地使用这些选项设置来读取、创建或修改被读入的图像,然后在所有图像读入或创建之后重置这些设置。最终的设置值就是 montage 用于其最终处理的值。在第 6 版之前的 IM 版本中并非如此,那时通常无法把图像创建设置与 montage 设置分离开,除非生成中间图像(例如上面的图像标签示例)。这里有一个设置复用的实际示例。我想做一张表来展示我在这些示例页面中一直在用的一些字体,然后把设置重置为其他值,供 montage 对图像进行最终处理。
magick montage -pointsize 24 -background Lavender \
-font Candice -label Candice label:Abc-123 \
-font Corsiva -label Corsiva label:Abc-123 \
-font SheerBeauty -label SheerBeauty label:Abc-123 \
-font Ravie -label Ravie label:Abc-123 \
-font Arial -label Arial label:Abc-123 \
-font ArialI -label ArialI label:Abc-123 \
-font ArialB -label ArialB label:Abc-123 \
-font ArialBk -label ArialBk label:Abc-123 \
-font CourierNew -label CourierNew label:Abc-123 \
-font LokiCola -label LokiCola label:Abc-123 \
-font Gecko -label Gecko label:Abc-123 \
-font Wedgie -label Wedgie label:Abc-123 \
-font WebDings -label WebDings label:Abc-123 \
-font WingDings -label WingDings label:Abc-123 \
-font WingDings2 -label WingDings2 label:Abc-123 \
-font Zymbols -label Zymbols label:Abc-123 \
\
-frame 5 -geometry +2+2 -font Arial -pointsize 12 \
-background none -bordercolor SkyBlue -mattecolor DodgerBlue \
montage_fonts.gif
![[IM Output]](../static/img/montage/montage_fonts.gif)
注意 "magick montage" 命令的两个阶段,我用一个额外的几乎空白的行清楚地标记了它们。第一部分本质上与你使用普通 IM "magick" 命令定义多张图像的方式完全相同,并以同样的 '所见即所做' 顺序处理。第二部分定义了我想让 "magick montage" 命令本身使用的所有设置。也就是我想在最终拼贴图像中使用的边框、图像缩放、字体和颜色。我尤其注意为拼贴图像下方的标签重置 "[-font](https://imagemagick.org/command-line-options/#font)" 和 "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" 设置。虽然你可以像这样把 "magick montage" 的选项分开,但实际上你可以在命令行的任何时候定义 montage 设置。只要这些设置不干扰你的图像创建和处理选项,并且在到达命令行末尾时仍被正确定义,"magick montage" 就会使用它们。附注:你可能想看看我编写的一个 shell 脚本,它做的事情与上面类似(并且能与较早版本的 montage 配合工作),用于显示一个 truetype(.ttf)字体目录,名为 "[**show_fonts**](../static/img/scripts/show_fonts)"。另一个 shell 脚本示例是 "[**show_colors**](../static/img/scripts/show_colors)"。
montage 与 magick 选项的差异
虽然 "magick montage" 总体上允许你在读取和处理其输入图像时使用任何 "magick" 设置和运算符,但有少数差异需要强调。这些 "magick" 运算符和设置在 "magick montage" 内部使用时是不同的。
[**-tile**](https://imagemagick.org/command-line-options/#tile)在 "magick" 中,"[-tile](https://imagemagick.org/command-line-options/#tile)" 设置定义了一张用作纹理的图像,以代替使用 "[-fill](https://imagemagick.org/command-line-options/#fill)" 颜色。在 "magick montage" 中,它定义了如何布局各个图像单元 '平铺'。更多细节参见上面的平铺布局控制。[**-frame**](https://imagemagick.org/command-line-options/#frame)在 "magick" 中,这是一个用于给图像周围添加 3D 边框的运算符,需要 4 个参数才能正确工作(参见 Convert Frame 示例)。更多细节参见边框装饰。[**-border**](https://imagemagick.org/command-line-options/#border)大约在 IM v6.1.0 时,这个运算符成为了一个特殊的 montage 选项。因此,像前面的 frame 选项一样,它只接受一个数字作为参数,而不是像 Convert Border 那样接受两个参数。更多细节参见边界装饰。[**-shadow**](https://imagemagick.org/command-line-options/#shadow)"magick" 中的 "[-shadow](https://imagemagick.org/command-line-options/#shadow)" 选项接受一个参数,用于创建一个柔和模糊的阴影,可放置在原始图像副本的下方。然而在 "magick montage" 中,这只是一个布尔设置,仅用于开启和关闭矩形阴影功能。更多细节参见阴影装饰。[**-geometry**](https://imagemagick.org/command-line-options/#geometry)"magick montage" 中的 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 选项只是被保存下来,用于提供最终拼贴中每个单元内图像的尺寸,以及单元之间的间距。在 "magick" 中,它只缩放最后一张图像,并设置图像合成的偏移量。
如果你确实需要使用 "magick" 形式的这些选项,那么你需要先用 "magick" 预处理你的图像,然后再把它们传给 "magick montage"。上面的图像标签示例演示了一种使用中间文件的方法。另一种方法是直接在 "magick" 中完成处理,然后把得到的多张图像管道传给 "magick montage"。如果你总是先做图像输入处理,再设置 "magick montage" 专用设置(正如我在所有这些示例中所做的那样),那么这种分离就很容易做到。上面最后那个字体示例尤其能说明这一点。例如,让我们先用 "magick" 的 frame 给图像加边框,然后再用 "magick montage" 带标签的边框给它们加一次边框。
magick -label %f balloon.gif medical.gif present.gif shading.gif \
-mattecolor peru -frame 10x5+3+0 miff:- |\
magick montage - -tile x1 -frame 5 -geometry '64x56+5+5>' double_frame.jpg
你也可以看到 "magick" 形式的 "[-frame](https://imagemagick.org/command-line-options/#frame)" 运算符所需要的额外参数。
图像目录的索引
HTML 缩略图图像映射
montage 特别适合用于生成图像的缩略图映射。例如,这里我为照片图像源目录创建了一个索引,该目录保存着贯穿 IM 示例所用的数码照片。点击下面的 '艺术' 图像查看结果。 |
magick montage -label '%t\n%[width]x%[height]' \
-size 512x512 '../img_photos/*_orig.*[120x90]' -auto-orient \
-geometry +5+5 -tile 5x -frame 5 -shadow photo_index.html
IM Examples
Photo Store
| 注意使用 '%[width]x%[height]' 而不是仅 '%wx%h'。这很重要,因为图像在读入时正被缩放。前者会用图像在磁盘上的原始像素尺寸给图像加标签,而后者会使用图像缩放后的当前尺寸。这是用户很容易忽视的一点。
---|---
该命令的结果是三个文件……
[photo_index.png](../static/img/montage/photo_index.png)所有图像缩略图的拼贴 [photo_index_map.shtml](../static/img/montage/photo_index_map.shtml.txt)缩略图图像的 HTML '图像映射' [photo_index.html](../static/img/montage/photo_index.html.txt)用于万维网的 HTML 缩略图索引页。 它也包含了前述图像映射的一份副本。
当然,如果你只想要一张索引图像,并不一定要生成 HTML 索引文件。在那种情况下,只需把上面命令中的 "photo_index.html" 换成你想生成的图像即可。注意为图像 "[-label](https://imagemagick.org/command-line-options/#label)" 使用了图像属性转义 '%t'。这是不带任何 '路径' 部分的图像文件名。不过 HTML 链接仍会包含相应的 '路径' 部分,允许你在与图像本身不同的目录中构建索引图像。上面示例中的源图像 "'*_orig.*'" 加了引号,因此是 "magick montage" 命令自己来展开 '*',而不是命令行 shell。这避免了你可能遇到的命令行长度限制问题。我还在读入图像时对其做了一些初步缩放 '[120x190]'(参见读取图像修饰符)。对于 JPEG 图像,我还指定了一个更小的 "[-size](https://imagemagick.org/command-line-options/#size)" 设置,以便 JPEG 库可以做一些非常粗略的初步缩放,而不必把整张图像读入内存。如果不这样做,那么在并无真正需要时,非常大的 JPEG 图像可能会消耗巨量的内存和 CPU 周期。我还用 "[-strip](https://imagemagick.org/command-line-options/#strip)" 剥除了图像可能带有的任何配置文件。更多信息参见配置文件、剥除与 JPEG 处理和读取 JPEG 图像。请记住,montage 的 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 选项也可以指定一个最终的缩放设置,不过在这种情况下并不需要,因为我在读取过程中已经做了,所以我没有在该设置中设定任何 'size'。最后,使用 "[-tile](https://imagemagick.org/command-line-options/#tile)" 选项 '5x' 来确保所有图像出现在单张图像中,否则 "magick montage" 可能会生成多页 HTML 文件,而它们之间没有正确链接。这一点有望改变,不过 HTML 生成并非 ImageMagick 的主要目标。关于生成缩略图和 HTML 索引页的其他方法,请阅读缩略图示例页。
使用 JPEG 图像的更小 HTML 索引映射
上面的索引图像生成的是 PNG 格式的索引图像。之所以用它,是因为它是一种无损格式,当被索引的图像颜色差异极大时这一点很重要。如果背景颜色设为 'transparent' 或 'none',它还能让你使用 montage 新的 '柔和阴影' 特性。非常老旧的 IM 会为上述操作生成一张 GIF 图像。然而,作为该格式局限的一部分,这会对结果造成严重的减色。它也不像 PNG 那样允许使用半透明的 '柔和阴影'。JPEG 同样不允许半透明,但只要你不为图像使用透明背景,这就不是问题。然而它比 PNG 小得多,这提供了一种大幅减小索引图像尺寸的方法,尤其适合网络使用,并且仍能处理很大范围的颜色。不过,上面的 HTML 输出只生成 PNG 格式图像,所以你不仅需要把 PNG 转换成 JPEG,还需要做一些额外处理来修正 HTML 文件。 |
magick montage -label '%t\n%[width]x%[height]' \
-size 512x512 '../img_photos/*_orig.*[120x90]' -auto-orient \
-geometry +5+5 -tile 5x -frame 5 -shadow photo_jpeg.html
magick photo_jpeg.png photo_jpeg.jpg
perl -i -lpe 's/src="photo_jpeg.png"/src="photo_jpeg.jpg"/' photo_jpeg.html
rm -f photo_jpeg.png photo_jpeg_map.shtml
IM Examples
Photo Store
上面的命令相当巧妙,所以下面说明发生了什么……
- 首先我像之前那样生成一个 montage 缩略图 HTML 索引。这生成了文件:"
photo_jpeg.html" 和 "photo_jpeg.png"。 - 然后我把 PNG 图像转换成了更小、有损的 JPEG 图像。
- 接着我用一个简短的 '
perl' 单行脚本把 HTML 文件改为使用 JPEG 图像而不是 PNG。 - 最后我删除了 PNG 图像,以及我不需要的 SHTML 映射文件。
然后瞧,我们就有了一个使用非常小的 JPEG 图像作为缩略图索引图像的缩略图索引。下面是缩略图索引图像文件大小的对比……
也就是说,用于索引的图像只有原始 PNG 图像大小的约 15%。对于可下载的缩略图网页来说,这是一笔很大的节省!你可以通过使用更小的 "[-quality](https://imagemagick.org/command-line-options/#quality)" 设置让 JPEG 图像更小,不过默认设置产生的结果已经相当合理。其他可能的选项包括使用 "[-sampling-factor](https://imagemagick.org/command-line-options/#sampling-factor) 2x1" 让它更小。
可视索引图像(非 montage 方案)
使用 montage 的一个替代方法是使用一种特殊的 "可视索引" 输入格式…… |
magick 'vid:../img_photos/*_orig.*' vid_index.gif
Visual Index of
Photo Store
它也可以生成 '可点击' 的 HTML 索引文件。 |
magick 'vid:../img_photos/*_orig.*' vid_index.html
Visual HTML of
Photo Store
显然,"VID:" 在内部使用 montage 来生成索引阵列。不过你不像直接使用 montage 那样拥有相同的控制权。注意,VID HTML 索引会创建一张 PNG 格式的缩略图图像。
宝丽来照片拼贴
随着复杂宝丽来变换的出现,现在可以生成一种相当不同风格的拼贴,以及拼贴索引。 |
magick montage -size 256x256 '../img_photos/*_orig.*' -auto-orient \
-auto-orient -thumbnail 128x128 \
-set caption '%t' -bordercolor AliceBlue -background grey20 \
+polaroid \
+set label -background white -geometry +1+1 -tile 4x \
polaroid_index.html
Polaroid
Montage
注意,由于我用 "[+polaroid](https://imagemagick.org/command-line-options/#polaroid)" 给图像加边框和标签,我需要自己缩放图像(用 "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)"),并确保在实际创建 "magick montage" 索引阵列之前,"[-background](https://imagemagick.org/command-line-options/#background)" 和图像 "[-label](https://imagemagick.org/command-line-options/#label)" 已被重置。然而宝丽来变换在给缩略图图像添加 '卷曲' 时往往会使文本模糊。不过你可以通过以更大尺寸生成宝丽来图像,然后把结果缩小 50% 来改善整体效果。唯一的缺点是 '阴影' 效果减弱。 |
magick montage -size 400x400 '../img_photos/*_orig.*' \
-auto-orient -thumbnail 200x200 \
-set caption '%t' -bordercolor Lavender -background grey40 \
-pointsize 9 -density 144x144 +polaroid -resize 50% \
+set label -background white -geometry +1+1 -tile 5x \
polaroid_index2.html
Sharper
Polaroid
Montage
这个精美的拼贴,以及上面展示的其他技巧,被用来创建一个脚本,以便在实际的 "[photo_store](img_photos.html)" 目录中生成一个 montage 缩略图索引。该脚本的结果参见照片库索引。
按列拼贴
默认情况下,"magick montage" 只能按给定顺序(通常是排序后的顺序)逐行放置图像。然而有时你会希望它们按列顺序显示。这无法用单条命令完成,而是需要一条至少由两条命令组成的管道。例如,这里我用两次 montage 生成一页 5x3 的平铺。 |
magick montage font_*.gif -tile 1x3 -geometry 16x16+1+1 miff:- |\
magick montage - -geometry +0+0 -tile 5x1 montage_columns.gif
![[IM Output]](../static/img/montage/montage_columns.gif)
注意,是第一个 "magick montage" 创建平铺并执行所需的任何几何参数平铺尺寸调整、加边框、加标签和间距处理。它随后会为每一列平铺输出一张图像。第二个 "magick montage" 接着只是把这些列拼接成 '页面' 图像,而不在列之间添加更多空间。如果你只想要一张包含可变列数的单一图像,那么你可以把第二个 "magick montage" 替换为 "magick",以便在不添加额外 '页面' 空间的情况下进行拼接。例如…… |
magick montage font_*.gif -tile 1x3 -geometry 16x16+1+1 miff:- |\
magick - +append montage_columns_2.gif
重叠的拼贴平铺
在 IM 用户论坛上,Fred Weinhaus(即 fmw42)与另一位用户 pooco 的一次讨论中,发现如果你把平铺间距(在 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 设置中设定)设为负数,你实际上可以让图像被绘入的平铺区域相互重叠。例如,这里我们对单行图像使用了负的水平平铺间距。
magick montage null: font_*.gif null: \
-tile x1 -geometry -5+2 montage_overlap.jpg
旋转图像会让这种重叠序列更加有趣……
magick montage null: font_*.gif null: -background none -rotate 30 \
-background white -tile x1 -geometry -8+2 montage_rot_overlap.jpg
注意,我需要在这行图像的开头和结尾各添加一张特殊的 "null:" 间隔图像,这样图像就不会溢出 "magick montage" 计算并生成的画布。这给我们带来了一些有趣的可能性。例如,你可以利用随机旋转的宝丽来变换生成一行非常有趣的重叠缩略图。
magick montage -size 400x400 null: ../img_photos/[a-m]*_orig.* null: \
-auto-orient -thumbnail 200x200 \
-bordercolor Lavender -background black +polaroid -resize 30% \
-gravity center -background none -extent 80x80 \
-background SkyBlue -geometry -10+2 -tile x1 polaroid_overlap.jpg
上面使用 extent 是为了消除 "[+polaroid](https://imagemagick.org/command-line-options/#+polaroid)" 在不同 '运行' 中可能产生的图像尺寸随机性,从而更好地控制图像之间的最终间距和重叠。这是一个非常有趣的结果,不过它实际上应被归为一个 BUG,因为这并非 "magick montage" 的预期用途。我也不指望任何 HTML 图像映射能正确工作,除非用户做一些修正。然而,一个更复杂、更可由用户控制的图像重叠方案是用脚本化的图层合并来演示的,那才是推荐且更合乎逻辑的方案。参见图层化图像的程序化定位中的示例。
拼贴拼接模式
正如你所见,montage 有一个特殊的拼接模式,可以用来把图像连接到一起而不添加任何额外空间,就像 "[-append](https://imagemagick.org/command-line-options/#append)" 选项那样。不过我建议你适当地设置 "[-tile](https://imagemagick.org/command-line-options/#tile)" 选项,以便指引拼接是水平、垂直还是按阵列进行。例如,这里我们用 "-tile x1" 来水平拼接图像。
magick montage balloon.gif medical.gif present.gif shading.gif \
-mode Concatenate -tile x1 montage_cat.jpg
但你也可以同样轻松地用它来创建图像阵列。最好图像大小相同,这样它们才能恰当地拼合在一起。
magick montage balloon.gif medical.gif present.gif shading.gif \
-mode Concatenate -tile 2x2 montage_array.jpg
当拼接不同尺寸的图像时,图像会按 '顶部' 垂直对齐,再按 '左侧' 水平行对齐进行拼接。
magick montage medical.gif rose: present.gif shading.gif \
granite: balloon.gif netscape: recycle.gif \
-mode Concatenate -tile 4x montage_cat2.jpg
然而当同时添加边框时,垂直对齐会变得很奇怪。
magick montage medical.gif rose: present.gif shading.gif \
granite: balloon.gif netscape: recycle.gif \
-mode Concatenate -tile 4x -frame 5 montage_cat3.jpg
零几何参数,需谨慎
当只有 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 间距值(未指定图像缩放)时,所有拼贴的图像框都被设为相同尺寸,以便最宽和最高的图像都能在不被缩放的情况下装入。这本身就是一种有用的行为……
magick montage present.gif rose: shading.gif \
-frame 5 -geometry +1+1 montage_geom_1.jpg
然而图像框周围和之间留有 1 像素的空隙。但如果你试图用 "+0+0" 的位置去掉这些空隙,你会遇到一个非常不寻常的问题……
magick montage present.gif rose: shading.gif \
-tile x1 -frame 5 -geometry +0+0 montage_geom_0.jpg
你所指定的 '零几何参数'(即 "-geometry 0x0+0+0")会产生一个额外的效果,那就是把 montage 置于 '拼接' 模式(见上文),这并非我们上面想要的。对于单张图像,使用零 "[-append](https://imagemagick.org/command-line-options/#append)"(从而进入拼接模式)也无关紧要。所得到的正是我们想要的结果,没有额外的边界。因此如果你只是用 "magick montage" 来给图像加标签,那么 "-geometry +0+0" 是没问题的。然而,如果你为图像指定了非零的几何参数 'size',即使你使用了零偏移,也不会触发拼接模式。这反过来给了我们一个对付最初那个问题的巧妙办法。我们要做的是设定一个 "1x1" 的几何参数图像尺寸,但同时告诉 IM 永远不要把图像缩小(使用 "<" 字符)到这个尺寸!换句话说,永远不缩放任何图像,只使用零偏移,置于一个非零的几何参数中。
magick montage present.gif rose: shading.gif \
-frame 5 -geometry '1x1+0+0<' montage_geom_1x1.jpg
这又引出了另一条很好的经验法则……
使用 montage 时务必设置一个非零的几何参数
背景与透明度处理
默认情况下,图像被叠加到拼贴画布上,该画布是用 "[-background](https://imagemagick.org/command-line-options/#background)" 颜色设置创建的,如你在这里所见。 |
magick montage font_9.gif \( recycle.gif -set label recycle \) medical.gif \
-tile x1 -geometry +5+5 -background lightblue bg_lightblue.gif
![[IM Output]](../static/img/montage/bg_lightblue.gif)
你也可以不用纯色,而是用 "[-texture](https://imagemagick.org/command-line-options/#texture)" 来定义一张平铺图像,以代替 "[-background](https://imagemagick.org/command-line-options/#background)" 颜色。 |
magick montage font_9.gif \( recycle.gif -set label recycle \) medical.gif \
-tile x1 -geometry +5+5 -texture bg.gif bg_texture.gif
![[IM Output]](../static/img/montage/bg_texture.gif)
添加边框(边框会在平铺中加入额外的边界空间)只是在背景画布之上多绘制一些 '点缀'。 |
magick montage font_9.gif \( recycle.gif -set label recycle \) medical.gif \
-tile x1 -frame 5 -geometry '40x40+5+5>' \
-bordercolor lightblue -texture bg.gif bg_frame.gif
![[IM Output]](../static/img/montage/bg_frame.gif)
注意,加边框时,"[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" 设置会被用于填充边框内部,实际上成为图像的背景颜色。还要注意,图像中任何透明区域也会被设为此颜色。 | _在 IM 6.1.4 版本之前,图像透明区域中所见的内容是未定义的。在某些版本中,你会透过带框图像看到背景颜色或纹理。在另一些版本中,你可能得到黑色或白色。在还有一些版本中,你能透过所有图层看穿,最终图像会在原始图像透明的地方呈现透明。如果这对你是个问题,请立即升级。
_
---|---
IM 6.1.4 版本还新增了使用一种特殊的 1 像素宽边框的能力。这基本上会完全去掉图像单元周围的边框,但保留图像周围(和下方)内部的 "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" 内边距。例如,比较一下边框 '1' 与最小边框宽度 '2'。 |
magick montage font_1.gif \( recycle.gif -set label recycle \) medical.gif \
-tile x1 -frame 1 -geometry '40x40+5+5>' \
-bordercolor lightblue -texture bg.gif bg_frame_1.gif
magick montage font_2.gif \( recycle.gif -set label recycle \) medical.gif \
-tile x1 -frame 2 -geometry '40x40+5+5>' \
-bordercolor lightblue -texture bg.gif bg_frame_2.gif
![[IM Output]](../static/img/montage/bg_frame_2.gif)
但如果你想让拼贴拥有透明背景该怎么办?尤其是当你打算把它用在含有纹理映射的网页上时。很简单,只需使用值为 'None' 或 'Transparent' 的 "[-background](https://imagemagick.org/command-line-options/#background)" 颜色,且不使用任何 "[-texture](https://imagemagick.org/command-line-options/#texture)" 图像来覆盖该设置即可。例如,这里我们生成了一个透明拼贴。注意 "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 仍被用来在图像周围和之间添加空间。 |
magick montage font_9.gif recycle.gif medical.gif \
-tile x1 -geometry +2+2 -background none bg_none.gif
![[IM Output]](../static/img/montage/bg_none.gif)
当然,如果你还使用了 "[-frame](https://imagemagick.org/command-line-options/#frame)",你也需要把 "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" 设为透明。 |
magick montage font_9.gif recycle.gif medical.gif \
-tile x1 -frame 5 -geometry '40x40+5+5>' \
-bordercolor none -background none bg_framed_trans.gif
![[IM Output]](../static/img/montage/bg_framed_trans.gif)
注意,montage 的 "-shadow" 选项完全不受上述所有内容的影响。它是根据单元的最终透明形状来应用的,在被叠加到背景颜色或纹理之上之前进行。 |
magick montage font_9.gif recycle.gif medical.gif \
-tile x1 -shadow -geometry '40x40+5+5>' \
-texture bg.gif bg_shadow.gif
magick montage font_9.gif recycle.gif medical.gif \
-tile x1 -frame 5 -shadow -geometry '40x40+5+5>' \
-bordercolor none -texture bg.gif bg_shadow_framed.gif
当然,任何关于使用 "magick montage" 的建议、想法或其他示例都随时欢迎。这些示例页面中的任何内容也是如此。
拼贴图像输出尺寸
montage 的数学计算很直接……
基本上,拼贴的宽度应当是……
(geometry_size + 2*frame_size + 2*geometry_offset) * images_per_column
也就是说,montage 的每个 '单元' 在被拼接到一起之前,都会在其周围添加一个固定尺寸的
边框和间距(边界)。
本质上,拼贴的尺寸也是平铺尺寸的倍数,如果你愿意,这能让你很容易地拆分拼贴,
或重新排列这些 '单元',因为它们就是矩形阵列中简单的固定尺寸平铺。
高度与此类似,但需要为标签以及可选的拼贴标题添加额外的间距,
而这两者都要难计算得多,因为它们在很大程度上取决于文本、字体、字号
和密度(density)设置。
给拼贴添加阴影也会对此计算产生影响,但那似乎只是在底部和右侧边缘
简单地小幅固定增加。它似乎不影响所用的平铺尺寸。
![[IM Output]](../static/img/montage/montage.jpg)
![[IM Output]](../static/img/montage/montage_geom.jpg)
![[IM Output]](../static/img/montage/montage_geom_size.jpg)
![[IM Output]](../static/img/montage/montage_geom_larger.jpg)
![[IM Output]](../static/img/montage/tile_1.gif)
![[IM Output]](../static/img/montage/tile_2.gif)
![[IM Output]](../static/img/montage/tile_3.gif)
![[IM Output]](../static/img/montage/tile_4.gif)
![[IM Output]](../static/img/montage/tile_5.gif)
![[IM Output]](../static/img/montage/tile_6.gif)
![[IM Output]](../static/img/montage/tile_7.gif)
![[IM Output]](../static/img/montage/tile_8.gif)
![[IM Output]](../static/img/montage/tile_9.gif)
![[IM Output]](../static/img/montage/tile_0.gif)
![[IM Output]](../static/img/montage/tile_9x1.gif)
![[IM Output]](../static/img/montage/tile_4x3.gif)
![[IM Output]](../static/img/montage/tile_3x3.gif)
![[IM Output]](../static/img/montage/tile_2x3.gif)
![[IM Output]](../static/img/montage/tile_x1.gif)
![[IM Output]](../static/img/montage/tile_x2.gif)
![[IM Output]](../static/img/montage/tile_x4.gif)
![[IM Output]](../static/img/montage/tile_4x.gif)
![[IM Output]](../static/img/montage/tile_5x.gif)
![[IM Output]](../static/img/montage/tile_9x.gif)
![[IM Output]](../static/img/montage/multi_0.gif)
![[IM Output]](../static/img/montage/multi_1.gif)
![[IM Output]](../static/img/montage/multi_2.gif)
![[IM Output]](../static/img/montage/frame.jpg)
![[IM Output]](../static/img/montage/border.jpg)
![[IM Output]](../static/img/montage/frame_shadow.jpg)
![[IM Output]](../static/img/montage/shadow_noframe.jpg)
![[IM Output]](../static/img/montage/shadow_spacing.png)
![[IM Output]](../static/img/montage/label_fname.jpg)
![[IM Output]](../static/img/montage/label_shadow.jpg)
![[IM Output]](../static/img/montage/label_fname3.jpg)
![[IM Output]](../static/img/montage/titled.jpg)
![[IM Output]](../static/img/montage/labeling.jpg)
![[IM Output]](../static/img/montage/label_control.jpg)
![[IM Output]](../static/img/montage/label_files.jpg)
![[IM Output]](../static/img/montage/comment_files.jpg)
![[IM Output]](../static/img/montage/caption_files.jpg)
![[IM Output]](../static/img/montage/my_data_files.jpg)
![[IM Output]](../static/img/montage/montage_null.jpg)
![[IM Output]](../static/img/montage/double_frame.jpg)
![[IM Text]](../static/img/montage/photo_index_sizes.txt.gif)
![[IM Output]](../static/img/montage/montage_columns_2.gif)
![[IM Output]](../static/img/montage/montage_overlap.jpg)
![[IM Output]](../static/img/montage/montage_rot_overlap.jpg)
![[IM Output]](../static/img/montage/polaroid_overlap.jpg)
![[IM Output]](../static/img/montage/montage_cat.jpg)
![[IM Output]](../static/img/montage/montage_array.jpg)
![[IM Output]](../static/img/montage/montage_cat2.jpg)
![[IM Output]](../static/img/montage/montage_cat3.jpg)
![[IM Output]](../static/img/montage/montage_geom_1.jpg)
![[IM Output]](../static/img/montage/montage_geom_0.jpg)
![[IM Output]](../static/img/montage/montage_geom_1x1.jpg)
![[IM Output]](../static/img/montage/bg_frame_1.gif)
![[IM Output]](../static/img/montage/bg_shadow.gif)
![[IM Output]](../static/img/montage/bg_shadow_framed.gif)