ImageMagick 示例 --
创建缩略图和边框

ImageMagick 示例前言和索引
缩略图存储
通用缩略图创建
其他非 IM 技术
添加填充
框架技术
使用边缘图像进行框架
ImageMagick 最大的用途之一是为家庭相册、体育和爱好页面、目录等创建缩略图。通常用于万维网或照片 CD。此页面提供了用于生成缩略图的示例和技术。

缩略图存储

我想首先从一个非常重要的点开始。来自摄像机和照片扫描的原始图像应保存在原始格式的安全位置,最好是非有损格式(不是 JPEG 图像格式),无需任何修改、调整大小或其他更改,除非可能是文件名更改。当然,扫描的图像可以重新扫描,但最好重用原始源,而不是以后从已经降级的副本重新执行。这非常重要,因为任何形式的修改都意味着图像中某些信息的丢失,并提供了一个可以重新处理图像以用于其他用途的来源。原始图像不必是您的工作图像,该图像可以调整大小或调整颜色以进行显示,只需确保将您的图像保存并备份到安全的地方以备将来使用。接下来要做的事情,甚至在您创建任何缩略图之前,就是决定如何相对于您的正常大小的图像格式保存缩略图,然后坚持该方案。这对于网页尤其重要。方案包括……
  • 以您想要或需要的尺寸以有损 JPEG 格式保存主照片图像,然后使用相同的名称为生成的缩略图,但使用 GIF 图像格式。例如,相同的文件名但不同的格式和后缀。主图像:photo_name.jpg 缩略图:photo_name.gif
  • 将缩略图与相同名称存储在名为“thumbs”或任何方便您的子目录中。主图像:photo_name.jpg 缩略图:thumbs/photo_name.jpg
  • 使用与原始图像相同的格式,但在文件名中添加额外的字符串。典型的字符串添加包括“_tn”、“_small”、“_thumb”等。主图像:photo_name.jpg 缩略图:photo_name_tn.jpg
  • 上述方法的某种组合。没有理由不能以不同的图像格式保存缩略图,并在文件名中附加额外的图像后缀,并保存在子目录中!主图像:images/photo_name.jpg 缩略图:thumbs/photo_name.jpg.gif 这在 WWW 上实际上非常常见,我甚至见过这两个目录存储在完全不同的机器上!
第一个方案可以使用“magick mogrify”生成所有缩略图,而不会破坏原始图像,方法是使用“-format”设置来指定输出图像格式。从 IM v3.2.0 开始,第二个方案现在也可以使用“magick mogrify”来完成,这要归功于添加了一个特殊的“-path”设置,该设置指定一个不同的目录来保存修改后的图像。例如,这会将 JPG 图像转换为“thumbs”子目录中的 GIF 缩略图,该子目录刚刚创建。

  mkdir thumbs
  magick mogrify  -format gif -path thumbs -thumbnail 100x100 *.jpg
其他方法将要求您首先在运行“magick mogrify”之前复制原始图像,创建用于处理图像的特殊脚本,或其他一些 DIY 方法。在批量处理 - 不使用“magick mogrify的示例部分的末尾详细介绍了一些更简单的非 IM 技术。无论您选择哪种方法,重要的是选择一种缩略图存储方案,然后坚持下去。通过对所有缩略图使用相同的方案,您就可以编写 shell 或 Perl 脚本,使缩略图生成甚至 HTML 链接的生成变得容易。稍后详细介绍。

缩略图格式的选择

保存缩略图的格式会对其最终磁盘大小和网页下载速度产生重大影响。在这方面,我建议您研究各种常见文件格式的摘要。具体来说,您应该注意……
JPEG 压缩效果好且是有损的,但它专为大型真实世界图像而设计,而不是小型缩略图。它也不允许任何形式的透明度。总之,该格式对于大型图像来说很好,对于缩略图来说很糟糕。注意配置文件(见下一节)。虽然 JPG 不推荐用于缩略图,但为了在 WWW 上查看图像,建议您使用较小的 800x600 像素图像,以及更低的“-quality”百分比(例如 50 甚至 30%),尽管它看起来不太好。有人建议使用“-sampling-factor 2x1”也会产生更小的 JPEG 图像大小。我不建议将完整的原始图像直接放置在网络上,除非是暂时(在参考位置)供朋友下载。请记住,不要链接到它(即使通过目录索引),并且永远不要超过一天,否则它可能会被 Google 搜索到。
GIF 适用于简单的少量图像,并且压缩效果还可以。它有 256 种颜色限制,但对于小图像来说,这很少会引起注意。它还可以对图像进行卡通动画,但这对于缩略图来说是不需要的,除非您真的想变得花哨。问题是该格式仅具有布尔(开/关)透明度,这使得形状图像上的边框看起来很糟糕。解决方法是设计缩略图以仅使用布尔透明度,或将其安排以便它只能用于特定的背景颜色。有关详细信息,请参阅有关GIF 在背景颜色或图案上的示例。
PNG 是缩略图的现代理想格式。它具有良好的压缩和内部格式样式。它是无损的,可以显示所有颜色,并且如今几乎所有浏览器都支持它(尽管对于 Microsoft Internet Explorer,在 v7 之前,需要在网页中添加一些 Java 脚本)。更重要的是,此格式支持半透明颜色,使阴影和边缘清晰锐利,或根据您的需要淡化和模糊。但是,此格式不执行动画,尽管相关的 MNG 格式可以执行。然而,很少有浏览器似乎支持该格式。对于缩略图,您可以通过减少深度和颜色数量以及为最终的缩略图图像设置更高的“bzip”压缩质量(“-quality”中的第一个数字)来减小最终图像的大小。例如,以下建议用于不涉及透明度的小型 PNG 缩略图。

        -strip  -quality 95  PNG8:thumbnail.png
    
它使用较小的 8 位或 256 色限制的 PNG 格式。您还可以通过辅助应用程序重新处理最终图像(请参阅非 IM PNG 处理),这些应用程序可以自动找到特定图像的最佳 PNG 压缩。还有一些程序可以将颜色减少到较小的内部 PNG 格式,同时保留半透明颜色。这是 IM 目前无法处理的事情。
关于格式的最后一句话... 无论您为缩略图使用哪种格式,如果必须保存中间未完成的图像,请使用 PNG(没有任何颜色减少)或 MIFF 图像格式。这样做将在中间阶段尽可能多地保留有关图像的颜色信息。仅在作为绝对最后一步时才执行颜色减少或保存到 GIF 或 JPEG 格式。这一点很重要,所以我再说一遍……
不要将 JPEG、PNG8 或 GIF 用于中间工作图像!
最好使用 PNG 或 MIFF。

配置文件、剥离和 JPEG 处理

许多来自数码相机、扫描软件和一些绘图程序(Photoshop 以此而闻名)的图像以配置文件的形式保存有关图像的额外信息。这包括 JPEG、PNG、TIFF 等图像格式,以及从 IM v6.2.4-1 开始的 GIF。当然,IM 特定的格式 MIFF 也会这样做。(有关更详细的信息,请参阅图像配置文件)。这些配置文件的大小可达 60 Kb,因此会对文件大小产生重大影响,并且默认情况下,IM 会保留此配置文件信息。缩略图不需要此数据,而且通常即使主图像也不需要它。您还可以使用 IM 命令从图像中删除配置文件……

  magick input.jpg  -strip output.jpg

  magick mogrify -strip  *.jpg
您还可以使用选项“-profile '*'”删除配置文件。但是,建议您仅在修改图像时才剥离配置文件,尤其是在减小图像大小以用于 Web 显示或缩略图图像时。在调整大小(尤其是生成较小的缩略图图像)时剥离配置文件非常普遍,因此“-resize”和“-strip”被组合成一个新的操作,仅用于此目的。自然地,此调整大小操作称为“-thumbnail”。例如……

  magick -define jpeg:size=240x180 image.jpg -thumbnail 120x90 thumbs/image.gif

  magick mogrify -path thumbs -format gif -define jpeg:size=240x180 -thumbnail 120x90 '*.jpg'
在 IM v6.5.4-7 之前,“-thumbnail”会从图像中剥离所有配置文件,包括 ICC 颜色配置文件。从该版本开始,颜色配置文件将被保留。如果不需要颜色配置文件,则“-strip”所有配置文件。

"magick mogrify" 当然可以为整个 JPEG 图像目录生成缩略图,但请注意它不会覆盖您想要保留的任何缩略图。有关用于循环遍历大量图像的其他多种非 IM 方法,请参阅 批量处理 - 不使用 Mogrify 的示例部分。对于非常大的图像,"-thumbnail" 调整大小操作会更进一步,首先将图像缩小到最终缩略图大小的 5 倍,然后再进行实际的调整大小操作。这进一步加快了缩略图的生成速度。但是,对于缩略图 JPEG 图像,可以通过一开始不将整个图像读入内存来使用一种更好的限制初始图像大小的方法。"-define jpeg:size=" 设置(如上例所示)是对 JPEG 图像库的一个特殊提示,以减少从非常大的 JPEG 图像中读取的数据量。请参阅 读取 JPEG 文件
在 IM v6.5.6-0 之前,此编码器设置是从 "-size" 设置中提取的。当用户使用 "-size" 创建图像,然后让 JPEG 读取产生意外结果时,这会导致问题。因此,这被更改为一个特殊的编码器设置。

在较旧版本的 IM 中,由于这种“双重”作用,您可能需要使用 "+size" 重置设置,然后再读取 JPEG 图像。
从 IM 版本 6.2.6-2 开始,添加了一个新的 读取图像修改器,它允许您在读取输入图像后立即调整其大小。此选项适用于任何图像格式,而不仅仅是 JPEG 图像。但是,它不能替代使用 "-define jpeg:size=" 设置来处理 JPEG 图像。因此,现在推荐用于调整大小任何输入图像格式的方法是……

  magick -define jpeg:size=240x180 input.img'[120x90]' \
          -strip  output_thumbnail.gif
好的,让我们继续使用实际的 IM 缩略图示例……

通用缩略图创建

常规生成缩略图(特定高度)

让我们将 大型示例 JPEG 图像 转换为高度为 90 像素的 GIF 缩略图,并自动调整宽度(在 250 像素宽度限制内),以保持图像的纵横比。

  magick -define jpeg:size=500x180  hatching_orig.jpg  -auto-orient \
          -thumbnail 250x90   -unsharp 0x.5  thumbnail.gif
[IM Output]
请注意,我在上面使用了 "-thumbnail" 选项。这不仅调整了图像大小,还删除了原始 JPEG 图像中可能存在的任何和所有配置文件和注释信息。此外,由于它对图像的初始缩小使用了 "-sample" 调整大小操作符,因此速度更快,同时为小型缩略图生成合理的结果。我还为正在读取的图像设置了最小 "-define jpeg:size="。这会传递给 JPEG 库,该库将返回介于此大小和此大小的两倍(如果可能)之间的图像,而不是整个非常大的原始图像。基本上,当不需要时,不要用巨大的图像溢出计算机内存。我使用的 JPEG 大小提示至少是最终缩略图的两倍,以便调整大小仍能生成看起来合理的结果。"-auto-orient" 操作符确保图像(如果来自数码相机)根据相机的方向正确旋转。对于我正在使用的“桌面”图像,这不需要,但我在上面将其包含在内以供数码相机用户使用。但是请注意,方向仍然可能出错,尤其是在直接向下或向上查看照片时,例如拍摄文档照片时。结果是具有特定高度但宽度可变的缩略图。我将此缩略图用于我自己的网页,以便一行中的一系列图像在高度上都匹配,形成整齐的外观。上面 250 像素的宽度限制非常重要。如果未设置(例如:使用 "-thumbnail x90"),当生成非常长且细的图像(例如 网络线条图像 中显示的图像)的缩略图时,IM 可能会遇到问题。在这种情况下,结果将是图像的非常非常长的 *放大*,而不是一个小缩略图。有些人(包括我自己)发现,虽然 IM 的调整大小是最好的实现之一(请参阅 IM 调整大小与其他程序),但结果仍然有点模糊。因此,您可以在 "-thumbnail" 调整大小操作后稍微锐化图像(使用 "-unsharp") 来改进上述结果。有关更多信息,请参阅 锐化调整大小的图像 - Photoshop 调整大小技巧,但这确实归结为个人品味的问题。
"magick mogrify" 版本与 "magick" 命令(没有初始输入图像)相同,但它会自动生成当前目录中 *每个* JPEG 图像的缩略图。图像参数被引用,以便 IM 本身扫描目录,而不是命令行 shell。这可以防止在包含大量图像的目录中出现“行限制溢出错误”。

  magick mogrify  -format gif -define jpeg:size=500x180 -auto-orient \
                -thumbnail 250x90 -unsharp 0x.5  '*.jpg'
请注意,"magick mogrify" 会盲目创建缩略图,替换任何同名现有图像。在这种情况下为 GIF 图像。使用此命令时始终建议格外小心。

在进行任何处理之前,始终建议备份副本。
您可以使用 "-path" 设置定义一个单独的缩略图目录,而不是指定不同的格式(使用 "-format"),以防止 "magick mogrify" 覆盖原始源图像。您可以同时使用这两个输出选项。
虽然 "magick mogrify" 可以使用不同的后缀 ("-format") 或目录 ("-path") 输出新图像,但它们是使用此命令的唯一选项。如果您还想更改图像的名称,例如添加 "_tn" 或 "_sm" 来表示图像的缩略图或小版本,那么我建议您创建一个 shell 脚本来为您完成这项工作,使用 "magick" 一次处理一个图像。     *我编写了这样的脚本,同时生成 HTML 索引。*

调整缩略图大小以适应

另一种自动缩略图生成的形式是将图像缩小以适合固定大小的框,例如 "100x100",但保持图像的纵横比。嗯,这是调整大小几何设置的默认含义。
但是,我更喜欢不放大已经适合此类框的图像。为此,您需要在几何字符串中添加 ">"。

  magick -define jpeg:size=200x200 hatching_orig.jpg \
          -thumbnail '100x100>' rectangle.gif
[IM Output]
与之前一样,保持图像的纵横比,因此缩略图不太可能是精确的 100 像素正方形。但是,至少图像的一个维度将是 100 像素。

填充缩略图

下一个最常见的请求是生成用特定颜色(通常是“black”或“transparent”,但对于这些示例,我将使用“skyblue”)边框填充图像的缩略图,以便缩略图完全是您想要的大小。例如:将大小为 400x300 像素的图像缩小以适合 100x100 像素的框,通常(使用上述方法)将具有 100x75 像素的大小。我们希望在图像的顶部和底部(以及侧面,以确保)添加一些填充边框,以使最终的缩略图图像始终为 100x100 像素。
有多种方法可以做到这一点,从 IM v6.3.2 开始,最好的方法是使用 Extent 操作符

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -background skyblue -gravity center -extent 100x100 pad_extent.gif
[IM Output]
从 IM 版本 6.2.5 开始,您还可以使用 视口裁剪,并将结果展平到背景颜色上。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -gravity center  -crop 120x120+0+0\! \
          -background skyblue  -flatten    pad_view.gif
[IM Output]
使用 Extent视口裁剪 之间的主要区别在于您是否希望使用最小的 虚拟画布 或使整个区域“填充”。填充图像的另一种方法是将缩略图叠加到大小正确的背景图像(实际图像、纯色或平铺画布)上,在本例中为 128x128 的“granite:”内置图像。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          granite: +swap -gravity center -composite pad_compose.gif
[IM Output]
此方法可能是与旧版 IM(例如 IM v5)一起使用的最佳方法,尽管 "-composite" 操作需要由单独的 "composite" 命令完成,而不是上述单命令方法。但是,从图像处理的角度来看,上述所有操作实际上都在做同样的事情。

裁剪缩略图以适应

另一种方法是,与其填充图像以适合我们想要的特定缩略图大小,不如切掉不适合最终大小的图像部分。当然,这意味着您实际上会丢失原始图像的一些部分,特别是图像的边缘,但结果是图像中心部分的放大缩略图。这通常(但并非总是)是图像的主要主题,因此它是一种实用的缩略图创建方法。从 IM v6.3.8-3 开始,添加了特殊的调整大小选项标志“^”以简化此操作。我们只需使用此标志调整大小,然后裁剪溢出所需大小的图像部分。

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 100x100^ \
          -gravity center -extent 100x100  cut_to_fit.gif
[IM Output]
如您所见,图像的缩略图更大、更详细,但代价是切断了原始图像的侧面。有关此选项的更多信息,请参阅 调整大小以填充给定区域
在 IM v6.3.8-3 之前,添加此特殊标志时,您需要一些非常复杂的技巧才能获得相同的结果。有关详细信息,请参阅 调整大小以填充给定空间

区域适配缩略图大小

最后两种方法通常会使图像非常小,并带有许多额外的填充,或者,它会切掉很多图像以完全填充空间。但是,通过使用不同的调整大小标志,可以获得介于这两种极端情况之间的缩略图。例如,100x100 像素的缩略图有 10,000 个像素。现在,如果我们要求调整大小将图像大小调整到大约这么多像素(使用 调整大小“@”标志),您将拥有一个需要一些填充和一些裁剪的图像。这最大化了结果缩略图的大小,同时不会切除太多。例如……

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 10000@ \
          -gravity center -background skyblue -extent 100x100  area_fit.gif
[IM Output]
如您所见,缩略图有一些填充,图像也有一些裁剪,但结果可能是图像与给定缩略图空间的最佳拟合。

适应给定空间总结

总而言之,以下是将图像缩略图化到特定大小区域的三种方法的结果。所有三种方法都使用完全相同的代码,只是使用的调整大小参数/标志略有不同。
[IM Output]
填充拟合
调整大小,无标志
[IM Output]
区域拟合
调整大小,“@”标志
[IM Output]
裁剪以拟合
调整大小,“^”标志

正方形填充和裁剪

上述填充和裁剪方法假设您知道要使图像适合的区域的最终大小。但这并非总是如此。有时您只想“使图像正方形”,可以通过“填充”它(外部正方形)或“修剪”边缘(内部正方形)来实现。从 IM 讨论论坛上关于 使图像正方形 的主题中,开发了一些方法。
可以使用 马赛克 通过旋转图像副本创建更大的背景画布来完成外部正方形。

  magick thumbnail.gif \
          \( +clone -rotate 90 +clone -mosaic +level-colors white \) \
          +swap -gravity center -composite    square_padded.gif
[IM Output]
另一方面,内部正方形稍微复杂一些,需要更多工作才能实现。它使用一些复杂的蒙版处理来生成一个更小的画布。

  magick thumbnail.gif \
          \( +clone +level-colors white \
             \( +clone -rotate 90 +level-colors black \) \
             -composite -bordercolor white -border 1 -trim +repage \) \
          +swap -compose Src -gravity center -composite \
          square_cropped.gif
[IM Output]
另一种方法是使用一个无操作的扭曲,使用扭曲视口裁剪/填充图像(参见扭曲视口居中正方形裁剪)。本质上,它使用“百分比转义”来执行范围类型操作所需的计算。外部(填充)正方形...

  magick thumbnail.gif  -virtual-pixel white -set option:distort:viewport \
     "%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_external.gif
[IM Output]
虚拟像素设置用于指定填充颜色。内部(裁剪)正方形...

  magick thumbnail.gif   -set option:distort:viewport \
     "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_internal.gif
[IM Output]
感谢Fred Weinhaus的技巧页面。这是一个更简单的版本,但会丢失图像可能具有的任何元数据(如注释字符串或配置文件)。

  magick thumbnail.gif -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' \
          xc:none +swap -gravity center -composite square_internal_2.gif
[IM Output]
IMv7 允许您将上述数学运算直接作为裁剪或范围参数的一部分进行,从而防止丢失图像元数据。

手动裁剪

我生成用于网页的缩略图图像的常规方法是混合使用自动和手动脚本。我的图像的最终设置是..
  • 我使用 PNG 或 TIFF 作为照片的原始、非常大的扫描件。或者从数码相机下载的原始 JPEG 图像。基本上是用于存档的未修改的原始源图像。我现在也喜欢在这个图像的文件名中包含字符串“_orig”。
  • 当点击或选择缩略图时,用于网页查看的较小的 JPEG 图像格式。此图像已调整大小以适合 800x800 像素的框,这对于大多数网页用户查看来说都是合适的大小。我通常在文件名中添加“_md”表示中等大小的图像。
  • 最后是 GIF 缩略图,调整大小为固定 90 像素高,宽度可变。这使得网页上的居中缩略图行看起来整洁美观,但会自动填充浏览器窗口的宽度,无论用户使用什么尺寸的浏览器。同样,我通常现在在图像文件名中包含“_tn”,以表示它是一个缩略图。
我首先使用原始扫描图像的“magick mogrify”生成网页可查看的 JPEG 图像(中等大小)。这将图像的下载时间和查看大小减少到对普通网页用户来说实用的程度(可能是通过调制解调器登录的用户)。从这些图像中,我再次使用“magick mogrify”生成初始的缩略图集。但是,我经常发现,在典型的照片中,当缩略图被查看时,缩略图的主题变得太小而无法形成有效的缩略图。为了解决这个问题,我检查了自动生成的缩略图,在大约一半的情况下手动创建了我自己的“放大主题”缩略图。我读取 JPEG 图像,并将其裁剪到图像的主要主题,有效地“放大”照片的主题,并去除图像的大部分背景内容。然后使用“magick -thumbnail”或更常见的我正在查看和裁剪图像的图形程序(通常是“XV”,见下文)对其进行平滑处理和缩略图处理。因此,我手动围绕主题进行裁剪,突出照片的要点(右侧),然后进行缩略图处理,而不是缩略图中照片中的人几乎不可见(左侧)。这使得用户能够更清楚地看到图像内容,从而更好地决定他们是否真的想要下载并查看图像的较大 JPEG 版本。
昆士兰风筝飞行者,Ron 和 Val Field
[IM Output]
自动
生成
缩略图
[IM Output]
手动裁剪
和调整大小
缩略图
(点击任一图像查看原始扫描照片)
这当然需要更多的人工操作,但每个图像只需要执行一次,并且仅对具有大量空间的图像执行,例如上面的示例。此外,我只对我要放到网页上的图像执行此操作。当然,由于“magick mogrify”会覆盖任何现有的、可能是手动生成的缩略图,因此在执行任何手动缩略图生成后,您不能再次使用它。“magick mogrify”命令很有用,但也非常危险,因为它会覆盖大量图像。在全局范围内对所有图像运行“magick mogrify”之前,请务必三思。

HTML 缩略图页面

一旦我在目录中整理好所有缩略图图像,我就会使用我编写的名为“thumblinks”的特殊 perl 脚本,它查找图像(JPEG 照片和 GIF 缩略图),并生成 HTML 链接,甚至生成完整的 HTML 照片页面。该脚本将读取并包含 GIF 缩略图的大小在 HTML 中,并在缩略图链接周围附加预先准备好的页眉和页脚文件。如果该脚本在页眉或页脚文件中本身找到现有的链接,它还会从其生成的列表中删除任何缩略图链接。这听起来可能很复杂,但它使我的 HTML 页面生成非常快速和灵活,并确保目录中的所有图像缩略图都已添加到该目录的索引页面中,同时仍然允许我对索引页眉中的特定图像进行注释。它还使页面独立于用户的窗口大小,自动调整以适应。有关我的“thumblinks”脚本输出的简单示例,请参见城堡艺术品墓。有关生成此类链接的快速示例和起点,请查看使用identify 命令的示例。

FavIcon 网页链接缩略图

网页浏览器在网站的顶级网页上经常查找的“favion.ico”图标,用于整个网站。该图像是特殊的多分辨率图像格式,可以通过以下方式创建。

  magick image.png -alpha off -resize 256x256 \
          -define icon:auto-resize="256,128,96,64,48,32,16" \
          favicon.ico
image.png”可以是您喜欢的任何内容,但应为正方形。如果不是,这也应该是上述的第一步。您还可以包含更大的分辨率,例如 128 或 256 像素,但很少有浏览器会使用它们。16 和 32 像素大小在这些 ICO 文件中使用得更为普遍,因此可能对这些像素大小进行特殊强调。还要记住,许多浏览器会减少图像的颜色,以便减少存储在用户书签文件中的空间。这带给我们另一个要点。由于通常只使用最小的图像,并且还会进一步减少颜色,因此建议使图像尽可能小且定义清晰。这是一个手动调整 ICO 文件格式图像大小的示例。

  magick image.png  -background white \
          \( -clone 0 -resize 16x16 -extent 16x16 \) \
          \( -clone 0 -resize 32x32 -extent 32x32 \) \
          \( -clone 0 -resize 48x48 -extent 48x48 \) \
          \( -clone 0 -resize 64x64 -extent 64x64 \) \
          -delete 0 -alpha off -colors 256 favicon.ico

如前所述,通常只使用在网站顶级目录中找到的“favion.ico”图像,但是您也可以通过将以下 HTML 标签添加到页面的页眉中来指定链接缩略图图像的位置...

  <LINK REL="icon" HREF="/path/to/favicon.ico" type="image/x-icon">
  <LINK REL="shortcut" HREF="/path/to/favicon.ico" type="image/x-icon">
/path/to/favicon.ico”可以是浏览器应从中获取网页缩略图图像的绝对或部分 URL/URI。“REL="shortcut"”特定于 Internet Explorer(IE9 之前),而不是 HTML 规范的正式组成部分。可以使用“REL="shortcut icon"”将两个 HTML 标签合并在一起,但是通过将标签分开,您可以为非 IE 浏览器(如 Firefox)使用非 ICO 图像文件格式(如 SVG)。请记住,如果不使用此 html 元素,则改为使用在网站顶级目录中找到的“favicon.ico”文件(如果存在)。ICO 图像格式为所有现代浏览器普遍理解。除 Internet Explorer 外,所有浏览器还可以使用 JPEG、PNG 和 GIF 图像文件格式作为链接缩略图。一些浏览器(如 Firefox)甚至可以使用动画 GIF 或 SVG 图像文件格式。但是,由于这些后一种格式通常无法以不同的分辨率和颜色数存储多个图像,因此最好坚持使用 ICO 文件格式作为“favion.ico”图像。

其他非 IM 技术

我用于手动图像处理的“XV”程序还在名为“.xvpics”的子目录中生成缩略图图像。此目录中图像的格式是程序自己的特殊缩略图格式(忽略该目录中的文件名后缀)。这些缩略图限制为 80x60 像素,因此有点“小”(除非您修改“xv”以使用更大的缩略图——请参阅下面的链接)。IM 理解“xv”缩略图格式(基于“NetPBM”图像格式),因此您可以使用 XV 快速生成所有缩略图,然后将 XV JPEG 图像的缩略图转换为 GIF 图像以进行进一步处理...
   xv -vsmap &               # generate thumbs with the "Update" button
   rm .xvpics/*.gif          # delete XV thumbs of existing "gif" thumbnails
   magick mogrify -format gif .xvpics/*.jpg
   mv .xvpics/*.gif .        # move the new "gif" thumbnails to original dir
如果您厌倦了 XV 缩略图的小尺寸,尤其是在较大的现代显示器上,您可以修改 XV 代码。请参阅我的XV 修改说明,它允许您让 XV 使用更大的缩略图尺寸。我自己使用 120x90 像素的缩略图。

进一步处理——添加绒毛

以上仅仅是您可以做的事情的开始,以使您的缩略图更有趣。除了基本的缩略图图像之外,您还可以添加边框、旋转,甚至可以随机选择样式,以使您的缩略图库更有趣。像这样的缩略图添加,我称之为“绒毛”,就像您洗完衣服后发现覆盖在衣服上的多余棉绒一样。也就是说,它为缩略图添加了不必要的额外内容,但可以使网页和索引图像更有趣。请注意,许多以下方法和处理非常复杂,可能需要更深入地了解 ImageMagick 的各种图像处理选项。

添加图像标签

在创建缩略图期间,您还可以添加标签,位于缩略图的上方、下方甚至顶部。但是,此类图像处理在使用标签注释图像中得到了更彻底的介绍。请记住,在这些示例中使用“-thumbnail”或“-strip”,而不是“-resize”。例如...

  magick thumbnail.gif \
          -background Lavender -fill navy -font Candice -pointsize 24 \
          label:Hatching   -gravity South -append \
          labeled.gif
[IM Output]
通过使用复合字体,您可以在图像本身上叠加一些非常花哨的标签。例如,在这里我使用了更密集的柔和轮廓字体技术来注释缩略图,使文本周围的区域变暗,以确保它始终保持可读性。

  magick -define jpeg:size=400x400  hatching_orig.jpg  -resize '120x200>' \
      \( +clone -sample 1x1\! -alpha transparent -sample 1000x200\! \
         -font SheerBeauty -pointsize 72 -gravity Center \
         -strokewidth 8 -stroke black  -fill black  -annotate 0,0 '%c' \
         -channel RGBA -blur 0x8 \
         -strokewidth 1 -stroke white  -fill white  -annotate 0,0 '%c' \
         -fuzz 1% -trim +repage -resize 115x \
      \) -gravity North -composite           -strip annotated.gif
[IM Output]
请注意,我没有使用预生成的“thumbnail.gif”图像,或使用缩略图调整大小运算符来去除图像的配置文件和注释。然后,我使用“+clone”、“+sample”和“-alpha”生成一个更大的透明工作画布,其中还包含原始图像的元数据副本。这让我可以使用图像的“注释”字符串以及注释“-annotate”运算符来提供要在图像上叠加的文本。只有在我完成文本叠加后,我才清理并“-strip”该信息。

凸起按钮

-raise”运算符基本上是为了突出矩形图像的边缘以形成凸起的按钮而创建的。它是一种简单、快速且有效的缩略图转换。

  magick thumbnail.gif  -raise 8   raised_button.gif
[IM Output]
相同的运算符具有“加号”形式,可用于创建下沉的高亮效果。


  magick thumbnail.gif  +raise 8   sunken_button.gif
[IM Output]

气泡按钮

通过一些技巧,“-raise”操作符可以用来制作平滑的“气泡状”凸起按钮。

  magick thumbnail.gif -fill gray50 -colorize 100% \
          -raise 8 -normalize -blur 0x8  bubble_overlay.png
  magick thumbnail.gif bubble_overlay.png \
          -compose hardlight -composite  bubble_button.png
[IM Output] ==> [IM Output] ==> [IM Output]
参见光照合成方法以获取有关此类技术的更多信息。有关更多类似效果,请参见下面的自框架(内部),以及要将其提升到更高水平,请参见下面的照明效果蒙版

添加边框

简单的“-border”操作符可以用来在图像周围生成一些复杂的框架。

  magick thumbnail.gif \
          -bordercolor black -border 3   -bordercolor white -border 2 \
          \( -background black -fill white -pointsize 24 \
             label:Hatching   -trim +repage \
             -bordercolor black -border 10 \
          \) -gravity South -append \
          -bordercolor black -border 10   -gravity South -chop 0x10 \
          border_framework.gif
[IM Output]

简单框架

类似地,“-frame”操作符可以轻松地在图像周围添加框架。

  magick thumbnail.gif   -mattecolor peru  -frame 9x9+3+3  framed.gif
[IM Output]
此操作符还具有更多选项,可以创建十几种不同样式的框架。您可以在框架,添加 3D 风格边框中查看这些可能性的示例。

蒙太奇框架

montage 命令提供了一种更简单的方法来完成上述所有操作,以及更多操作。它不仅可以生成缩略图(或整页缩略图),还可以标记缩略图以包含文件名、磁盘大小和尺寸或用户指定的字符串等信息。
这是一个使用“magick montage”生成带框架缩略图的简单示例。

  magick montage -define jpeg:size=240x200  -label '%c'  hatching_orig.jpg \
          -frame 6  -geometry '120x100>'  montage_simple.gif
标签来自 JPEG 图像文件注释,很久以前使用非 IM 命令“wrjpgcom”添加到图像中。有关更多详细信息,请参见非 IM JPEG 处理
[IM Output]
即使仅使用“magick montage”,您也可以在缩略图生成方面获得非常花哨的效果。

  magick montage -define jpeg:size=400x180  -label '%c' hatching_orig.jpg \
          -thumbnail '200x90>' -geometry '130x100>'  -mattecolor peru \
          -frame 6  -bordercolor skyblue  -font LokiCola  -pointsize 18 \
          montage_fancy.gif
[IM Output]
有关更多详细信息,请参见蒙太奇,图像数组。您可能对蒙太奇 HTML 缩略图图像地图示例特别感兴趣。这将创建一个缩略图的 HTML 索引页面,其中点击缩略图将在同一目录中显示原始图像。

柔和模糊的边缘

晕影操作符提供了一种简单的方法来在图像周围添加模糊边缘。

  magick thumbnail.gif -alpha set \
          -background none  -vignette 0x4  vignette.png
[IM Output]
当然,由于此缩略图使用半透明颜色,因此需要以 PNG 格式保存。 形态学距离方法提供了图像边缘的真正透明“羽化”。

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -morphology Distance Euclidean:1,10\! +channel feathered.png
[IM Output]
透明区域的最大距离由特殊的10\!距离缩放标志控制。这仅在 IM v6.6.1-6 中添加。这还具有适用于形状图像的额外优势,尽管需要更复杂的初始化才能在距离公式中正确保留和抗锯齿像素。有关更多详细信息,请参见使用距离羽化形状。这里的羽化是纯线性渐变,可以使用S 形非线性对比度操作符进一步调整,以多种不同的方式使其看起来更平滑、更锥形。您还可以使用模糊羽化图像,使用相同的方法在模糊仅 alpha 通道之前添加透明虚拟像素。这会为图像生成更柔和的羽化,并使图像的角明显圆润。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png
[IM Output]
额外的“-level”操作(仅调整透明度通道)确保边缘变得完全透明,而不是仅半透明。但是,由于模糊生成的类 S 形曲线,它在实际边缘处急剧下降到零。它在角落也有累加效果,导致角落变圆,而在具有尖锐凹面的形状图像中,它会导致完全透明的像素变成半透明。因此,对于形状,您可能需要针对原始图像屏蔽结果(使用Dst-In 合成)。但是,对于矩形缩略图,结果令人满意。您可以在分层缩略图中看到使用此类羽化的另一个示例。如果不对模糊羽化进行级别调整,而是可以阈值化50%”处的模糊 alpha 通道,以便为上述缩略图图像添加伪圆角。

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -blur 0x8  -threshold 50% +channel rounded_corner_blur.gif
[IM Output]
虽然非常简单,但结果并不是一种真正好的使图像角圆滑的方法。首先,角实际上不是圆形的,而是“双曲线”曲线。其次,结果不是平滑的抗锯齿曲线,而是显示了由阈值操作的混叠效应引起的“锯齿”。但是,此图像可以保存到 GIF 文件格式。有关详细信息,请参见GIF 布尔透明度。另请注意,“-blur”操作在使用较大参数生成较大圆角时可能会变得非常慢。因此,不建议在较大范围内使用这种圆角方法。对于更不寻常的模糊边缘效果,您可以在 alpha 通道上使用径向模糊

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x45 +channel  radial_blur_edge.png
[IM Output]
这对于完全正方形的图像效果更好。随着倾斜模糊量的增大,最终将生成类似圆形的晕影边缘。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x100 +channel  radial_blur_vignette.png
[IM Output]
可以看到的两个阶梯状伪影是由两个图像尺寸引起的。对于正方形图像,不会看到“阶梯”。在最后一个示例中添加一点额外的普通模糊也可以改善阶梯问题。

圆形和形状的角

虽然对软模糊边缘(见上文)进行阈值化会生成适合 GIF 布尔透明度的圆角,但它不会生成平滑的“抗锯齿”角。生成具有圆角或任何其他形状的图像的正确方法是实际上使用所需形状的蒙版剪切每个角。以下方法来自 Leif Åstrand <leif@sitelogic.fi>,它将完整的图像蒙版相乘以生成适当的结果。

  magick thumbnail.gif \
     \( +clone  -alpha extract \
        -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
        \( +clone -flip \) -compose Multiply -composite \
        \( +clone -flop \) -compose Multiply -composite \
     \) -alpha off -compose CopyOpacity -composite  rounded_corners.png
[IM Output]
基本上从原始图像中提取白色透明度蒙版,只有一个黑色圆角。然后将其翻转和翻转以生成一个所有四个角都圆角的蒙版。最后,将该蒙版应用于原始图像。对于更大的图像,您最好对每个单独的角应用更小的蒙版以减少所需的总处理量。即更多单独的处理步骤,但总体上减少了对实际像素的处理。例如,以下是相同的内容,但从每个角剪切一个简单的绘制的三角形形状。这将适用于更大的图像。

  magick thumbnail.gif -alpha set  -compose DstOut \
      \( -size 20x15 xc:none -draw "polygon 0,0  0,14 19,0" \
         -write mpr:triangle  +delete \) \
      \( mpr:triangle             \) -gravity northwest -composite \
      \( mpr:triangle -flip       \) -gravity southwest -composite \
      \( mpr:triangle -flop       \) -gravity northeast -composite \
      \( mpr:triangle -rotate 180 \) -gravity southeast -composite \
      corner_cutoff.png
[IM Output]
如果您不想要透明度,而是其他颜色,您仍然可以执行上述操作,然后移除透明度。这对于 JPEG 图像可能很重要。但是,在IM 论坛讨论中发现了一个更简单的解决方案(在复杂性和内存使用方面)。这覆盖了彩色的角(在本例中为“Red”),而不是使它们透明。

  magick thumbnail.gif \
    \( +clone -crop 16x16+0+0  -fill white -colorize 100% \
       -draw 'fill black circle 15,15 15,0' \
       -background Red  -alpha shape \
       \( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \
     \) -flatten  rounded_corners_red.png
[IM Output]
不幸的是,由于与扁平化操作的“背景画布”的交互,此方法不能用于简单地“擦除”图像角以获得透明度,未来的分层操作符可能会解决此问题。
对于 IM v6.6.6-5 之前的版本,最后一个示例将失败,因为“-flip”和“-flop”操作符无法正确处理虚拟画布偏移。
使用极坐标循环技巧,我们可以为任何尺寸的缩略图生成完美的抗锯齿圆形蒙版。当然,我们只会将失真图像用作原始图像的蒙版,以便获得最佳结果。

  magick thumbnail.gif -alpha set \
    \( +clone -distort DePolar 0 \
       -virtual-pixel HorizontalTile -background None -distort Polar 0 \) \
    -compose Dst_In -composite -trim +repage circle_masked.png
[IM Output]
我们将在下面的带圆角的边框中进一步采用这种图像处理风格。在那里,我们不仅剪切角,还覆盖适当的框架图像。

撕裂的纸张边缘

Leif Åstrand <leif@sitelogic.fi> 贡献了以下 IM 代码,以生成看起来像是从纤维纸(如报纸)上撕下来的边缘…

  magick thumbnail.gif \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite torn_paper.png
[IM Output]
一种改进可能是使其看起来像是从报纸角上撕下来的。

  magick thumbnail.gif -bordercolor linen -border 8x8 \
          -background Linen  -gravity SouthEast -splice 10x10+0+0 \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite \
          -gravity SouthEast -chop 10x10   torn_paper_corner.png
[IM Output]
可以通过添加“纸张”颜色的边框和弯曲形状的蒙版来改进它,使其看起来像是用手粗略地撕裂的图像。添加“软阴影”(见下文)也会使生成的图像从背景中“抬起”,使其看起来像是一个单独的部分。与往常一样,欢迎提出建议和贡献。

添加阴影

-shadow”操作符使任何形状图像的阴影生成变得容易。例如,这里我在缩略图上添加了一个半透明的有色阴影。

  magick thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x0+4+4 \) +swap \
          -background none -mosaic   shadow_hard.gif
[IM Output]
但是您也可以轻松创建柔软模糊的阴影。

  magick -page +4+4 thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x4+4+4 \) +swap \
          -background none -mosaic     shadow_soft.png
[IM Output]
请注意,我再次对缩略图输出使用了 PNG 格式图像。这是因为阴影图像将包含大量半透明像素,GIF 无法处理。(是的,我一直在重复,但这很重要)。如果您确实打算使用 GIF 或 JPG 格式,则需要为计划在其中显示缩略图的网页或更大的画布使用更合适的“-background”颜色,因为这些格式不处理半透明颜色。警告,虽然上述方法适用于单个缩略图,但当您想要将多个缩略图分层叠加在彼此之上时,通常会失败。原因是阴影不会像普通图像那样累积在一起。要了解如何处理来自多个分层图像的阴影,请参见阴影层

添加一些厚度

为图像或形状添加厚度看起来有点像添加硬阴影(见上文),但并不完全相同,需要一些额外的工作才能正确完成。这实际上非常棘手,因为我们创建了图像的有色蒙版,然后将其复制多次并分层在原始图像下方(使用“DstOver”合成),并增加偏移量以赋予图像厚度。

  magick thumbnail.gif -alpha set \
          \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
          \( +clone -repage +1+2 \) \
          \( +clone -repage +1+3 \) \
          \( +clone -repage +2+4 \) \
          \( +clone -repage +2+5 \) \
          \( +clone -repage +3+6 \) \
          -background none -compose DstOver -mosaic  thickness.gif
[IM Output]
您明白了。每行“\( +clone ... \)”都会在图像中向南偏东南方向添加一个额外的像素。此外,由于不涉及半透明像素(至少对于矩形图像而言),因此您可以对结果使用 GIF 图像格式。此技术的最大问题是难以将厚度指定为可变参数或在不同角度指定,除非您编写特定的脚本来添加厚度。此外,厚度倾斜部分的边缘没有抗锯齿,因此有很大的改进空间。

类似宝丽来的缩略图

您可以使缩略图图像看起来像一张宝丽来照片,为其添加阴影,甚至稍微旋转一下,使其看起来像是放在桌子上。

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate 6 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  none   -flatten \
          poloroid.png
[IM Output]
IM v6.3.1-6 中添加了上述更复杂的版本,作为“-polaroid”变换操作符。例如…

  magick thumbnail.gif -bordercolor snow -background black +polaroid \
          poloroid_operator.png
[IM Output]
请注意,图像不仅具有宝丽来框架,而且照片还添加了一些“卷曲”和适当的阴影调整,使生成的图像具有更多深度。加号 (+) 形式使用随机角度,而普通减号 (-) 形式允许您提供旋转角度。特别感谢 Timothy Hunter 提供此技术的构思。
您甚至可以添加“-caption”,设置您自己的阴影颜色,指定您自己的旋转(或根本不旋转)。


  magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
          -font Ravie -gravity center -bordercolor Lavender \
          -background navy  -polaroid -0     poloroid_caption.png
[IM Output]
有关使用此运算符的更多信息,请参见复杂宝丽来变换。不过,在这些示例中,我将继续使用 DIY 创建方法,因为我需要对边框和阴影效果进行更精细的控制,以演示正确的照片“堆叠”。就是这样……通过制作照片的多个副本(或使用其他图像)并添加宝丽来边框,然后可以随机旋转并堆叠它们以生成一个好看的堆叠照片。

  magick thumbnail.gif \
     -bordercolor white  -border 6 \
     -bordercolor grey60 -border 1 \
     -bordercolor none  -background  none \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     -delete 0  -border 100x80  -gravity center \
     -crop 200x160+0+0  +repage  -flatten  -trim +repage \
     -background black \( +clone -shadow 60x4+4+4 \) +swap \
     -background none  -flatten \
     poloroid_stack.png
[IM Output]
上面示例中的“ `magick ...` ”嵌入命令生成一个从 -15 到 +15 的随机浮点数。有关将 IM 作为数学计算器使用的更多信息,请参见FX 表达式。另一种方法是将随机数分配给 shell 变量,然后将它们替换到上述命令中。
当然,您可以在创建堆栈时替换一组不同的图像,而不是重复相同的图像。或者选择一组旋转角度,以便它们都相当不同,或者更美观。如果您非常擅长,您甚至可以偏移旋转的图像(稍微抖动它们的位置),以便它们不会都完美地居中堆叠。但您明白了基本思路。如果您真的想避免使用 PNG 格式(因为它目前与某些浏览器存在问题),则可以使用 GIF 图像格式。要做到这一点,您必须愿意接受一些颜色限制,并了解图像将在其上显示的确切背景颜色。在本页面的情况下为“LightSteelBlue”颜色。

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate -9 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  LightSteelBlue  -flatten    poloroid.gif
[IM Output]
有关此技术(以及更多)的详细信息,请参见纯色背景上的 GIF 图像。上述“堆叠宝丽来”技术由Ally's Trip的 Ally 和Muziekvereniging Sempre Crescendo的 Stefan Nagtegaal 慷慨提供,他们都在其网站上大量使用宝丽来风格的缩略图。在IM 用户论坛中,用户grazzman更进一步,通过将图像叠加到旋转画布上以创建照片拼版。

  magick -size 150x150 xc:none -background none \
          -fill white -stroke grey60 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate +10 \
          -trim +repage -background LightSteelBlue -flatten \
          poloroid_spread.gif
[IM Output]
当然,对于这样的照片拼版,您确实需要使用一组不同的照片,而不是像我在这里那样重复使用相同的图像。使用此技术时,您可能需要考虑一些注意事项。
  • 框架已硬编码到上述内容中,并且取决于缩略图图像的大小。在实际应用中,框架可以移动到缩略图生成阶段,而不是在上述照片拼版中。
  • 由于“-rotate”还会扩展画布的大小,因此除非使用“-gravity center”位置的偏移量放置图像,否则添加图像的位置会发生变化。
  • 最后,不断旋转背景框架在质量方面不是一个好主意。旋转已经旋转的图像会比在叠加之前对每个单独的图像进行一次旋转,给结果带来更多像素级别的失真。
Stas Bekman 的摄影作品开发了一种类似的随机照片堆叠方法,但使用了不同的边框技术。在图像分层示例以及重叠照片中,展示并描述了一种更通用的方法来创建某种有序或编程的照片和图像布局。

框架技术

在这里,我们将了解一些高级框架技术,这些技术利用了对 IM 工作原理的一些非常高级的知识来实现所需的结果。

自框架(外部)

自框架是一种可用于为图像设置框架的技术,使用图像本身生成框架颜色和图案。也就是说,添加的框架不是固定的,而是变化以大致匹配要加框的图像。您可以通过两种方式执行此操作。扩展原始图像以创建外部框架,或使用实际图像本身的一部分创建内部框架。例如,如果我们在叠加原始图像之前放大图像并将其调暗,我们将获得一个非常漂亮的框架。

  magick thumbnail.gif \
          \( -clone 0 -resize 130% +level 20%x100% \) \
          \( -clone 0 -bordercolor black -border 1x1 \) \
          -delete 0 -gravity center -composite  self_bordered.gif
[IM Output]
除了使用色阶调整来使框架图像变亮(或变暗)之外,使边框颜色更浅或更深的另一种方法是使用色彩着色框架,例如……
"-fill white -colorize 30%"
另一种对图像进行色彩着色以生成框架的方法是,您可以简单地让 IM 在放大的图像顶部叠加一个半透明的框架。但是,这要求您知道缩略图的大小,以便准确地将其调整到恰好合适的尺寸以容纳生成的框架。

  magick thumbnail.gif \
          \( -clone 0 -resize 140x110\! \) \
          \( -clone 0 -bordercolor black -border 1x1 \
                      -mattecolor '#8884' -frame 9x9+0+9 \) \
          -delete 0 -composite  self_framed.gif
[IM Output]
上述变体使用特殊的视口控件和默认的虚拟像素,边缘设置来扩展模糊图像的边缘以生成外部框架。

  magick thumbnail.gif \( +clone \
             -set option:distort:viewport 150x120-15-15 \
             -virtual-pixel Edge    -distort SRT 0  +repage \
             -blur 0x3 +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_edge.gif
[IM Output]
仅供警告。一个小边缘缺陷(例如树木或树叶)可能会在仅使用图像边缘生成的框架中产生一些不良结果。视口确实需要知道原始图像的大小才能放大并相应地偏移该视口。但是,您可以使用FX 转义表达式来计算视口大小(请参阅下面的示例)。另一种方法是在上面的示例中使用模糊的虚拟像素,抖动。这将使颜色进一步扩散,并且不会那么“边缘化”。但是,如果您在使用抖动进行扩展之前和之后添加模糊,则可以产生布状效果。

  magick thumbnail.gif \( +clone  -blur 0x3 \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Dither  -distort SRT 0  +repage \
             -blur 0x0.8  +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_dither.gif
[IM Output]
第一个模糊调制平均颜色,而第二个调整抖动图案的“像素化”或平滑程度。这是另一个示例,这次使用虚拟像素,镜像,以及软边缘(黑色化),事实证明它对该特定图像非常有效。

  magick thumbnail.gif  \( +clone \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Mirror -distort SRT 0 +repage \
             -alpha set -virtual-pixel transparent \
                 -channel A -blur 0x8 +channel \
             -background Black -flatten \) \
          +swap -gravity center -compose over -composite \
          self_mirror.gif
[IM Output]
在所有上述情况下,框架都是从同一图像生成的,然后将其组合在一起以生成基于来自原始图像的颜色而生成的框架。因此,框架边框是唯一的,并且与要加框的每个缩略图图像匹配。Fred Weinhaus 创建了一个脚本“imageborder”使自框架图像更容易,边框由原始图像的模糊放大或某种形式的虚拟像素设置定义的内容生成。

自框架(内部)

我们无需放大图像来添加新边框,而是可以将图像本身的部分变成边框。我们已经看到了一些在图像本身内部添加框架的技术。“凸起按钮”和“气泡按钮”技术使用“-raise”运算符来实现这一点。在这里,我们生成原始图像的更亮更模糊的版本,然后使用也从原始图像生成的蒙版进行叠加。然后添加一个白色边缘以将该更亮更模糊的版本与图像的中心未修改部分隔开。

  magick thumbnail.gif \( +clone -blur 0x3 +level 20%,100% \) \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 10x10 \) \
          -composite \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 1x1 \
             -bordercolor black -border 9x9 \) \
          -compose screen -composite \
          self_blurred_border.gif
[IM Output]
您还可以使用框架运算符来实现与之前看到的按钮效果略有不同的效果。诀窍是首先修剪原始图像然后再应用。例如,在这里我制作原始图像的副本,使用透明框架对其进行修剪和加框,然后将其叠加在原始图像上。

  magick thumbnail.gif \( +clone -shave 10x10 \
            -alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
          \) -composite  inside_frame_trans.gif
[IM Output]
这样做的问题在于,您将始终“变亮”或“变暗”(降低对比度)原始图像周围框架的平面部分。为了避免这种情况,我们可以使用与“气泡按钮”技术相同的方法。我们在完美的灰色画布上生成一个框架,并对其进行修改以生成灯光效果合成蒙版,以调整原始图像的颜色。例如,在这里我使用“VividLight”合成与框架蒙版图像,以更好地保留主要颜色。

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 \
          \) -compose VividLight -composite  inside_frame_light.gif
[IM Output]
与“气泡按钮”一样,您也可以在应用之前模糊灯光蒙版。在这里,我使用了更普通的“HardLight”合成,它不会增强主要颜色,以及一个模糊的框架灯光蒙版。

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 -blur 0x2 \
          \) -compose HardLight -composite  inside_frame_blur.gif
[IM Output]
某些灯光合成方法可能要求您在合成它们之前交换图像才能获得正确的灯光效果。
要进一步利用这种效果,产生更复杂的结果,请参阅高级灯光效果蒙版

简单边框叠加

一种简单的框架类型是创建一个花哨的框架或形状图像,您可以在其中放置图像,位于框架下方。例如,这里我们生成一个比我们的图像略大的简单框架,并带有一个花哨形状的孔。该形状是从“WebDings”字体(字符“Y”)中提取的,但还有许多可能的来源可以用于图片框架的花哨形状。

  magick -size 120x140 -gravity center -font WebDings label:Y \
          -negate -channel A -combine +channel -fill LightCoral -colorize 100% \
          -background none -fill none -stroke firebrick -strokewidth 3 label:Y \
          -flatten +gravity -chop 0x10+0+0 -shave 0x10 +repage border_heart.png
[IM Output]
有关在现有形状图像上生成边缘的其他方法,请参见边缘变换
您还可以选择使用阴影效果为框架添加一些深度。

  magick border_heart.png  \( +clone -background black -shadow 60x3+3+3 \) \
          -background none -compose DstOver -flatten   border_overlay.png
[IM Output]
现在我们有了简单的叠加框架,我们可以使用“DstOver”合成将图像底层放置在框架下方,位于中心位置。

  magick border_overlay.png  thumbnail.gif \
          -gravity center -compose DstOver -composite   border_overlaid.jpg
[IM Output]
现在您可以生成一个预先准备好的框架库以用于您的图像,例如此秋叶图像

    magick thumbnail.gif  autumn_leaves.png +swap \
            -gravity center -compose DstOver -composite \
            border_leaves.gif
[IM Text]  + [IM Text] ==> [IM Text]
请注意,我交换了图像的顺序并使用了“DstOver”将第二个主图像“放在”框架下方。这样,框架决定了图像的最终大小,而不是原始图像。但是,这样做也会丢失主图像具有的任何元数据(出于相同的原因)。如果您确实想要保留缩略图的元数据(例如标签和注释,如版权信息),那么最好的方法是填充缩略图以使其与框架大小相同,然后使用默认的“Over”合成来叠加框架。这样,缩略图就是“目标”图像,并且其图像元数据将被保留。

徽章叠加示例

这是一个更复杂的预先准备好的叠加示例,这次使用正确大小的图像(使用 extent 作为裁剪方法),来自 IM 论坛讨论合成叠加和蒙版

    magick thumbnail.gif  -gravity center -extent 90x90 \
            badge_overlay.png -composite     badge.png
[IM Text]  + [IM Text] ==> [IM Text]
请注意,图像本身没有失真,只是稍微变亮和变暗,切出一个圆圈并添加阴影,所有这些都在一个叠加图像中。如果这是一个真正的徽章或“玻璃气泡”,那么图像也应该稍微失真一点(可能使用桶形失真),但它在不需要这种失真的情况下也能很好地工作。有关“徽章”示例的下一步,请参见使用蒙版和绘制的徽章,它在徽章外部添加了背景透明度。

蒙版和绘制技术

在许多情况下,您不仅希望在图像周围叠加方形边框,还希望将图像边缘剪切到透明度。为此,您通常需要至少使用两张图像。一个是包含您要添加到现有图像的颜色、阴影和高光的蒙版叠加。另一个图像包含您想要从原始图像中删除的部分。这两张图像可以通过两种不同的方式应用。您可以先“蒙版”以删除图像中不需要的部分,然后叠加框架,或者您可以叠加框架,然后将原始图像和叠加颜色的不需要的部分蒙版到透明度。您使用哪种方法至关重要,并且所涉及的图像将针对特定技术而设计。您不能以错误的顺序使用一种方法的图像,否则事情将无法正常工作。例如,让我们创建形状更复杂的边框,但这次不用担心设置背景。


  magick -size 120x100 xc:none -fill none -stroke black -strokewidth 3 \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          -strokewidth 3  -draw 'ellipse 60,50 57,47 0,360' \
          -channel RGBA  -blur 2x1    border_ellipse.png
[IM Output]
我特意使这个边框模糊,以便使边缘组件更加半透明。即使没有这种额外的模糊效果,边框也包含许多半透明的抗锯齿像素,使边缘看起来更平滑,减少锯齿感。在图像处理中,考虑这些半透明像素至关重要,以便正确地保留和设置它们。
为了使它更有趣,给这个“模糊”边框添加一些随机的颜色。

  magick border_ellipse.png \
          \( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
          -compose SrcIn -composite     border_ellipse_red.png
[IM Output]
好的,我们有了边框,但我们仍然需要一种方法来定义什么应该代表边框的外部和内部。基本上我们需要一个蒙版来定义这两个区域。

  magick -size 120x100  xc:none -fill black \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          border_ellipse_mask.png
[IM Output]
这个“蒙版”图像的颜色并不重要,只有它的形状重要,因为它基本上定义了哪些部分将被归类为内部,哪些部分将被归类为外部。蒙版可以是灰度蒙版,也可以是如上所示的形状蒙版。虽然后者通常更有用,甚至可以是需要擦除的部分或需要保留的部分的形状(如上所示)。在这种情况下,图像被设计为“蒙版并绘制”技术,这意味着您应该首先擦除不需要的部分,然后覆盖额外的边框颜色(这也涉及透明度蒙版)。例如…

  magick thumbnail.gif -alpha set  -gravity center -extent 120x100 \
          border_ellipse_mask.png  -compose DstIn -composite \
          border_ellipse_red.png   -compose Over  -composite \
          border_mask_paint.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
总是需要两个Duff-Porter Alpha合成操作。一个用于使部分透明,另一个用于覆盖额外的颜色以勾勒边框或框架。需要两个图像,因此应保持分离。某些格式(如MIFF和GIF)允许您将这两个图像保存到同一个文件中,以便于存储。当然,您可以组合这两个图像以创建一个简单的覆盖框架图像,但前提是您希望对结果的外部部分使用固定非透明颜色。例如,预定义外部为DodgerBlue颜色…

  magick border_ellipse_mask.png -alpha extract -negate \
          -background DodgerBlue -alpha shape \
          border_ellipse_red.png   -compose Over -composite \
          border_ellipse_overlay.png
[IM Output]
但在这种情况下,您只需在下层放置一个纯色或其他背景图像在先前生成的双蒙版图像下方…

  magick border_double_masked.png \
          \( -size 120x100 plasma:Green-Green -blur 0x1 \) \
          +swap  -compose Over  -composite     border_background.png
[IM Output]
关键在于,使用两个图像,“蒙版”和“覆盖”图像,您可以更自由地将边框添加到图像中。您甚至可以定义多个“蒙版”图像,以定义“覆盖”边框图像的不同“窗口”。您还可以添加可选的高光和阴影,而不是将它们硬编码到单个覆盖框架图像中。现在需要注意一个重要的事项。蒙版图像的边缘**不能**与覆盖图像的边缘重合。如果它们重合,您将无法获得沿重合边缘的正确颜色处理,或者会产生其他奇怪的“光晕”效果。因此,您需要确保蒙版边缘落在覆盖图像的完全不透明区域内。需要对这两个蒙版操作进行谨慎和预先考虑。

圆角边框

如您所见,蒙版并绘制技术可用于向图像添加额外的颜色或“绒毛”,也可用于移除部分,以塑造最终图像。这为我们提供了一种向图像添加圆角的替代方法。IM“-draw”运算符带有一个“roundrectangle”方法,可用于在图像周围提供一个有趣的框架。但是,您需要调整此绘制方法的尺寸以匹配图像。IM确实提供了提取方法,甚至可以根据图像大小进行数学计算。定位矩形的位置坐标是用于定义矩形所用笔划宽度的精确“中心”(它可以是浮点数)。此外,它以“像素坐标”给出(参见像素与图像坐标),这意味着值1,1指的是从顶部和左侧边缘开始的第二个像素,但更重要的是,它指的是像素的“中心”,实际上是距离真实顶部和左侧边缘1.5个单位。现在我们将使用笔划宽度(SW)为3,这使得图像在所有方向上都增大3个像素。然后这意味着矩形将定位在距离顶部左侧SW/2 - 0.5或1.0像素,以及距离底部右侧ImageSize + SW*1.5 - 0.5或图像大小+4像素的位置。在这里,我们使用IM本身进行这些计算,使用花哨的FX转义生成所需的精确绘制命令。这将保存为Magick矢量图形文件,可在以后的命令中直接由绘制使用。

  magick thumbnail.gif \
          -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
          info: > rounded_corner.mvg
[IM Text]
如果您能以其他方式(使用shell或其他API语言包装器)计算出图像大小,则可以将适当的绘制参数直接替换到后续示例中,而不是使用FX数学表达式。基本上,上述方法使整个过程独立于缩略图的实际大小。任何其他方法,包括直接硬编码,也是可以接受的。
现在我们可以用它来生成覆盖和蒙版图像。作为此过程的一部分,我们使用原始图像(首先按笔划宽度放大)创建一个透明画布,以使尺寸正确。

  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill white -stroke none -strokewidth 0 \
          -draw "@rounded_corner.mvg"    rounded_corner_mask.png
  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill none -stroke black -strokewidth 3 \
          -draw "@rounded_corner.mvg"    rounded_corner_overlay.png
[IM Text] [IM Text]
在那里,我们有了覆盖边框图像和透明度蒙版图像,这是我们双重蒙版技术所需的。请注意,蒙版适用于比原始图像笔划宽度更大的图像,并且擦除形状蒙版(白色)没有覆盖整个放大的区域,因为周围有1像素的间隙。因此,让我们使用双重蒙版技术应用它…

  magick thumbnail.gif -alpha set -bordercolor none -border 3  \
          rounded_corner_mask.png -compose DstIn -composite \
          rounded_corner_overlay.png -compose Over -composite \
          rounded_border.png
[IM Output]
在那里,我们用圆角为图像添加了边框。以下是您如何在单个命令中执行上述所有操作,并添加一些额外的花哨效果的方法。但是,这个多合一命令仍然会生成一个临时文件,其中包含为给定大小的图像生成的绘制命令。

  magick thumbnail.gif \
      -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15' \
      -write info:tmp.mvg \
      -alpha set -bordercolor none -border 3 \
      \( +clone -alpha transparent -background none \
         -fill white -stroke none -strokewidth 0 -draw @tmp.mvg \) \
      -compose DstIn -composite \
      \( +clone -alpha transparent -background none \
         -fill none -stroke black -strokewidth 3 -draw @tmp.mvg \
         -fill none -stroke white -strokewidth 1 -draw @tmp.mvg \) \
      -compose Over -composite               rounded_border_in_one.png
  rm -f tmp.mvg      # Cleanup of temporary file
[IM Output]
对于圆角,特别是对于非常大的图像,更好的方法是使用单独的角蒙版图像技术,我们将在下面的花哨的角覆盖中介绍。在许多方面,这是上述方法的扩展,但对图像的每个角使用单独的蒙版,以便保持工作图像的大小。

使用蒙版和绘制的徽章

这是一个更复杂的“蒙版并绘制”示例,它是根据前面徽章覆盖示例中使用的图像开发的。这两个图像的生成是“伪造”的,并在IM论坛合成覆盖和蒙版中进行了讨论。理想情况下,这两个图像应该一起开发。

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_trans_bg.png
[IM Text]  + [IM Text]  + [IM Text] ==> [IM Text]
请注意,上面我提到过,您应该避免尝试对齐透明度边缘和蒙版边缘。在上面的示例中,我正是这样做的,并且结果图像的边缘不会完全正确。但是,由于颜色实际上只是细微的阴影而不是强边缘,因此在本例中似乎效果不错。但是应谨慎行事。有关“徽章”示例的下一步,请参见使用绘制和蒙版创建徽章,它反转了这两个合成操作的顺序,需要一组不同的图像。

绘制和蒙版技术

您可以使用一组不同的图像,首先覆盖额外的颜色,然后再蒙版出背景,而不是“先蒙版后绘制”。也就是说,您可以执行“先绘制后蒙版”。也就是说,您将获取您的图像,并覆盖边框,这不仅设置了所有最终的边框颜色,还蒙版并着色了原始图像外部的一些或所有部分。然后,您使用单独的“外部”或“剪切”蒙版来移除结果图像中所有不需要的部分。另请注意,“覆盖”和“蒙版”图像都分别定义了边框的内边缘和外边缘。因此,一个图像无法在单个图像中完全定义整个边框,这可能使其使用起来有点困难。但是它可能更易于实现。例如…

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 0 \
          -draw 'ellipse 45,45 55,37 0,360' \
          -channel RGBA -negate -blur 0x3  +channel \
          \( granite: -auto-level -blur 0,0.7 \) \
          -compose ATop -composite border_paint.png

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 5 \
          -draw 'ellipse 59,45 56,40 0,360' border_mask.png

  magick thumbnail.gif -alpha set \
          border_paint.png -compose Over  -composite \
          border_mask.png  -compose DstIn -composite \
          border_paint_mask.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
请注意如何移除覆盖颜色的某些部分。这是先绘制后蒙版技术的关键特性,允许您使用更简单的覆盖,然后通过蒙版进行调整。这种图像蒙版方法在下一个页面卷曲角示例集中使用,并在下面的花哨的角边框中再次使用。

页面卷曲角

Fred Weinhaus创建了一个名为PageCurl的特殊shell脚本,它将使用一些非常复杂的数学方法(在shell中)向现有图像添加简单的页面卷曲。例如…

  pagecurl thumbnail.gif  pagecurl.png
[IM Output]
在内部,它实际上使用的是先绘制后蒙版技术。也就是说,首先覆盖一个稍微过大的“卷曲覆盖”,然后擦除(蒙版)图像的其余部分,包括少量覆盖,这将成为透明角。但是,如果您想将页面卷曲应用于大量图像,使用完整脚本(如上所示)是一种相当缓慢的技术。毕竟它确实进行了大量的数学处理(使用IM本身作为浮点数计算器),以实际计算并生成适当的覆盖和蒙版图像。要将页面卷曲应用于大量图像,最好只使用一次脚本,以便仅生成覆盖和透明度蒙版图像一次。因此,让我们提取这两个图像以用于较小的64x64像素图像(为此目的,脚本中添加了特殊的“-i "pagecurl"”选项)。

  magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:
[IM Output] [IM Output]
上述命令创建了两个图像文件:“pagecurl_overlay.png”和“pagecurl_mask.png”所示。输入图像本身无关紧要,因为我们想要的是蒙版图像。“页面卷曲”结果只是使用特殊的“null:”图像文件格式丢弃。

  magick thumbnail.gif -alpha set -gravity SouthEast \
          -define compose:outside-overlay=false \
          pagecurl_overlay.png -composite \
          pagecurl_mask.png  -compose DstIn -composite \
          pagecurl_thumbnail.png
[IM Output]
当然,这些图像的大小与我们的缩略图或您可能想要应用它的任何图像的大小都不相同,但这并不重要,因为我们可以使用几个额外的选项来确保它们按预期工作。具体来说,“-gravity”设置确保两个覆盖图像位于右下角。特殊的定义设置compose:outside-overlay=false”将防止蒙版图像擦除未被较小图像覆盖的图像部分。有关完整说明,请参见外部覆盖设置。如果您想将其应用于大量图像,可以使用“magick mogrify”,使用涉及使用“-draw”执行Mogrify Alpha合成的特殊技术。但是,这种合成方法不理解特殊的定义设置,因此它仅适用于大小相同的图像、覆盖和蒙版。


  pagecurl -e 0.5 -i /tmp/pagecurl  {one image} null:
  magick mogrify {magick mogrify -format and -path options} -alpha set \
          -draw 'image Over 0,0 0,0 "/tmp/pagecurl_overlay.png"' \
          -draw 'image DstIn 0,0 0,0 "/tmp/pagecurl_mask.png"' \
          {all images to be pagecurled}...

花哨的角叠加

这里我们将更深入地了解如何使用“双重蒙版”技术以不同的方式修改图像的不同区域,而不是对整个图像应用单个大型蒙版或框架。在本例中,我们将只对角部进行双重蒙版。其余的边框(匹配)将单独添加。[IM 输出] 我将使用的角部图像来自原始源(如右图所示),我在DIY 框架部分Anthony 的图标库中找到它。此部分还有其他一些,您可能想看看。如果您在网上找到了一些东西,请告诉我,因为我喜欢收集有趣的角部和边缘技术。[IM 输出] [IM 输出] 从初始图像生成了一个颜色叠加和蒙版图像,以便我们可以使用绘制和蒙版技术将角部叠加到图像上。请注意,这些图像实际上没有使用任何半透明像素,甚至没有使用任何颜色的阴影。因此,这个花哨的边框可用于为网页生成外观整洁的“GIF”缩略图。使用角部蒙版的问题在于,它们只掩盖了原始图像的角部。因此,原始图像首先需要获得适当的一组额外的边框颜色。之后,必须将两个角部蒙版合成到扩展图像的每个角部。

  magick thumbnail.gif   -alpha set  -compose Copy \
          -bordercolor Black  -border 2 \
          -bordercolor Sienna -border 3 \
          -bordercolor Black  -border 1 \
          -bordercolor None   -border 2 \
          -bordercolor Black  -border 2 \
          -bordercolor Peru   -border 3 \
          -bordercolor Black  -border 1 \
          \
          -compose Over \
          \( fancy_add.gif             \) -gravity NorthWest -composite \
          \( fancy_add.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_add.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_add.gif -flip -flop \) -gravity SouthEast -composite \
          -compose DstOut \
          \( fancy_sub.gif             \) -gravity NorthWest -composite \
          \( fancy_sub.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_sub.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_sub.gif -flip -flop \) -gravity SouthEast -composite \
          fancy_border.gif
[IM Output]
请注意,为了保留正在添加的透明边框,您必须将“-compose”设置设置为“Copy”,而不是默认的“Over”。如果不这样做,则透明度将被接下来添加的边框颜色填充,在本例中为“黑色”。有关详细信息,请参见边框运算符
仅使用角部蒙版的好处在于,只要图像足够大以容纳正在添加的角部蒙版,就可以使用此技术为任何大小的图像添加框架。也就是说,您不受可用框架图像大小的限制。当然,四个角部图像和边框在图像周围都是相同的,只是旋转了。也就是说,阴影或厚度效果都是“向内”的。要解决此问题,您需要为每个角部生成不同的角部部件,并且原始图像周围额外边缘的添加需要是不对称的。基本上它变得更加复杂,以便产生真实的阴影效果。更好的解决方案可能是从角部部件中移除阴影效果,如前所述应用它,然后全局添加阴影效果。需要注意。

使用绘制和蒙版的徽章

之前在徽章叠加徽章蒙版和绘制中看到的相同徽章图像处理也可以通过绘制然后蒙版来执行。在这里,我们首先将所有颜色和阴影绘制到图像上,然后屏蔽图像的最终透明度。

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_paint.png -composite badge_shape.png -compose DstIn -composite \
          badge_paint_mask.png
[IM Text]  + [IM Text]  + [IM Text] ==> [IM Text]
如果这对于此特定图像来说似乎很笨拙,那您是对的,确实如此。原因是我们不仅需要对原始图像进行阴影和高亮显示,还需要用黑色填充任何包含阴影效果的区域。具体来说,任何将变得完全透明的区域(以及真正完全透明的像素)都需要用黑色绘制。另一方面,具有阴影效果的半透明像素将具有部分阴影效果和部分透明度蒙版。换句话说,阴影使原本简单的绘制和蒙版技术在绘制和蒙版效果的划分上变得笨拙。这就是为什么在处理图像的半透明添加(例如添加阴影或耀斑)时,通常不使用绘制和蒙版技术的原因。如果图像不包含任何透明度效果,则绘制过程看起来不那么糟糕,并且在许多情况下可能比其他技术更简单,因为您可以在完成后使用蒙版“切掉”绘制的叠加。 页面卷曲示例就是这样一种情况,因为我们使用蒙版修剪页面卷曲叠加以形成无缝整体。还要注意绘制图像中硬黑色区域和阴影效果之间的间隙。此间隙反映了我之前提到的警告,即确保您不会使任何内部蒙版的结果与任何绘制/叠加外部蒙版的边缘重叠。只有在这种特定情况下,此必需的间隙才会变得如此明显。有关“徽章”示例的下一步,请参见使用灯光效果的徽章,它将两个蒙版图像合并为单个蒙版/阴影图像。

照明蒙版技术

玻璃泡泡按钮

缩略图处理的下一个复杂层次是应用非常复杂的灯光效果。这里的棘手之处不在于将灯光效果应用于图像,而在于生成适当的阴影效果。例如,使用水下效果,您可以为缩略图提供非常复杂的阴影效果,使其看起来像被“玻璃泡泡”包围。此外,这在具有圆角的缩略图上效果更好。让我们为我们的缩略图图像生成一个圆角蒙版,使用纯灰色。

  magick thumbnail.gif -alpha off -fill white -colorize 100% \
     -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
     \( +clone -flip \) -compose Multiply -composite \
     \( +clone -flop \) -compose Multiply -composite \
     -background Gray50 -alpha Shape    thumbnail_mask.png
[IM Output]
现在我们有一个想要使用的纯灰色“形状蒙版”,我可以应用水下效果效果来为此形状生成灯光叠加。

  magick thumbnail_mask.png -bordercolor None -border 1x1 \
          -alpha Extract -blur 0x10  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          +channel +compose -chop 1x1 \
          thumbnail_lighting.png
[IM Output]
有了像上面这样的最终灯光/阴影叠加图像,我们可以轻松地将其应用于任何大小合适的缩略图图像。

  magick thumbnail.gif -alpha Set thumbnail_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          glass_bubble.png
[IM Output]
这不仅为任何此大小的缩略图添加了适当的阴影效果,而且相同的灯光图像还将缩略图蒙版成正确的形状。重要的是要注意,只有颜色通道用于应用灯光效果,alpha 通道在此过程中未使用。类似地,当蒙版时,仅使用 alpha 通道,而不使用颜色通道。如果没有为不同的效果分离这些通道,您将无法获得正确的结果。有关从图像中提取灯光效果的讨论,请参见 IM 用户论坛主题从两张图像中提取灯光层
但是,这可以更进一步,因为我们还可以直接将阴影效果添加到此灯光蒙版中。但是添加的颜色必须是纯黑色,并且您需要确保选择的灯光效果合成将使图像在灯光蒙版为黑色时完全变黑。但是,这实际上是通常向图像添加阴影效果的方式,因此您可以直接将阴影添加到“灯光效果蒙版”中,一切都会好起来的!添加灯光“耀斑”也是如此,但仅对耀斑叠加使用白色像素。从本质上讲,“灯光效果图像”实际上可以将两个蒙版和绘制图像合并回单个图像。正如您将在下一个示例中看到的。

使用灯光效果的徽章

使用使用蒙版和绘制的徽章技术中的图像,我将它们应用于纯灰色画布图像,以便快速生成“蒙版灯光效果”图像,实际上,我也可以同样轻松地使用其他样式的蒙版(使用绘制和蒙版的徽章)。然后我将单个蒙版图像应用于缩略图,以再现所需的结果。

  # merge "mask 'n' paint" images with a gray image,
  # to create a "lighting mask"
  magick -size 90x90 xc:gray50 -alpha set \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_lighting.png

  # Apply the single "lighting mask"
  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          badge_final.png
[IM Text]  + [IM Text] ==> [IM Text]
实际上,我更喜欢这种形式的蒙版,因为蒙版图像本身看起来几乎与您想要的图像相同,只是缺少颜色。也就是说,毕竟灯光蒙版是如何创建的,只需将效果应用于完美的灰色图像,您就会得到一个“灯光蒙版”图像。请记住,使用此特定技术,半透明阴影必须为纯黑色才能正常工作。您不能对任何不包含至少一部分原始图像的像素使用灰色。所有透明和半透明区域的颜色必须为纯白色或纯黑色,并具有适当的 alpha 透明度。为什么只有一种图像有效?之前我们需要两张图像!答案是蒙版图像仅限于仅添加纯黑色或白色阴影。通过这样做,阴影(灯光)效果及其蒙版基本上合并到“灯光效果蒙版”的颜色分量中。因此,alpha 通道可以自由地保存最终图像的先前单独的透明度蒙版。但是,此方法的局限性在于您只能向图像添加白色和黑色阴影。例如,您不能向被蒙版的图像添加灰色。但是请注意,可以添加某些颜色空间的一些主要和次要颜色的色调,但仅限于有限的方式,而且我从未见过它被使用。总之,您不能向图像添加特定的颜色或花哨的边框,只能添加阴影和阴影、高光和耀斑,或简单的黑色或白色文本。但是,您不应尝试混合或重叠添加的白色和黑色效果,因为这两个效果之间的生成的灰色抗锯齿像素会从底层图像生成阴影颜色,而不是预期的灰色。也就是说,此技术的缺点!

具有失真的蒙版图像...

更令人难以置信的是,由于阴影颜色只是一个灰度图像,您可以将灯光效果压缩到一个颜色通道和 alpha 通道蒙版中。然后,这可以用来释放两个颜色图像通道以用于其他图像处理效果!也就是说,您可以将其他内容存储到单个“蒙版图像”中。具体来说,您可以将失真效果添加到同一个蒙版图像中!有关此内容的更多信息,请参见统一失真图像,它正是这样做的!一种终极蒙版图像。

使用边缘图像进行框架

[IM 图像] 向图像添加复杂边框的一种常见方法是使用预先准备好的框架图像,以生成如示例所示的框架(右侧)。但是,您也需要注意生成框架。如果您仔细查看给定的示例,您会注意到它并不完全正确。生成的框架的阴影实际上不正确。左右和底部框架边缘应交换,以生成典型左上角光源的正确阴影框架。因此,在我们开始之前,我想强调使用正确图像或为每个边缘正确修改的图像在为您的缩略图或照片设置框架时非常重要。这很容易出错,因此在您认为自己正确时请仔细检查您的结果。

框架边缘图像

有许多类型的图像可用于为图像设置框架。例如,这是一个“带金色装饰的细黑色”框架,它是根据 Michael Slate <slatem_AT_posters2prints.com>提供的图像修改而成的。
[IM Image] [IM Image]
有两个图像,提供两种不同的灯光效果,一个用于顶部和左侧边缘,另一个用于底部和右侧边缘。但是图像长度上的颜色没有变化。因此,您可以平铺或拉伸此框架以生成所需的长度。类似的一组框架部件是这些“细装饰金色”可平铺边框图像。

[IM Image] [IM Image]
由于这些图像包含一些精细的细节,您不能简单地拉伸图像到所需的长度。您也不能仅仅矩形旋转这些片段来生成其他边缘片段,因为这样做会导致精细细节的阴影错误。但是,对角线置换扭曲应该可以获得其他边缘的正确阴影。在查看结果时建议格外小心,确保图像所有四边的整体阴影和精细细节阴影都正确。最后,框架图像可能仅包含一个可以用于生成所有框架边缘的单个图像,例如这个“竹子”平铺框架图像。
[IM Image]
只需要一个图像的原因是,框架没有特定的“内侧”或“外侧”。虽然框架确实具有整体和精细细节的照明效果,这要求您再次注意如何旋转/翻转/置换图像以生成其他边缘。此框架更大的问题是,如果只是简单地平铺它,宏观细节会变得非常规则,因此您可能需要随机化平铺偏移,甚至随机化拼接在一起的片段的长度,以使其看起来更自然。稍后将详细介绍。如您所见,框架图像可以有多种样式,在生成其他缺失的边缘图像时,必须小心地以正确的方式(关于照明图像)处理所选的边缘图像。

加长框架片段

现在,在任何使用这些框架图像的情况下,都需要创建更长的片段来覆盖图像尺寸的长度。这只有两种基本方法。您可以使用调整大小(不保留纵横比)简单地拉伸框架图像,以获得正确的长度。这适用于上面显示的第一组片段,这些片段没有内部细节,但不适用于任何其他提供的框架图像。基本上,它会扭曲内部细节,并可能分散最终图像的外观。但是,平铺的其他加长方法可以用于任何具有重复图案或细节的框架图像,这与上面提供的所有图像都一致。如果您正在创建自己的框架片段,请务必确保平铺正确匹配,并且达到像素边界,以确保框架图像具有统一的颜色和细节的正确循环。如果不这样做,您可能会在平铺之间获得人造外观的接缝,由于平铺的重复而变得明显。在现实世界中,画框师在将片段拼接在一起以制作更长的片段时也存在同样的问题。基本上,很容易得到两种不同的木材色调或非常不同的木纹图案,当“燕尾榫”连接在一起时,会使接缝非常明显。所以,您并非孤军奋战。 “竹子”框架图像需要平铺。虽然由于细节仅限于图像上的小区域,因此您可以获得一些有趣的随机平铺效果,可能需要删除一些随机化的加长和缩短片段。我不会深入探讨这一点,而是将其留给有兴趣的人作为练习。对于我们的示例,并且因为它适用于几乎所有框架图像,我将使用一种简单的恒定平铺方法来生成所需的更长的边缘长度。

过于简单的附加

我们可以通过将其平铺到正确的长度,然后附加图像,来加长上面的简单“竹子”框架。平铺是通过特殊的平铺画布图像生成器“tile:”来完成的,用于平铺正在读取的图像。

  magick thumbnail.gif \
          \( -size 90x14  tile:bamboo.gif -transpose \) \
          \( -size 90x14  tile:bamboo.gif -transpose \) -swap 0,1 +append \
          \( -size 148x14 tile:bamboo.gif \) \
          \( -size 148x14 tile:bamboo.gif \) -swap 0,1 -append \
          frame_append.gif
[IM Output]
请注意,上面两个示例中使用的尺寸是根据框架图像的已知宽度(10像素)和要加框的图像的大小(120x100像素)计算得出的。您需要根据您的图像相应地调整调整大小参数。平铺框架片段(如竹子)的一个问题是,所有边缘看起来都像是彼此的精确副本!也就是说,框架看起来很人工。在现实生活中,框架将使用从较长的实木或在这种情况下为竹子切割的几乎随机的偏移量来切割。要解决此问题,您还需要为图像的每个边缘提供略微不同的平铺偏移

  magick thumbnail.gif \
          \( -size 90x14  -tile-offset +50+0 tile:bamboo.gif -transpose \) \
          \( -size 90x14  -tile-offset +0+0  tile:bamboo.gif -transpose \) \
          -swap 0,1 +append \
          \( -size 148x14 -tile-offset +70+0 tile:bamboo.gif \) \
          \( -size 148x14 -tile-offset +25+0 tile:bamboo.gif \) \
          -swap 0,1 -append       frame_tile_offset.gif
[IM Output]
这种框架方法对于这种特定类型的边缘图像来说还不错,但对于其他类型的框架来说,它看起来可能非常愚蠢。基本上,角点不正确,对于大多数框架,您确实希望边缘图像以 45 度角接缝相交,就像在真实的画框中一样。对此的一个解决方案是手动预生成合适的角点图像,我们现在可以将其覆盖到此图像上以使其正确。这对于简单的可拉伸框架图像(如“黑色细线”框架图像)效果很好,但对于像“竹子”这样的可平铺图像来说效果会很差,因为角点图像可能无法正确匹配平铺图像。更好的方法是从平铺的边缘图像直接生成角点接缝。我将在稍后向您展示执行此操作的方法。

扩展的叠加框架

此外,您可以通过将框架扩展到原始图像的边界之外来使这种类型的边缘框架看起来更好。这在“家园甜蜜家园”类型的图片中经常看到。要执行此操作,您需要先将原始图像放大,并留出大量额外的空间,以便将更长的框架片段覆盖到其中。

  magick thumbnail.gif -alpha set -bordercolor none -border 34 \
          \( -size 144x14 -tile-offset +30+0 tile:bamboo.gif -transpose \) \
          -geometry +20+10 -composite \
          \( -size 144x14 -tile-offset +45+0 tile:bamboo.gif -transpose \) \
          -geometry +154+0 -composite \
          \( -size 178x14 -tile-offset +60+0 tile:bamboo.gif \) \
          -geometry +0+20 -composite \
          \( -size 178x14 -tile-offset +0+0  tile:bamboo.gif \) \
          -geometry +10+124 -composite \
          frame_overlaid.gif
[IM Output]
请注意,这种类型的框架的测量和定位并不简单,可以使用一些随机化,例如我在上述示例中硬编码的。此外,您可以通过使用一些额外的和适当的阴影来圆化框架长度的末端来进一步改善外观。以这种方式对图像进行框架的更好的方法是将框架图像生成一个完整的单元,然后将其覆盖在固定大小的图像上(请参阅简单边框覆盖)。但是,这样做意味着您将无法再稍微随机化每个框架片段的长度和位置。

45 度角接头

更好的解决方案是以某种方式在缩略图周围添加框架图像,以便在框架的每个角点处实际创建一个 45 度接缝。这并不容易,我尝试了许多绘图和蒙版方法,直到我重新发现了一个名为框架,3D 风格边框的神奇运算符。
然后解决方案很简单。读取图像,并“-frame”它,以创建要框架的区域的模板。

  magick thumbnail.gif -alpha set -bordercolor none \
          -compose Dst_Out -frame 15x15+15  frame_template.gif
[IM Output]
现在请注意,此模板具有一些有趣的特性。首先,它在中间是透明的,主要图像将位于此处。其次,它只有四个不同的颜色定义了我们要放置框架图像的每个区域。它不会在角点生成颜色变化的“抗锯齿”像素。请注意,为了简化操作,这些区域的宽度(15像素)是我们将添加到图像中的框架片段的宽度。如果垂直边缘的厚度与水平边缘不同,则此技术的效果不会很好。实际上,在这种情况下,很少有方法会效果很好。此图像是框架模板,通过使用颜色填充基元将我们的每个框架片段平铺到四个不同颜色的区域中,我们将非常简单轻松地获得 45 度角点接缝。
例如…

  magick frame_template.gif \
          -tile blackthin_top.gif -draw 'color 1,0 floodfill' \
          frame_top_filled.gif
[IM Output]
您可以对其他三个边缘重复此过程。使用置换以确保内部细节的高光和阴影保持正确。

  magick frame_template.gif \
          -tile blackthin_top.gif   -draw 'color 1,0 floodfill' \
          -tile-offset +0+105 -tile blackthin_btm.gif \
                                       -draw 'color 15,105 floodfill' \
          -transpose \
          -tile blackthin_top.gif      -draw 'color 1,0 floodfill' \
          -tile-offset +0+135 -tile blackthin_btm.gif \
                                       -draw 'color 15,135 floodfill' \
          -transpose \
          -gravity center thumbnail.gif -composite frame_filled.gif
[IM Output]
来自 IM 论坛讨论45 度框架接缝,发现了一种更简单的解决方案,涉及预旋转底部边缘。以下是使用内存寄存器保存中间图像的完整示例。

  magick thumbnail.gif                -write mpr:image    +delete \
          goldthin_top.png             -write mpr:edge_top +delete \
          goldthin_btm.png -rotate 180 -write mpr:edge_btm +delete \
          \
          mpr:image -alpha set -bordercolor none \
          -compose Dst -frame 25x25+25  -compose over \
          \
          -tile mpr:edge_btm \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          -tile mpr:edge_top \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          \
          mpr:image -gravity center -composite    frame_gold.png
[IM Output]
如您所见,我们仍然存在问题,由于平铺产生的对角线镜像效果,左上角和右下角看起来非常人工。要解决此问题,我们需要添加随机化的“-tile-offset”,以消除这种镜像效果。
平铺偏移设置在 IM 6.3.9-9 之前的版本中存在问题,即“X”偏移量用于“X”和“Y”偏移量值(给定的“Y”值被忽略)。这意味着在较旧版本的 IM 中,上述示例可能会错误地平铺底部和右侧边缘。
脚本版本这需要使用最后一个示例作为模板重新编写当然,您可以在单个命令中执行上述所有操作。但是,让我们以脚本化的方式进行。此版本使用一些内联代码,使用简单扭曲和一些随机化的图像滚动从提供的基本图像生成合适的边缘图像,以改善平铺图像的整体外观。这些可以根据提供的边缘框架图像类型进行调整。然后,使用内存中平铺图像技术和框架模板(生成)对处理后的边缘图像进行平铺,就像我们在上面做的那样。

  image=thumbnail.gif
     image_w=`magick $image -format %w info:`
     image_h=`magick $image -format %h info:`

  top=goldthin_top.png
  btm=goldthin_btm.png

     width=`magick $top -format %h info:`
     length=`magick $top -format %w info:`

  # Size of the new image ( using BASH integer maths)
  new_size=$(($image_w+$width*2))x$(($image_h+$width*2))

  # IM options to read a 'randomly rolled' version for the edge pieces
  lft="( $top -roll +$(($RANDOM % $length))+0  -transpose )"
  rht="( $btm -roll +$(($RANDOM % $length))+0  -transpose )"

  # IM options to 'randomly rolled' the top and bottom pieces
  top="( $top -roll +$(($RANDOM % $length))+0 )"
  btm="( $btm -roll +$(($RANDOM % $length))+0 )"

  # Frame the image in a single IM command....
  magick -page +$width+$width  $image  +page -alpha set \
    \( +clone -compose Dst -bordercolor none -frame ${width}x$width+$width \
       -fill none -draw "matte 0,0 replace" \
          -flip   -draw "matte 0,0 replace"   -flip \) \
    \( $top $btm -append -background none -splice 0x${image_h}+0+$width \
       -write mpr:horz +delete -size $new_size tile:mpr:horz +size \
       -clone 1  -compose DstOut -composite \) \
    \( $lft $rht +append -background none -splice ${image_w}x0+$width+0 \
       -write mpr:vert +delete -size $new_size tile:mpr:vert +size \
       -clone 1  -compose DstIn -composite \) \
    -delete 1  -compose Over  -mosaic   framed_script.png
[IM Output]
这样,我们就得到了一个具有 45 度角点接缝和随机平铺偏移的完美框架图像。是的,这是一个复杂的示例。但这是为了允许使用内存中平铺图像,以便我们可以在一个命令中预处理框架图像。这使其更复杂,但也更通用。以上代码已构建到一个 shell 脚本中,您可以下载(来自IM 示例脚本目录的“frame_edges.tar.gz”)。此 tar 文件包含脚本和一组框架图像,脚本了解如何处理和使用这些图像。它还在框架和图像主体之间添加了“纸板”边框。

未来示例

使用具有匹配角点片段的平铺边缘。边缘图像需要与预先准备的角点片段匹配,而且还需要在图像的固定长度上整齐地平铺。这意味着整个平铺边缘可能需要一些拉伸或压缩,以便将边缘平铺与角点片段对齐。要正常工作,边缘平铺必须在最小图像边缘上至少重复 3 或 4 次。这种类型的平铺边缘/角点的示例是“叶子”或“花卉”效果边框的实现。