ImageMagick 示例 --
蒙太奇,图像数组

索引
ImageMagick 示例前言和索引
蒙太奇,简介和概述
蒙太奇设置
图像目录索引
使用蒙太奇的特殊技巧
magick montage” 的最初用途是生成图像缩略图表,即引用大型图像集合(尤其是照片)的缩略图。虽然它仍然可以用于此目的,但它还可以做更多的事情。此页面介绍了您可以使用蒙太奇做什么以及如何在自己的图像上使用它。

蒙太奇,简介

magick montage” 命令旨在生成一系列缩略图图像。有点像大型图像集合的校样。默认的“magick montage”(没有选项)非常简单,包含相当大的容器正方形,没有框架、标签或阴影。

  magick montage balloon.gif medical.gif present.gif shading.gif  montage.jpg
[IM Output]

几何 - 磁贴大小和图像调整大小

-geometry” 设置是“magick montage” 最重要的控制项。它定义了各个缩略图图像的大小以及它们之间的间距。几何图形的大小部分用作 调整大小运算符 的参数,包括其所有特殊用途标志。选项的位置部分被解释为要在图像周围留出的边框空间量,因此将其缩小将使图像之间的间隙缩小。默认的“-geometry” 设置为“120x120>+4+3”,这意味着将给定的任何图像都放入一个 120x120 像素大小的框中。如果图像较大则缩小它,但不要调整较小图像的大小(根据 仅缩小较大图像('>')标志)。然后将“磁贴”大小设置为所有调整大小的图像的最大尺寸和实际指定的尺寸。这意味着您永远不会获得小于指定的“-geometry” 大小的磁贴大小。您可以通过修改“-geometry” 默认值来删除上一个示例空间中磁贴的巨大尺寸。例如,通过删除“大小”组件,将不会调整任何图像的大小,并且“磁贴”大小将设置为所有给定图像的最大尺寸。例如,这里我要求蒙太奇使用给定的最大图像进行平铺,并在磁贴之间留出一个小间隙。当所有输入图像都较小且大小大致相同时的典型设置。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -geometry +2+2   montage_geom.jpg
[IM Output]
例如,这里我用一个更大的“徽标”图像替换了一个图像,但将调整大小设置设置为“48x48” 以调整较小和较大图像的大小。

  magick montage balloon.gif medical.gif present.gif logo: \
          -geometry 48x48+2+2   montage_geom_size.jpg
[IM Output]
这里我再次将调整大小限制为仅大于指定磁贴大小的图像。

  magick montage balloon.gif medical.gif present.gif logo: \
          -geometry 48x48\>+2+2   montage_geom_larger.jpg
[IM Output]
如您所见,图像之间的间距似乎大于请求的 2 像素间距。但事实并非如此。磁贴仍然间隔 2 像素,但图像本身并没有填满请求的 48x48 磁贴大小。“徽标”图像仍调整大小以适合 48x48 像素磁贴。如果您不希望进行任何调整大小,则仅定义磁贴之间的间距。或者,使用特殊大小(例如“1x1<”),它指示 IM 仅将较小图像调整为给定大小。由于没有图像可以小于 1 像素,因此不会调整任何图像的大小。因此,磁贴大小将再次成为页面上所有图像的最大尺寸。有关您可能希望执行此操作的原因,请参阅 零几何,谨慎使用

几何 - 磁贴间距

-geometry” 设置的位置部分将通过在 附加 它们之前在磁贴周围添加这些尺寸的 边框 来在各个“磁贴”之间添加空间。这意味着对于默认的“-geometry” 设置“+4+3”,磁贴将从最终图像的左右边缘间隔 4 像素,并且在磁贴之间将有 8 像素(给定大小的两倍)的水平间距。垂直间距也是如此。请注意,当所有图像都调整大小(倒数第二个示例)时,磁贴之间的空间是边缘周围空间的两倍。

磁贴布局控制

magick montage” 中的下一个最重要的选项是“-tile” 设置。这告诉蒙太奇您希望对最终结果上平铺图像的布局方式施加什么限制。在 ImageMagick 版本 6 中,“magick montage” 将对如何最好地平铺给定数量的图像进行推测,当您没有提供“-tile” 提示时。但是,它假设被平铺的图像本质上大致是方形的,因为它在决定要使用的平铺时不会查看图像的纵横比。

  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
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
奇怪的“[1-5]” 语法是 UNIX shell 的简写,它扩展为文件名列表。“magick montage” 命令本身看不到这些字符,只看到生成的 文件列表。
ImageMagick 非常擅长找出适合特定数量的输入图像的正确“-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” 设置,蒙太奇将始终创建一个足够大的图像来容纳这么多“磁贴”。

  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
[IM Output] [IM Output] [IM Output] [IM Output]
如您所见,蒙太奇创建了一个足够大的图像来容纳指定的磁贴数量,无论有多少图像可用于填充请求的磁贴空间,无论是 7 个图像还是 1 个图像。它只会逐行填充空间,目前没有提供任何选项来逐列填充磁贴空间。
在 IM v6.1 之前,如果图像数量未使用该空间,蒙太奇会自动截断多余的空间。因此,诸如第一个“9x1”图像之类的设置将被截断以生成“7x1”磁贴图像。

因此,蒙太奇的过去用户经常使用诸如“999x1”之类的数字来生成一行图像。现在,这样的参数将生成一个非常长的图像,并且 IM 可能需要很长时间才能完成。因此……

避免在 IM 蒙太奇中使用非常大的磁贴编号!
您可以避免多余空间和多个图像的问题,特别是对于未知数量的输入图像,方法是从“-tile” 设置中删除一行或列号。蒙太奇将把缺失的数字视为可变的,并且蒙太奇只会创建足够的空间来容纳所有输入图像,从而只生成一个图像,而不是多个图像。

  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
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
这是“-tile” 设置更典型的用法,因为它确保蒙太奇大小正确,同时仍然允许它在确定最终数组大小时具有一定的控制权。请注意上面最后一个图像,我们请求了 9 列图像。即使给定的图像少于 9 个,IM 仍然生成了请求的 9 列。另一方面,第一个图像(请求一行)正好具有容纳所有图像的正确长度。如果您提供的输入图像多于蒙太奇可以平铺到“-tile” 设置给定的空间中的数量,则蒙太奇可以生成多个图像,要么导致图像序列号添加到文件名中,要么创建某种 GIF 动画。有关详细信息,请参阅 写入多个图像。例如,这里我要求蒙太奇为生成的每个页面保存单独的图像,方法是为每个图像文件名提供“%d” 以表示帧/场景/页码。

  magick montage  font_*.gif  -tile 4x1  -geometry +2+2  multi_%d.gif
[IM Output] [IM Output] [IM Output]

框架装饰

使用蒙太奇排列图像的最佳部分是它提供了许多额外的控制项来在每个图像周围添加额外的“绒毛”。例如,您可以通过在每个图像周围添加“-frame” 来更好地定义显示的图像。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -frame 5  -geometry +5+5   frame.jpg
[IM Output]
这与“magick” 中的相同选项不同(请参阅 添加 3D 框架 示例)。蒙太奇框架选项将自动为框架的内部和外部斜角计算默认值。因此,只需要一个参数数字。

边框装饰

大约在 IM v6.1.0 左右,“-border” 成为蒙太奇的一个新的装饰选项。它现在在根据“-geometry” 设置调整图像大小后,在每个图像周围添加额外的“填充”。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -border 5 -geometry +5+5   border.jpg
[IM Output]
当也应用了 框架装饰 时,“-border” 装饰当前不起作用。
在 IM v6.1.0(大约)之前,“-border” 将应用于“magick montage” 命令行中出现的图像,就像它在“magick” 中一样。

也就是说,边框将在图像根据“-geometry” 调整大小之前很久就添加到图像中,这会导致每个图像周围的边框宽度不同,具体取决于该点图像的大小。正是为了消除这种不一致性,“-border
成为一个特殊的蒙太奇设置。

阴影装饰

使用框架添加阴影也非常好。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -frame 5  -shadow  -geometry +5+5   frame_shadow.jpg
[IM Output]
当然,您实际上不需要框架来生成图像阴影


  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -shadow  -geometry +5+5  -background lightblue \
          shadow_noframe.jpg
[IM Output]
从 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]
如您所见,蒙太奇使用的阴影实际上是一种半透明颜色,允许背景影响其最终颜色。这意味着如果您创建了一个带有纹理背景的蒙太奇,或使用透明背景并将其叠加,则阴影将正确显示。当然,您需要使用可以处理半透明颜色的图像格式,例如 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
[IM Output]
因此,建议在使用阴影时提供合理的"-geometry" 间距。为了避免“边缘裁剪”阴影过多,"-shadow" 选项将在最终图像的右侧和下边缘添加 4 个额外的边缘间距像素。这在正常提供的"-geometry" 间距之上。但是如您所见,这并不总是足够的空间。蒙太奇目前也不提供对生成的阴影的偏移量、颜色或“柔和度”的控制(至少目前还没有),但是,您在旧版本的蒙太奇提供的硬矩形阴影中也没有这样的控制。

标记蒙太奇图像

您还可以告诉蒙太奇使用其源文件名标记图像,尽管您可能需要调整图像帧的大小,否则标签可能不合适,从而截断文本标签。在这种情况下,我们在几何字符串中添加了“60x60>”,它告诉 IM 将较大的图像缩小以适合此空间,但放大较小的图像。这可能是蒙太奇最典型的用法。

  magick montage -label '%f'  balloon.gif medical.gif rose: present.gif shading.gif \
          -tile x1  -frame 5  -geometry '60x60+4+4>'  label_fname.jpg
[IM Output]
%f”是一个特殊的格式字符,它可以提取内存中图像的各种详细信息。有关可以从图像中提取的其他信息的详细信息,请参阅图像属性转义。在标记缩略图时,您不必使用“-frame” 。标签没有阴影,因此它们保持清晰易读。

  montage -label '%f'  balloon.gif medical.gif logo: present.gif shading.gif \
          -tile x1 -shadow -geometry '60x60+2+2>'  label_shadow.jpg
[IM Output]
并且从 IM v 6.2.1 版本开始,您现在可以使用“-set”图像属性操作符在读取图像后重新标记图像。让我们使用“-set”操作符添加有关图像的更多信息。以及一些其他的蒙太奇设置……

  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
[IM Output]
如我们在上面的示例中所示,您可以使用“-label”设置来定义图像读取时的默认标签,或者您可以在之后使用“-set”操作符重新标记图像。
请注意,“%wx%h”给出图像在内存中的当前像素宽度和高度。如果图像大小被修改,例如在输入期间,这可能与磁盘(或创建)中的图像大小不同。如果您想要其内存中的像素大小,请使用“%[width]x%[height]”。
您还可以通过设置单个图像的标签来以不同的方式标记图像。可以使用任一选项,尽管您需要使用括号来限制“-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
[IM Output]
您可以使用“-label ''”或“+label”关闭下一个图像的图像标记。但是,如您将在后面看到,这两个设置并不完全相同。对于读取后的标签“-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
[IM Output]
最后一张图像显示了如何使用空格作为图像标签来创建图像标签空格,但将其留空。在使用蒙太奇时,这提供了一个很好的经验法则……
要么标记所有图像,要么不标记任何图像!
您不必在蒙太奇操作本身期间标记图像。MIFF 和 PNG 格式都可以将标签存储为其图像格式的一部分。蒙太奇将自动标记任何已包含标签的读取图像。这是自动的,不需要指定,我使用此技术生成了一些非常复杂的图像蒙太奇。例如,注释角度示例中的蒙太奇数组就是使用此技术创建的。如果您不希望此自动标记,则必须明确告诉蒙太奇在读取图像之前使用“-label ''”将所有读取或创建的标签重置为空字符串。或者,您可以在读取图像后使用“+set label”删除标签元数据。这就是“+label”与使用空标签(“-label ''”)的不同之处。前者会将默认行为重置为自动使用读取的图像可能具有的任何标签元数据,而后者则用空字符串替换标签,从而有效地删除标签。您还可以使用“-label '%l'”保留图像的原始标签,这在图像处理脚本中可以用作 NO-OP 标记选项。请注意,“-set”无法恢复图像的原始标签,一旦它被修改或删除,无论是使用“-label”还是“-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
[IM Output]
在上面,您可以看到第一个图像使用图像本身提供的标签进行标记。第二个图像的传入标签被“-label ''”设置删除,而第三个图像也使用了图像标签,因为我们使用“+label”关闭了标签设置。

使用已保存的图像元数据

在为以后由蒙太奇使用生成图像时,了解特定图像文件格式可以保存哪种图像元数据非常重要。例如,只有 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.*
[IM Output]
但是,所有常见的文件格式都允许您使用“comment”元数据,您可以通过为“-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.*
[IM Output]
这对于保存在 JPEG 文件格式中的图片通常更有用,尽管 JPEG 图像注释通常太大(通常是描述图像的整段文字),无法用作蒙太奇标签,因为它们不会进行换行(请参阅拍立得照片蒙太奇,了解使用图像“注释”元数据标记的替代方法)。许多其他程序也会自动将“制作人”标签和注释添加到它们保存的图像中(令人讨厌),因此建议谨慎操作。GIMP 程序特别喜欢添加此类注释和标签,除非您告诉它不要,否则每次保存图像时都会添加。请注意,IM 通常不用于向保存的 JPEG 文件添加注释(由于JPEG 有损压缩),除非出于其他原因处理它们。相反,它们通常通过其他方法添加,以避免读取和重写图像数据,从而降低您要添加注释的 JPEG 图像文件的质量。有关此类方法,请参阅无损 JPEG 处理选项。还需要注意的是,标记(和图像“注释”)不是特定于蒙太奇的。蒙太奇仅在存在时自动使用图像标签。标签和注释附加到图像及其特定文件格式,并且不是蒙太奇甚至 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.*
[IM Output]
实际上,这两种文件格式都允许您保存图像保存时可能存在的任何图像属性元数据

  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.*
[IM Output]

在蒙太奇中留出间隙

虽然您可以通过明智地使用“-tile”设置并控制给定的图像数量来在蒙太奇底部留下额外的空间,但在蒙太奇中间留下空的磁贴空间需要使用特殊的图像。“null:”生成的图像专门为此目的而定义。它出现的那个位置不会收到任何标签(即使定义了标签),也不会添加任何框架或阴影“绒毛”。该磁贴完全留空,除了蒙太奇绘图画布本身的背景颜色(或纹理)之外。

  magick montage -label 'Image' medical.gif null: present.gif \
          -tile x1  -frame 5  -geometry +2+2   montage_null.jpg
[IM Output]
请注意,对于其他 IM 命令,“null:”图像表示为单个像素透明图像。它也用作“错误图像”,用于诸如“-crop”或“-trim”之类的选项,这些选项可能会产生“零”或空图像作为操作的结果。此特殊图像无法保存然后以后使用以留下空白,目前只有在“magick montage”的命令行上给出时,它才是“特殊的”。
目前没有方法允许蒙太奇图像跨越多行或多列,就像您在 HTML 表格中那样。您也不能生成可变大小的行和列以最佳方式适应正在生成的图像数组。

如果您确实需要这种功能,则需要开发自己的蒙太奇类型应用程序。如果您确实开发了一些内容,请贡献出来,我们会考虑将其合并到现有的蒙太奇应用程序中。

一些解决方案包括自己标记和加框图像缩略图,然后使用附加图像或使用更自由形式的分层图像技术。


更多蒙太奇设置

我上面显示的“magick montage”设置只是蒙太奇的基本控制。对于您自己的需求,您可能需要考虑许多其他设置。

蒙太奇颜色设置

-background 绘制框架之外的颜色。通常将其设置为“none”或“transparent”,用于网页。如果给出,则将使用-texture设置。
-bordercolor   图像框架或任何边框填充内的填充颜色。图像中的任何透明区域都将变成此颜色,除非没有添加此类装饰。
-mattecolor 用作框架颜色的颜色。请注意,颜色也会变亮和变暗,以使框架具有斜面 3D 外观。因此,此设置实际上定义了 5 种颜色。(另请参阅加框图像
-fill 文本标签和标题的填充颜色。
-stroke 文本标签和标题的描边颜色。

蒙太奇控制设置

-tile {cols}x{rows}
用于填充单个蒙太奇图像的图像横向和纵向数量。如果读取或创建的图像数量超过单个蒙太奇图像可以容纳的数量,则将创建多个图像。(请参阅上面的磁贴控件
-title {string}
使用与用于标记单个图像相同的字体(但更大)在整个蒙太奇上设置标题。

-frame {宽度}
在包含图像的方框周围创建一个边框,使用提供的宽度(必须至少为 2,但 5 或 6 是一个好的值)。如果使用,图像中的任何透明度也将成为边框颜色。
-border {宽度}
在图像周围创建一个边框,使用提供的宽度。如果使用,图像中的任何透明度也将成为边框颜色。
-shadow
生成边框的阴影。请注意,不需要或不需要任何参数。
-texture {文件名}
使用给定的纹理(平铺图像)作为背景,而不是特定的颜色。有关更多信息,请参见下面关于背景和透明度的部分。
-geometry {W}x{H}+{X}+{Y}
在将所有图像读取并蒙太奇叠加到画布上后,调整图像大小。它还定义了图像绘制到的图块的大小和间距。如果未指定大小,则图像将不会调整大小。
-gravity {方向}
如果图像小于边框,则图像将在边框中的哪个位置放置。默认情况下,它位于中心。
"label:"图像创建运算符理解的所有字体设置(参见标签图像生成器)。这些设置用于创建添加到显示图像下方的标签。这些包括“-font”,“-pointsize”(对于“-title”忽略),“-density”,“-fill”,“-stroke”和“-strokewidth”等设置。只要在最终的“输出文件名”参数之前定义或重置了任何或所有上述设置,蒙太奇就会按您的要求使用它们。

重复使用图像读取/创建设置

但是请注意,许多这些选项也用于其他目的,无论是在图像生成中还是在图像处理过程中。但由于 IM v6 上的“按您所见进行操作”命令行处理,这对“magick montage”命令没有任何问题。这意味着您可以自由地使用任何这些选项设置来读取、创建或修改正在读取的图像,然后在所有图像读取或创建后重置这些设置。最终的设置值将是蒙太奇用于其最终处理的值。在 IM v6 之前的版本中情况并非如此,在这些版本中,通常不可能将图像创建设置与蒙太奇设置分开,而无需生成中间图像(如上面的图像标签示例中)。这是一个重复使用设置的实用示例。我想制作一个我一直在这些示例页面中使用的某些字体的表格,然后将设置重置为其他值,以便蒙太奇最终处理图像。
 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]
请注意“magick montage”命令的两个阶段。我用一个几乎空的额外行清楚地标记了它们。第一部分基本上与您使用正常的 IM“magick”命令定义多个图像完全相同,并且按照相同的“按您所见进行操作”顺序进行处理。第二部分定义了我想让“magick montage”命令本身使用的所有设置。也就是说,我想在最终的蒙太奇图像中使用的框架、图像大小调整、字体和颜色。我特别注意重置“-font”和“-pointsize”设置,用于蒙太奇图像下方的标签。虽然您可以像这样分离“magick montage”的选项,但实际上可以在命令行上的任何时间定义蒙太奇设置。只要这些设置不干扰您的图像创建和处理选项,并且在命令行结束时仍然正确定义,则“magick montage”将使用它们。附注:您可能想查看我编写的执行类似于上述操作的 shell 脚本(并且与早期版本的蒙太奇一起使用)以显示 truetype (.ttf) 字体的目录,名为“show_fonts”。另一个 shell 脚本示例是“show_colors”。

蒙太奇与 Magick 选项差异

现在,虽然“magick montage”通常允许您在读取和处理其输入图像时使用任何“magick”设置和运算符,但有一些差异需要突出显示。这些“magick”运算符和设置在“magick montage”中使用时有所不同。
-tile
在“magick”中,“-tile”设置定义要用作纹理的图像,而不是使用“-fill”颜色。在“magick montage”中,它定义了如何布局各个图像单元“图块”。有关更多详细信息,请参见上面的图块布局控件
-frame
在“magick”中,这是一个用于在图像周围添加 3D 框架边框的操作符,并且需要 4 个参数才能正确工作(参见转换框架示例)。有关更多详细信息,请参见框架装饰
-border
大约在 IM v6.1.0 左右,此运算符成为一个特殊的蒙太奇选项。因此,与之前的框架选项一样,它只接受一个数字作为参数,而不是像转换边框那样接受两个参数。有关更多详细信息,请参见边框装饰
-shadow
magick”中的“-shadow”选项接受一个参数,该参数用于创建模糊阴影,可以在第二个原始图像副本下放置该阴影。但是,在“magick montage”中,这只是一个布尔设置,仅用于打开和关闭矩形阴影功能。有关更多详细信息,请参见阴影装饰
-geometry
magick montage”中的“-geometry”选项仅用于提供最终蒙太奇中每个单元格内图像的大小以及单元格之间的间距。在“magick”中,它仅调整最后一个图像的大小,并设置图像合成的偏移量。
如果您确实需要使用这些选项的“magick”形式,则需要使用“magick”预处理图像,然后再将它们传递给“magick montage”。上面图像标签示例中演示了一种使用中间文件的方法。另一种方法是只在“magick”中执行处理,并将生成的多个图像管道输出到“magick montage”。如果您始终首先处理图像输入,然后设置“magick montage”特定的设置,例如我在所有这些示例中所做的那样,则这种分离很容易实现。这在上面最后一个字体示例中尤其突出。例如,让我们使用“magick”框架为图像添加框架,然后使用“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
[IM Output]
您还可以看到“magick”形式的“-frame”运算符所需的额外参数。

图像目录索引

HTML 缩略图图像地图

蒙太奇专门设计用于生成图像的缩略图地图。例如,我在这里创建了照片图像源目录的索引,该目录包含在整个 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 Output]
IM 示例
照片商店
请注意使用“%[width]x%[height]”而不是“%wx%h”。这很重要,因为图像在读取时正在调整大小。前者将使用其在磁盘上的原始像素大小标记图像,而后者将使用图像的当前调整大小的大小。这是用户很容易忽略的事情。
此命令的结果是三个文件……
photo_index.png 所有图像缩略图的蒙太奇
photo_index_map.shtml 缩略图图像的 HTML“图像地图”
photo_index.html 万维网的 HTML 缩略图索引页面。
这也包含先前图像地图的副本。
当然,如果您只需要索引图像,则不必生成 HTML 索引文件。在这种情况下,只需将上面命令中的“INDEX.html”替换为您要生成的图像即可。请注意使用图像属性转义%t”作为图像“-label”。这是没有任何“路径”组件的图像文件名。尽管 HTML 链接仍将包含适当的“路径”组件,允许您在与图像本身不同的目录中构建索引图像。上面示例中的源图像“'*_orig.*'”被引用,因此“magick montage”命令本身执行“*”的扩展,而不是命令行 shell。这避免了您可能遇到的任何命令行长度限制。此外,我在读取图像时还进行了一些初始图像大小调整“[120x190]”(参见读取图像修改器)。对于 JPEG 图像,我还指定了一个较小的“-size”设置,以便 JPEG 库可以进行一些非常粗略的初始缩放,并且不会将整个图像读入内存。如果不这样做,则非常大的 JPEG 图像可能会消耗大量内存和 CPU 周期,而实际上没有必要。我还“-strip”图像可能具有的任何配置文件。有关更多信息,请参见配置文件、剥离和 JPEG 处理读取 JPEG 图像。请记住,蒙太奇“-geometry”选项也可以指定最终的大小调整设置,但在这种情况下,由于我在读取过程中已经进行了大小调整,因此不需要它,所以我没有在该设置中设置任何“大小”。最后,“5x”的蒙太奇“-tile”选项用于确保所有图像都显示在单个图像中,否则“magick montage可能生成多页 HTML 文件,这些文件未正确链接在一起。希望这种情况会发生变化,尽管 HTML 生成不是 ImageMagick 的主要目标。有关生成缩略图和 HTML 索引页面的其他方法,请阅读缩略图示例页面

使用 JPEG 图像的较小 HTML 索引地图

以上索引图像生成了一个 PNG 格式的索引图像。之所以使用 PNG 格式,是因为它是一种无损格式,当被索引的图像颜色差异很大时,这一点非常重要。如果背景颜色设置为“transparent”或“none”,它还可以使用 montage 的新“软阴影”功能。非常旧版本的 IM 会为以上内容生成 GIF 图像。但是,由于格式的限制,这会导致结果的颜色大幅减少。它也不允许使用 PNG 允许的半透明“软阴影”。JPEG 也不允许半透明,但如果您不使用透明背景,则这不是问题。然而,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 Output]
IM 示例
照片商店
以上命令比较复杂,以下是具体操作...
  • 首先,我像之前一样生成一个 montage 缩略图 HTML 索引。这生成了以下文件:“photo_jpeg.html”和“photo_jpeg.png
  • 然后,我将 PNG 图像转换为更小、有损的 JPEG 图像。
  • 然后,我使用了一个简单的“perl”单行脚本将 HTML 文件修改为使用 JPEG 图像而不是 PNG 图像。
  • 最后,我删除了 PNG 图像以及我不需要的 SHTML 映射文件。
瞧,我们现在有一个使用非常小的 JPEG 图像作为缩略图索引图像的缩略图索引。以下是缩略图索引图像文件大小的比较...
[IM Text]
也就是说,用于索引的图像大小仅为原始 PNG 图像大小的 15% 左右。对于可下载的缩略图网页来说,这是一个很大的节省!您可以通过使用更小的“-quality”设置使 JPEG 图像更小,尽管默认设置产生的结果已经非常合理。其他可能的选项包括使用“-sampling-factor 2x1”使其更小。

视觉索引图像(非 montage 解决方案)

除了使用 montage 之外,还可以使用特殊的“视觉索引”输入格式...

  magick 'vid:../img_photos/*_orig.*' vid_index.gif
[IM Output]
视觉索引
照片商店
并且还可以生成“可点击”的 HTML 索引文件。

  magick 'vid:../img_photos/*_orig.*' vid_index.html
[IM Output]
视觉 HTML
照片商店
很明显,“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
[IM Output]
拍立得
蒙太奇
请注意,由于我使用了“+polaroid”来为图像添加边框和标签,因此我需要自己调整图像大小(使用“-thumbnail”),并确保在实际创建“magick montage”索引数组之前已重置“-background”和图像“-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
[IM Output]
更清晰
拍立得
蒙太奇
这种花哨的蒙太奇以及上面显示的其他技术被用于创建一个脚本,在实际的“photo_store”目录中生成蒙太奇缩略图索引。有关此脚本的结果,请参见照片商店索引

使用蒙太奇的特殊技巧

蒙太奇成列

默认情况下,“magick 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]
请注意,是第一个“magick montage”创建了图块并执行了所需的任何几何图块大小调整、边框、标签和间距。然后它将为每一列图块输出一个图像。第二个“magick montage”然后简单地将列连接成“页面”图像,而不会在列之间添加更多间距。如果您只需要一个包含可变列数的单个图像,则可以使用“magick”替换第二个“magick montage”来连接,而不会添加“页面”的额外间距。例如...

  magick montage font_*.gif  -tile 1x3  -geometry 16x16+1+1  miff:- |\
    magick - +append montage_columns_2.gif
[IM Output]

重叠的蒙太奇磁贴

IM 用户论坛中,在Fred Weinhaus(又名fmw42)和另一位用户pooco之间的讨论中,人们发现,如果将图块间间距(在“-geometry”设置中设置)设置为负数,则实际上可以将绘制图像的图块区域重叠。例如,这里我们使用负水平图块间间距,用于一行图像。

  magick montage null:   font_*.gif   null: \
          -tile x1 -geometry -5+2  montage_overlap.jpg
[IM Output]
旋转图像将使重叠序列更加有趣...

  magick montage null: font_*.gif null: -background none -rotate 30 \
          -background white -tile x1 -geometry -8+2  montage_rot_overlap.jpg
[IM Output]
请注意,我需要在图像行的开头和结尾添加一个特殊的“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
[IM Output]
上面使用的extent用于消除“+polaroid”在不同“运行”中可能产生的图像大小随机性,从而更好地控制最终图像之间的间距和重叠。这是一个非常有趣的结果,但实际上应该将其归类为 BUG,因为这不是“magick montage”的预期用途。我也不期望任何 HTML 图像映射能够正常工作,除非用户进行一些修复。但是,使用脚本形式的图层合并演示了一种更复杂且用户可控的重叠图像解决方案,这是推荐的且更合理的解决方案。请参阅图层图像的编程定位中的示例。

蒙太奇连接模式

如您所见,montage 具有特殊的连接模式,可用于将图像连接在一起,而无需任何额外的间距,就像“-append”选项一样。但是,我建议您适当地设置“-tile”选项,以便将追加方向设置为水平、垂直或数组。例如,这里我们使用“-tile x1”水平追加图像。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -mode Concatenate  -tile x1  montage_cat.jpg
[IM Output]
但您也可以用它同样轻松地创建图像数组。最好是图像大小相同,以便它们能够正确地拼接在一起。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -mode Concatenate  -tile 2x2  montage_array.jpg
[IM Output]
连接不同大小的图像时,图像将使用“顶部”垂直对齐,然后使用“左侧”水平行对齐。

  magick montage medical.gif rose:      present.gif shading.gif \
          granite:    balloon.gif netscape:   recycle.gif \
          -mode Concatenate  -tile 4x  montage_cat2.jpg
[IM Output]
但是,当添加边框时,垂直对齐会变得很奇怪。

  magick montage medical.gif rose:      present.gif shading.gif \
          granite:    balloon.gif netscape:   recycle.gif \
          -mode Concatenate  -tile 4x  -frame 5  montage_cat3.jpg
[IM Output]
当然,边框实际上不是连接模式的一部分,因此,如果在“-mode”设置之前设置了“-frame”,它将被关闭。因此,除非您意外使用“零几何”(见下文),否则不太可能看到这种怪异现象。
蒙太奇连接到“HTML”图像索引格式会导致图像映射不正确。基本上,生成的图像映射将类似于生成的蒙太奇是一个真正的等分“数组”图像,而不是图像的串联。换句话说,对于“短”图像行来说,它是错误的。

零几何,需要谨慎

仅使用“-geometry”间距值(未指定图像大小调整),所有蒙太奇图像框架都设置为相同的大小,以便最宽和最高的图像都适合,而无需调整大小。这本身就是一种有用的行为...

  magick montage present.gif rose: shading.gif \
          -frame 5  -geometry +1+1   montage_geom_1.jpg
[IM Output]
但是,在图像框架周围和之间留下了 1 像素的间隙。但是,如果您尝试使用“+0+0”位置删除这些间隙,则会遇到一个非常不寻常的问题...

  magick montage present.gif rose: shading.gif \
          -tile x1  -frame 5  -geometry +0+0  montage_geom_0.jpg
[IM Output]
您指定的“零几何”(即“-geometry 0x0+0+0”)具有额外的效果,即使蒙太奇进入“连接”模式(见上文),这与我们在上面追求的目标不符。对于单个图像,如果我们使用零“-append”(从而使用连接模式),也无关紧要。所需的结果是我们想要的,没有额外的边框。因此,如果您仅使用“magick montage”来向图像添加标签,“-geometry +0+0”是可以的。但是,如果您为图像指定了非零几何“大小”,即使您使用了零偏移量,也不会调用连接模式。这反过来为我们提供了一个解决原始问题的巧妙方法。我们设置“1x1”的几何图像大小,但也告诉 IM 永远不要将图像(使用“<”字符)缩小到此大小!换句话说,永远不要调整图像大小,只需在非零几何参数中使用零偏移量。

  magick montage present.gif rose: shading.gif \
          -frame 5  -geometry '1x1+0+0<'  montage_geom_1x1.jpg
[IM Output]
这引出了另一个很好的经验法则...
在使用蒙太奇时始终设置非零几何
即使它只是像我上面使用的“伪”几何。

背景和透明度处理

默认情况下,图像会覆盖到蒙太奇画布上,该画布使用“-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]
您可以使用“-texture”来定义要使用的图块图像,而不是“-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]
添加边框(会在图块中添加额外的边框空间)只是在背景画布上添加了更多绘制的“毛边”。

  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]
请注意,当添加边框时,“-bordercolor”设置将用于填充边框内部,有效地成为图像的背景颜色。还要注意,图像的任何透明区域也将设置为此颜色。
在 IM 6.1.4 版本之前,图像透明区域中显示的内容是未定义的。在某些版本中,您可以透过带边框的图像看到背景颜色或纹理。在其他版本中,您可能会看到黑色或白色。在其他一些版本中,您将能够看到所有图层,并且最终图像在原始图像透明的地方也将是透明的。如果这对您来说是一个问题,请立即升级。

IM 6.1.4 版本的新功能是能够使用特殊的 1 像素宽边框。这将基本上完全删除图像单元格周围的边框,但保留图像周围(和下方)的内部“-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
[IM Output]

  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]
但是,如果您希望蒙太奇具有透明背景怎么办?特别是,如果您计划在包含纹理映射的网页上使用它。很简单,只需使用“-background”颜色“None”或“Transparent”,并且没有任何“-texture”图像来覆盖该设置。例如,这里我们生成了一个透明蒙太奇。请注意,“-geometry”仍然用于在图像周围和之间添加空间。


  magick montage font_9.gif  recycle.gif  medical.gif \
          -tile x1  -geometry +2+2  -background none   bg_none.gif
[IM Output]
当然,如果您也使用“-frame”,则也需要将“-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]
请注意,montage 的“-shadow”选项完全不受上述所有内容的影响。它根据单元格最终的透明形状应用,然后覆盖到背景颜色或纹理上。

  magick montage font_9.gif  recycle.gif  medical.gif \
          -tile x1  -shadow  -geometry '40x40+5+5>' \
          -texture bg.gif  bg_shadow.gif
[IM Output]

  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
[IM Output]



当然,欢迎任何关于使用“magick montage”的建议、想法或其他示例。这些示例页面中的任何内容也同样欢迎。
Montage Image Output Size

The mathematics of montage is straight forward...

Basically the montage width should be....
  (geometry_size + 2*frame_size + 2*geometry_offset) * images_per_column

That is, each 'cell' of montage has a fixed sized frame and spacing (border)
added around it before the cells are appended together.

In essence the size of montage is also a multiple of the tile size, which can
make it easy to break up montage, or re-arrange the 'cells', if so desired,
as they are simple fixed sized tiles in a rectangular array.

The height is similar but with tha additional spacing needed for labels and
the optional montage title, both of which are much more difficult to
calculate, as they depend heavilly on text, font, pointsize, and density
settings.

There is also an effect of adding a shadow to the montage in this calculation,
but that appears to be a simple small fixed addition to the bototm and right
edges.  It does not appear to effect the tile size used.