ImageMagick 示例 -- 创建缩略图与添加边框
ImageMagick 示例 前言与索引
|
- 自身边框(外部)
- 自身边框(内部)
- 简单的边框叠加
- 使用叠加制作徽章
- 蒙版与绘制技巧
- 圆角边框
- 使用蒙版与绘制制作徽章
- 绘制与蒙版技巧
- 页角卷曲
- 精致的边角叠加
- 使用绘制与蒙版制作徽章
- 光照蒙版技巧
- 玻璃气泡
- 使用光照蒙版制作徽章
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](https://imagemagick.org/command-line-options/#format)"设置来指定输出图像格式。从 IM v3.2.0 起,第二种方案现在也可以通过"magick mogrify"实现,这得益于新增的特殊"[-path](https://imagemagick.org/command-line-options/#path)"设置,它可以指定一个不同的目录来保存修改后的图像。例如,下面的命令会把 JPG 图像转换为 GIF 缩略图,放到刚创建的"thumbs"子目录中。
mkdir thumbs
magick mogrify -format gif -path thumbs -thumbnail 100x100 *.jpg
其他方法则要求你要么先复制原始图像,然后再运行"magick mogrify",要么创建专门的脚本来处理图像,或者用其他 DIY 方法。一些更简单的非 IM 技巧详细介绍在示例章节末尾的批处理 -- 不使用"magick mogrify"中。不管你选择哪种方法,重要的是选定一种缩略图存储方案,然后坚持下去。对所有缩略图使用相同的方案后,你就可以编写 shell 或 Perl 脚本来简化缩略图生成,甚至简化 HTML 链接的生成。稍后会详细介绍这一点。
缩略图格式的选择
保存缩略图所用的格式,会对磁盘上的最终大小以及网页的下载速度产生很大影响。在这方面,建议你研究一下各种常见文件格式的小结。具体而言应注意以下几点...
**JPEG** 压缩效果好且是有损的,但它是为大幅真实世界图像设计的,不是为小缩略图设计的。它也**不**支持任何形式的透明度。总的来说,这种格式适合大图像,不适合缩略图。要留意 profile(见下一节)。虽然不建议 JPG 用于缩略图,但对于在 WWW 上查看图像,建议使用更小的 800x600 像素图像,并采用低得多的"`[-quality](https://imagemagick.org/command-line-options/#quality)`"百分比(比如 50 甚至 30%),尽管效果不会很好看。也有人建议使用"`[-sampling-factor](https://imagemagick.org/command-line-options/#sampling-factor) 2x1`"同样可以生成更小的 JPEG 图像体积。我不建议将完整的原始图像直接放到网上,除非是临时的(放在一个引用位置),供朋友下载。切记不要链接到它(哪怕是通过目录索引),也不要放置超过一天,否则可能会被 Google 收录。
**GIF** 适用于简单的小图像,压缩效果尚可。它的颜色数上限是 256 色,但对小图像来说这一点很少能被察觉到。它还能实现类似卡通的图像动画,虽然缩略图并不需要这个功能,除非你真的想玩点花样。问题在于这种格式只支持布尔型(开/关)透明度,这会让异形图像的边缘看起来很糟糕。解决办法是把缩略图设计成只使用布尔型透明度,或者安排成只能用于特定的背景色。详情参见[在背景色或图案上的 GIF](formats.html#bgnd)示例。
**PNG** 是缩略图的现代理想格式。它压缩效果好,还有内部格式样式。它是无损的,可以显示所有颜色,如今几乎所有浏览器都能理解(不过对于 Microsoft Internet Explorer,v7 之前的版本需要在网页中添加一些 java 脚本)。更重要的是,这种格式理解半透明色,能让阴影和边缘按你的意愿显得锐利清晰,或者柔和模糊。不过这种格式不支持动画,虽然相关的 MNG 格式支持。但似乎很少有浏览器支持该格式。对于缩略图,你可以通过降低位深和颜色数,以及为最终缩略图设置更高的"`bzip`"压缩质量("`[-quality](https://imagemagick.org/command-line-options/#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。
Profile、Stripping 与 JPEG 处理
来自数码相机、扫描软件以及一些绘图程序(Photoshop 在这方面尤为出名)的许多图像,会以profile的形式保存关于图像的额外信息。这包括 JPEG、PNG、TIFF 以及自 IM v6.2.4-1 起的 GIF 等图像格式。当然 IM 特有的格式 MIFF 也会这样做。(更详细信息参见图像 Profile)。这些 profile 可能大到 60 Kb,因此会对你的文件大小产生很大影响,而且默认情况下 IM 会保留这些 profile 信息。缩略图并不需要这些数据,通常连主图像也不需要。你也可以用以下 IM 命令从图像中删除 profile...
magick input.jpg -strip output.jpg
magick mogrify -strip *.jpg
你也可以使用选项"[-profile](https://imagemagick.org/command-line-options/#profile) '*'"来删除 profile。不过建议仅在修改图像时才去除 profile,尤其是为了网页显示或缩略图而缩小图像尺寸的情况下。在调整尺寸时去除 profile,特别是为了生成较小的缩略图,这种做法非常普遍,以至于"[-resize](https://imagemagick.org/command-line-options/#resize)"和"[-strip](https://imagemagick.org/command-line-options/#strip)"被合并成了一个新的操作,专门用于这一目的。理所当然地,这个 resize 操作被称为"[-thumbnail](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#thumbnail)"会剥离图像的所有 profile,包括 ICC 色彩 profile。从该版本起,色彩 profile 将被保留。如果不想要色彩 profile,请使用"[-strip](https://imagemagick.org/command-line-options/#strip)"来去除所有 profile。
---|---
"[magick mogrify](basics.html#mogrify)"当然可以为整个目录的 JPEG 图像生成缩略图,但要小心不要覆盖任何你想保留的缩略图。关于遍历大量图像的其他非 IM 方法,参见批处理 -- 不使用 Mogrify示例章节。对于非常大的图像,"[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)"这个 resize 运算符会更进一步,在执行实际的调整尺寸操作之前,先把图像缩小到最终缩略图大小的 5 倍。这样可以进一步加快缩略图生成速度。但对于 JPEG 图像的缩略图化,还有一种限制初始图像大小的更好方法,即一开始就不把整幅图像读入内存。"[-define](https://imagemagick.org/command-line-options/#define) jpeg:size="设置(如上面示例所示)是给 JPEG 图像库的一个特殊提示,用于减少从非常大的 JPEG 图像中读取的数据量。参见读取 JPEG 文件。 | _在 IM v6.5.6-0 之前,这个编码器设置是从"[-size](https://imagemagick.org/command-line-options/#size)"设置中提取的。这在用户使用"[-size](https://imagemagick.org/command-line-options/#size)"来创建图像,却导致 JPEG 读取产生意外结果时造成了问题。因此这被改成了一个独立的特殊编码器设置。
在旧版本的 IM 中,由于这种"双重"角色,你在读取 JPEG 图像之前可能需要用"[+size](https://imagemagick.org/command-line-options/#size)"重置该设置。_
---|---
从 IM 6.2.6-2 版本起,新增了一个读取图像修饰符,可以让你在读入输入图像后立即调整尺寸。此选项适用于任何图像格式,不仅仅是 JPEG 图像。不过它并不能替代对 JPEG 图像使用"[-define](https://imagemagick.org/command-line-options/#define) jpeg:size="设置。因此,如今调整任何输入图像格式尺寸的推荐方法是...
magick -define jpeg:size=240x180 input.img'[120x90]' \
-strip output_thumbnail.gif
好了,接下来进入实用的 IM 缩略图示例...
通用缩略图创建
生成通用缩略图(指定高度)
我们用 magick 把一张大尺寸示例 JPEG 图像转换成高 90 像素的 GIF 缩略图,宽度会自动调整(在 250 像素宽度限制内)以保持图像的宽高比。 |
magick -define jpeg:size=500x180 hatching_orig.jpg -auto-orient \
-thumbnail 250x90 -unsharp 0x.5 thumbnail.gif
![]()
注意上面用了"[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)"选项。它不仅会调整图像尺寸,还会剥离原始 JPEG 图像中可能存在的任何 profile 和注释信息。而且由于它对图像初始缩小使用了"[-sample](https://imagemagick.org/command-line-options/#sample)"这个 resize 运算符,速度更快,同时对小缩略图仍能产生不错的效果。我还为读入的图像设置了一个最小的"[-define](https://imagemagick.org/command-line-options/#define) jpeg:size="。这会传递给 JPEG 库,库会返回一幅介于这个尺寸和其两倍尺寸之间(如果可能的话)的图像,而不是整幅非常大的原始图像。基本上就是在不需要的时候,不要用巨大的图像撑爆计算机内存。我使用的 JPEG 尺寸提示至少是最终缩略图的两倍,这样 resize 仍能生成看起来合理的结果。"[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)"运算符能确保图像(如果来自数码相机)根据相机的方向被正确旋转。对我这里用的"桌面"图像来说这不是必需的,但我在上面的示例中加上了它,供数码相机用户参考。不过要注意,方向仍有可能出错,尤其是对于直接俯拍或仰拍的照片,例如拍摄文档时。结果是一个高度固定、宽度可变的缩略图。我在自己的网页上使用这种缩略图,这样一行中的一系列图像在高度上就都能对齐,形成整齐的效果。上面的 250 像素宽度限制很重要。如果不设置(例如使用"-thumbnail x90"),IM 在为非常细长的图像生成缩略图时可能会出问题,比如网页线条图像中展示的那种。那种情况下的结果会是图像的一个非常非常长的_放大_,而不是一个小缩略图。有些人(包括我自己)觉得,虽然 IM 的 resize 是最好的实现之一(参见IM Resize 与其他程序对比),但结果仍然有点模糊。因此你可以通过轻微锐化图像(使用"[-unsharp](https://imagemagick.org/command-line-options/#auto-orient)"),在"[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)"这个 resize 操作之后改善上述结果。更多信息参见锐化已调整尺寸的图像 -- Photoshop Resize 技巧。不过说到底,这都是个人品味的问题。
"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 图像。使用此命令时始终建议格外小心。
在进行任何处理之前,始终建议先做好备份副本。
---|---
| _除了用("[-format](https://imagemagick.org/command-line-options/#format)")指定不同格式以防止"magick mogrify"覆盖原始源图像之外,你也可以用"[-path](https://imagemagick.org/command-line-options/#path)"设置来定义一个单独的缩略图目录。这两个输出选项可以同时使用。
---|---
虽然"magick mogrify"可以用不同的后缀("[-format](https://imagemagick.org/command-line-options/#format)")或目录("[-path](https://imagemagick.org/command-line-options/#path)")输出新图像,但使用这个命令时你只有这些选项。如果你还想更改图像的名字,比如添加"_tn"或"_sm"来表示缩略图或小图版本,那么建议你创建一个 shell 脚本,用"magick"一次处理一张图像来完成这项工作。我就写过这样一个脚本来完成这项工作,同时还能生成 HTML 索引。
调整尺寸以适配缩略图
另一种自动缩略图生成方式是把图像收缩到一个固定大小的框中,比如"100x100",同时保持图像的宽高比。这其实就是 resize 几何设置的默认含义。不过我不太喜欢放大那些已经能放进这样一个框的图像。为此你需要在几何字符串中加上">"。 |
magick -define jpeg:size=200x200 hatching_orig.jpg \
-thumbnail '100x100>' rectangle.gif
![]()
和之前一样,图像的宽高比会被保留,因此缩略图不太可能恰好是 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 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
![]()
使用Extent与使用视口裁剪之间的关键区别在于,你想要一个最小化的虚拟画布,还是想把整个区域都"填充"出来。另一种填充图像的方法是把缩略图叠加到一张合适尺寸的背景图像(真实图像、纯色或平铺画布)上,本例中使用的是 128x128 的内置图像"granite:"。 |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
granite: +swap -gravity center -composite pad_compose.gif
![]()
对于较早版本的 IM(比如 IM v5),这种方法大概是最好用的方法,不过"[-composite](https://imagemagick.org/command-line-options/#composite)"操作需要用单独的"[composite](basics.html#composite)"命令来完成,而不是上面那种单一命令的方式。但从图像处理的角度看,上面所有方法实际上做的都是同一件事。
裁剪缩略图以适配
另一种方案是,与其把图像填充成想要的具体缩略图尺寸,不如直接切掉不符合最终尺寸的部分。当然这意味着你确实会丢失原始图像的一些部分,尤其是图像的边缘,但结果是得到一个放大了图像中心部分的缩略图。这通常(但不总是)是图像的主要主体,所以这是一种实用的缩略图创建方法。从 IM v6.3.8-3 起,新增了特殊的 resize 选项标志"^",让这一操作更容易实现。我们只需用这个标志进行 resize,然后把超出所需尺寸的部分裁掉即可。 |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail 100x100^ \
-gravity center -extent 100x100 cut_to_fit.gif
![]()
可以看到图像的缩略图更大、细节更多,但代价是切掉了原始图像的两侧。关于此选项的更多信息参见调整尺寸以填满指定区域。 | 在添加这个特殊标志的 IM v6.3.8-3 之前,要达到相同效果需要相当复杂的技巧。详情参见调整尺寸以填满指定空间。
---|---
按面积适配的缩略图尺寸
前面两种方法往往会让图像变得非常小、带有大量额外填充,或者会切掉大量图像内容以完全填满空间。不过通过使用另一种 resize 标志,可以得到介于这两种极端之间的缩略图。例如,一张 100x100 像素的缩略图共有 10,000 个像素。如果我们让 resize 把图像的尺寸调整到大约这么多像素(使用resize 的"@"标志),就会得到一张既需要一点填充又需要一点裁剪的图像。这样可以在不切掉太多内容的前提下,最大化最终缩略图的尺寸。例如... |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail 10000@ \
-gravity center -background skyblue -extent 100x100 area_fit.gif
![]()
可以看到缩略图有一些填充,图像也有一些裁剪,但结果大概是把图像适配到给定缩略图空间中的最佳效果。
适配指定空间的方法小结
总结一下,这里展示了把图像制作为特定大小缩略图区域的三种方法的结果。这三种方法用的都是完全相同的代码,只是 resize 参数/标志略有不同。 ![]()
填充适配
resize,无标志 | ![]()
面积适配
resize,'@' 标志 | ![]()
裁剪适配
resize,'^' 标志
---|---|---
方形填充与裁剪
上述填充和裁剪方法都假定你已经知道要把图像放入的区域的最终尺寸。但情况并非总是如此。有时你只是想简单地"把图像变成方形",要么通过"填充"(外部方形),要么通过"削减"边缘(内部方形)。IM 讨论区图像方形化一帖中开发出了几种方法。 外部方形化可以使用Mosaic、通过旋转后的图像副本创建一个更大的背景画布来实现。 |
magick thumbnail.gif \
\( +clone -rotate 90 +clone -mosaic +level-colors white \) \
+swap -gravity center -composite square_padded.gif
![]()
另一方面,内部方形化则要难一些,需要更多工作才能实现。下面这种方法使用了相当繁重的蒙版处理来生成一个更小的画布。 |
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
![]()
另一种方法是使用 distort 的视口,通过一次无实际变换的 distort 来裁剪/填充图像(参见Distort 视口居中方形裁剪)。本质上是用"百分比转义"来完成Extent类操作所需的计算。外部(填充)方形... |
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
![]()
Virtual Pixel设置用于指定填充颜色。内部(裁剪)方形... |
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
![]()
由Fred Weinhaus 的 Tidbits 页面提供。这是一个更简单的版本,但会丢失图像可能带有的元数据(比如注释字符串或 profile)。 |
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
![]()
| IMv7 将允许你把上述数学运算直接作为 crop 或 extent 参数的一部分来完成,这样就不会丢失图像元数据。
---|---
手动裁剪
我为自己的网页生成缩略图的常规方式,是自动脚本与手动操作相结合。我的图像最终设置是...
- 对于原始的、_非常_大的照片扫描图,或从数码相机下载的原始 JPEG 图像,我使用 PNG 或 TIFF 格式。基本上就是用作归档的未修改原始源图像。我现在还喜欢在这类图像文件名中加上字符串"
_orig"。 - 用较小的 JPEG 图像格式作为点击或选中缩略图后可在网页上查看的图像。这幅图像会被调整尺寸以适配 800x800 像素的框,这个尺寸适合大多数网络用户查看。我通常在文件名中加上"
_md"表示中等尺寸图像。 - 最后是调整为固定高度 90 像素、宽度可变的 GIF 缩略图。这样可以让网页上居中排列的一行行缩略图看起来相当整齐美观,同时又能自动填满浏览器窗口的宽度,无论用户使用的浏览器是什么尺寸。同样,我现在通常在图像文件名中加上"
_tn",表示这是缩略图。
我首先用"magick mogrify"从原始扫描图像生成可在网页上查看的 JPEG 图像(中等尺寸)。这样可以把图像的下载时间和显示尺寸缩减到对普通网络用户(可能是通过调制解调器登录的)来说切实可行的程度。从这些图像出发,我再次用"magick mogrify"生成一套初始缩略图。不过我经常发现,在典型的照片中,缩略图的主体在被查看时会显得太小,难以成为有效的缩略图。为了解决这个问题,我会检查自动生成的缩略图,大约一半的情况下会手动创建自己的"聚焦主体"缩略图。我读入 JPEG 图像,把它裁剪到图像的主要主体,实际上就是对照片主体"放大",去掉图像背景的大部分环境内容。然后对它做平滑处理并生成缩略图,要么用"magick -thumbnail",要么更常见的是在我用来查看和裁剪图像的同一个图形程序中完成(通常是"XV",见下文)。因此,与其得到一张照片中人物几乎看不清的缩略图(左),我会手动围绕主体裁剪,突出照片的主要看点(右),然后再生成缩略图。这样用户就能更清楚地看到图像内容,从而更好地判断自己是否真的想下载并查看图像的较大 JPEG 版本。 昆士兰放风筝爱好者,Ron 与 Val Field
![[IM Output]](../static/img/img_photos/kiteflyers_auto.gif)
自动
生成的
缩略图 | | ![[IM Output]](../static/img/img_photos/kiteflyers_man.gif)
手动裁剪
并调整尺寸的
缩略图
(点击任一图像可查看原始扫描照片)
这样做当然更耗费人工,但每张图像只需做一次,而且只需对像上面例子中那种留白较多的图像这样做。而且我只对要放到网上的图像这样做。当然,由于"magick mogrify"会覆盖任何现有的、可能是手工生成的缩略图,所以在你进行过任何手动缩略图生成之后,就不能再次使用它了。"magick mogrify"命令很有用,但也非常危险,因为它会覆盖大量图像。在对所有图像全局运行"magick mogrify"之前,一定要三思。
HTML 缩略图页面
一旦整理好目录中的所有缩略图图像,我就会用一个我自己写的名为"thumblinks"的专用 perl 脚本,它会查找图像(JPEG 照片和 GIF 缩略图),生成 HTML 链接,甚至生成完整的 HTML 照片页面。该脚本会读取并在 HTML 中包含 GIF 缩略图的尺寸,并在缩略图链接周围附加预先准备好的页眉和页脚文件。如果脚本在页眉或页脚文件本身中发现已存在的链接,它还会把它生成的列表中对应的缩略图链接去掉。这听起来可能很复杂,但它让我的 HTML 页面生成变得非常快速灵活,并确保目录中所有已生成缩略图的图像都被添加到该目录的索引页面中,同时仍允许我在索引页眉中对特定图像做说明。它还使页面不受用户窗口大小的影响,能自动调整以适应。关于我的"thumblinks"脚本输出的简单示例,参见Tomb of Castle Artworks。若想快速了解生成此类链接的示例和起点,请参阅使用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 图像文件格式。不过由于这些后者格式通常无法在不同分辨率和颜色数下保存多张图像,对于"favion.ico"图像,坚持使用 ICO 文件格式可能更稳妥。
其他非 IM 方法
我用于手动图像处理的"XV"程序也会生成缩略图图像,存放在一个叫".xvpics"的子目录中。这个目录中图像的格式是该程序自己特有的缩略图格式(该目录中的文件名后缀会被忽略)。这些缩略图被限制在 80x60 像素,所以尺寸偏"小"(除非你破解"xv"以使用更大的缩略图——见下面的链接)。IM 能理解"xv"的缩略图格式(该格式基于"NetPBM"图像格式),所以你可以先用 XV 快速生成所有缩略图,然后用 magick 把 JPEG 图像的 XV 缩略图转换成 GIF 图像以做进一步处理...
xv -vsmap & # 用"Update"按钮生成缩略图
rm .xvpics/*.gif # delete XV thumbs of existing "gif" thumbnails
magick mogrify -format gif .xvpics/*.jpg
mv .xvpics/*.gif . # 把新的"gif"缩略图移动到原目录
如果你厌倦了 XV 缩略图偏小的尺寸,特别是在更大的现代显示器上,可以修改 XV 的代码。参见我的XV 修改说明,通过它可以让 XV 使用更大的缩略图尺寸。我自己用的是 120x90 像素的缩略图。
进一步处理——添加装饰
以上只是让缩略图更有趣的开始。除了基本的缩略图之外,你还可以添加边框、旋转,甚至加入一些随机选择的样式,让你的缩略图库更加有趣。像这样对缩略图的附加处理,我称之为"装饰(fluff)",就像洗完衣服后覆盖在衣服上的多余绒毛一样。也就是说,它给缩略图添加了不必要的额外内容,但这能让网页和索引图像变得更加有趣。请注意,下面的许多方法和处理过程都非常复杂,可能需要你对 ImageMagick 的各种图像处理选项有更深入的了解。
添加图像标签
在制作缩略图的过程中,你还可以在缩略图的上方、下方,甚至叠加在缩略图之上添加标签。不过这类图像处理在用标签标注图像中有更详细的介绍。只需记住在那些示例中使用"[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)"或"[-strip](https://imagemagick.org/command-line-options/#strip)"而不是"[-resize](https://imagemagick.org/command-line-options/#resize)"即可。例如... |
magick thumbnail.gif \
-background Lavender -fill navy -font Candice -pointsize 24 \
label:Hatching -gravity South -append \
labeled.gif
![]()
利用复合字体,你可以将一些非常精美的标签叠加到图像本身上。这里我用更密实的软轮廓字体技术来给缩略图加注释,将文字周围的区域加深,以确保它始终保持可读。 |
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
![]()
注意这里我没有使用预先生成的"thumbnail.gif"图像,也没有用缩略图调整尺寸运算符来剥离图像的配置文件和注释。然后我使用了"[+clone](https://imagemagick.org/command-line-options/#clone)"、"[+sample](https://imagemagick.org/command-line-options/#sample)"和"[-alpha](https://imagemagick.org/command-line-options/#alpha)"来生成一个更大的透明工作画布,其中也包含原始图像元数据的一份副本。这让我能够用注释运算符"[-annotate](https://imagemagick.org/command-line-options/#annotate)"使用图像的"comment"字符串,来提供叠加在图像上的文字。只有在最后完成文字叠加的合成之后,我才清理并"[-strip](https://imagemagick.org/command-line-options/#strip)"掉那些信息。
凸起按钮
"[-raise](https://imagemagick.org/command-line-options/#raise)"运算符基本上就是为了突出矩形图像的边缘、形成凸起按钮这一个目的而创建的。这是一种简单、快速且有效的缩略图变换。 |
magick thumbnail.gif -raise 8 raised_button.gif
![]()
同一个运算符也有一个"加号"形式,可以用来制作凹陷高光效果。 |
magick thumbnail.gif +raise 8 sunken_button.gif
气泡按钮
通过一些技巧,"[-raise](https://imagemagick.org/command-line-options/#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
关于这类技巧的更多信息请参见光效合成方法。想了解更多类似效果,请参见下面的自框架(内部),若想更进一步,请参见下面的光照效果蒙版。
添加边框
朴素简单的"[-border](https://imagemagick.org/command-line-options/#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
简单边框
类似地,"[-frame](https://imagemagick.org/command-line-options/#frame)"运算符可以很容易地在图像周围添加一个边框 |
magick thumbnail.gif -mattecolor peru -frame 9x9+3+3 framed.gif
![]()
这个运算符还有很多选项,可以创建十几种不同风格的边框。你可以在边框,添加类似 3D 的边缘中看到相关可能性的示例。
Montage 边框
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 处理。 ![]()
即使只用"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
![]()
更多细节请参见"Montage,图像数组"。你可能会对 Montage HTML 缩略图图像映射示例特别感兴趣。这会创建一个缩略图的 HTML 索引页面,点击缩略图会打开位于同一目录中的原始图像。
柔化与模糊边缘
渐晕运算符提供了一种在图像周围添加模糊边缘的简单方法。 |
magick thumbnail.gif -alpha set \
-background none -vignette 0x4 vignette.png
![]()
当然,由于这个缩略图使用了半透明颜色,所以需要保存为 PNG 格式。形态学距离方法提供了一种对图像边缘真正的透明"羽化"效果。 |
magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
-morphology Distance Euclidean:1,10\! +channel feathered.png
![]()
透明区域的最大距离由特殊的"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
![]()
额外的"[-level](https://imagemagick.org/command-line-options/#level)"操作(仅调整透明度通道)确保边缘变为完全透明,而不是只有一半透明。不过由于模糊生成的 S 型曲线,边缘处仍会急剧降到零。它在角落处还有叠加效果,会导致角落变圆;而对于有尖锐凹陷的异形图像,则可能使完全透明的像素变为半透明。因此对于异形图像,可能需要(使用Dst-In 合成)将结果与原始图像做蒙版处理。不过对于矩形缩略图来说,这个结果是令人满意的。你可以在分层缩略图中看到使用这种羽化方式的另一个示例。如果不对模糊后的羽化边缘做色阶调整,你也可以对模糊后的 alpha 通道在"50%"处进行阈值处理,从而给上面的缩略图添加伪圆角。 |
magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
-blur 0x8 -threshold 50% +channel rounded_corner_blur.gif
![]()
虽然非常简单,但这样得到的圆角效果并不算好。首先,角落实际上并不是圆形,而是"双曲线"形状。其次,结果不是平滑的抗锯齿曲线,而是由阈值操作的锯齿效应引起的"锯齿"。不过这张图像可以保存为 GIF 文件格式。详情请参见GIF 布尔透明度。另外要注意,当使用较大的参数来生成更大的圆角时,"[-blur](https://imagemagick.org/command-line-options/#blur)"操作可能会变得非常慢。因此完全不推荐用这种方法在较大尺度上做圆角处理。若想要一种更特别的模糊边缘效果,可以只对 alpha 通道使用径向模糊。 |
magick thumbnail.gif -alpha set -virtual-pixel transparent \
-channel A -radial-blur 0x45 +channel radial_blur_edge.png
![]()
这种方法对完全正方形的图像效果更好。随着角度模糊量的增大,最终会生成一种类似圆形渐晕的边缘。 |
magick thumbnail.gif -alpha set -virtual-pixel transparent \
-channel A -radial-blur 0x100 +channel radial_blur_vignette.png
![]()
可以看到的两处台阶状瑕疵,是由图像的两个尺寸不同导致的。正方形图像不会出现"台阶"。在最后一个示例上再加一点普通模糊,也能改善这个台阶问题。
圆角与异形角
对柔化模糊边缘(见上文)做阈值处理,虽然能生成适合 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
![]()
基本上是从原始图像中提取出白色透明度蒙版,其中只有一个角是黑色圆角。然后对其做上下翻转和左右翻转,从而得到一个四角都是圆角的蒙版。最后再把这个蒙版应用到原始图像上。对于尺寸大得多的图像,你最好对每个角分别应用一个小得多的蒙版,以减少所需的总处理量。也就是说,虽然单独的处理步骤更多,但整体上对实际像素的处理反而更少。例如,下面是同样的做法,但改为从每个角裁掉一个简单绘制的三角形形状。这种方法适用于大得多的图像。 |
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
![]()
如果你不想要透明,而是想要其他颜色,仍然可以先做上述操作,然后再移除透明度。这对 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
![]()
遗憾的是,由于与展平操作的"背景画布"之间存在相互作用,这种方法不能简单地用来把图像的角"擦除"为透明。未来的分层运算符或许能解决这个问题。 | 最后一个示例在 v6.6.6-5 之前的 IM 版本中会失败,因为"[-flip](https://imagemagick.org/command-line-options/#flip)"和"[-flop](https://imagemagick.org/command-line-options/#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
![]()
我们会在下面的带圆角的边框中把这种图像处理方式进一步发展。在那里我们不仅要裁切角,还要叠加相应的边框图像。
撕纸边缘
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
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
![]()
可以通过添加"纸张"色的边框和曲线形状蒙版来改进这一效果,让图像看起来像是被人手粗糙地撕下来的。再加上"柔和阴影"(见下文),也能把最终图像从背景中"抬起来",让它看起来像是独立的一片。一如既往,欢迎提出建议和贡献。
添加阴影
"[-shadow](https://imagemagick.org/command-line-options/#shadow)"运算符可以轻松地为任意形状的图像生成阴影。例如,这里我给缩略图添加了一个半透明的彩色阴影。 |
magick thumbnail.gif -alpha set \
\( +clone -background navy -shadow 60x0+4+4 \) +swap \
-background none -mosaic shadow_hard.gif
magick -page +4+4 thumbnail.gif -alpha set \
\( +clone -background navy -shadow 60x4+4+4 \) +swap \
-background none -mosaic shadow_soft.png
![]()
注意这里我再次使用了 PNG 格式作为缩略图输出。这是因为带阴影的图像会包含大量半透明像素,而 GIF 无法处理这些像素。(是的,我又在重复这一点,但这很重要。)如果你确实打算使用 GIF 或 JPG 格式,就需要为将要展示该缩略图的网页或更大画布选用合适的"[-background](https://imagemagick.org/command-line-options/#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
![]()
你应该明白其中的思路了。每一行"\( +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
![]()
上面这种做法的一个更复杂的版本,作为"[-polaroid](https://imagemagick.org/command-line-options/#polaroid)"变换运算符加入了 IM v6.3.1-6。例如... |
magick thumbnail.gif -bordercolor snow -background black +polaroid \
poloroid_operator.png
![]()
注意这张图像不仅有宝丽来边框,照片本身还带有一点"卷曲",并配有相应的阴影调整,让最终图像更有层次感。加号(+)形式使用随机角度,而普通的减号(-)形式则可以让你指定旋转角度。特别感谢 Timothy Hunter 提出了这一技术背后的构想。你甚至还可以添加"[-caption](https://imagemagick.org/command-line-options/#caption)"、设置自己的阴影颜色、指定自己的旋转角度(或者完全不旋转)。 |
magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
-font Ravie -gravity center -bordercolor Lavender \
-background navy -polaroid -0 poloroid_caption.png
![]()
关于使用该运算符的更多信息,请参见复杂的宝丽来变换。不过在下面的示例中,我会继续使用手工制作的方法,因为我需要更精细地控制边框和阴影效果,以展示恰当的照片"堆叠"效果。那么开始吧... 通过制作照片的多份副本(或使用其他图像),添加宝丽来边框,然后随机旋转并堆叠起来,你就可以做出一堆看起来很不错的照片堆。 |
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
![]()
| 上面示例中嵌入的"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
![]()
关于这项技术(及更多内容)的详情,请参见纯色背景上的 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
![]()
当然,对于这样的照片散布效果,你真正需要的是一组不同的照片,而不是像这里这样反复使用同一张图像。使用这种技术时,还有几点需要留意。
- 上面的边框是硬编码的,取决于缩略图的尺寸。在实际应用中,边框处理或许应该放到缩略图生成阶段,而不是放在上面的照片散布阶段。
- 由于"
[-rotate](https://imagemagick.org/command-line-options/#rotate)"也会扩大画布尺寸,除非你使用相对于"[-gravity](https://imagemagick.org/command-line-options/#gravity) center"位置的偏移量来放置图像,否则添加图像的位置会不断变化。 - 最后,不断地旋转背景框架在画质上并不是一个好主意。对已经旋转过的图像再次旋转,比在叠加之前对每张单独的图像各旋转一次,会给结果带来更多的像素级失真。
一种类似的、在更大区域内随机堆叠照片的方法,是为 Stas Bekman's Photography 开发的,只是使用了不同的加边技术。一种更通用的方法,用于创建某种有序或程序化排布的照片和图像布局,展示和说明请见图像分层示例以及重叠照片。
框架技术
在这里我们将学习一些高级框架技术,需要对 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
![]()
| 与其使用级别调整来使框架图像变亮(或变暗),另一种让边框颜色更亮或更暗的方法是使用类似下面的方式对框架进行颜色着色。
"-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
![]()
上面的一种变体使用了特殊的viewport控制以及默认的Virtual Pixel, Edge设置,来扩展模糊图像的边缘以生成外部框架。 |
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
![]()
提醒一下。一个小的边缘缺陷(比如一棵树或一片叶子)可能会在仅使用图像边缘生成的框架中产生一些不理想的结果。viewport 确实需要知道原始图像的尺寸,才能对该 viewport 进行适当的放大和偏移。不过你可以使用FX 转义表达式来计算 viewport 的尺寸(参见下面的例子)。另一种方法是在上面的例子中使用模糊的Virtual Pixel, Dither。这会让颜色进一步扩散,看起来不那么"锐利"。但如果你在放大前后都添加模糊,就可以利用 dither 产生类似布料的效果。 |
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
![]()
第一次模糊调节了平均颜色,而第二次则调整了 dither 图案的"像素化"或平滑程度。这里是另一个例子,这次使用Virtual Pixel, Mirror,配合(涂黑的)柔和边缘,对这张特定图像效果非常好。 |
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
![]()
在以上所有情况中,框架都是从同一图像生成的,然后组合在一起,产生基于原始图像颜色的框架。因此这种框架边框是独一无二的,与被框住的每张缩略图像相匹配。Fred Weinhaus 制作了一个脚本"[imageborder](http://www.fmwconcepts.com/imagemagick/imageborder/)",让自框架图像制作更简单,边框由原始图像的模糊放大版本生成,或者由某种定义内容的Virtual Pixel设置生成。
自框架(内部)
除了通过放大图像来添加新边框之外,我们还可以将图像自身的一部分 magick 成边框。我们已经见过一些在图像内部添加框架的技术。凸起按钮和气泡按钮技术就是这样做的,使用了"[-raise](https://imagemagick.org/command-line-options/#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
![]()
你也可以使用框架运算符来实现与之前看到的按钮效果略有不同的效果。技巧是在应用之前先对原始图像进行裁削(Shave)。例如,这里我复制一份原始图像,将其裁削并用透明框架框起来,然后再叠加到原始图像上。 |
magick thumbnail.gif \( +clone -shave 10x10 \
-alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
\) -composite inside_frame_trans.gif
![]()
这种做法的问题在于,原始图像周围框架的平坦部分总是会被"变亮"或"变暗"(降低对比度)。为了避免这种情况,我们可以使用与气泡按钮技术相同的方法。我们在一个纯灰色画布上生成一个框架,并对其进行修改以生成一个光照效果合成蒙版,用来调整原始图像的颜色。例如,这里我使用"[VividLight](compose.html#vividlight)"合成方式与带框架的蒙版图像结合,以更好地保留原色。 |
magick thumbnail.gif \
\( +clone -shave 10x10 -fill gray50 -colorize 100% \
-mattecolor gray50 -frame 10x10+3+4 \
\) -compose VividLight -composite inside_frame_light.gif
![]()
和气泡按钮一样,你也可以在应用之前对光照蒙版进行模糊处理。这里我使用了更常规的"[HardLight](compose.html#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
![]()
| 某些光照合成方法可能需要你在合成之前先交换图像,才能得到正确的光照效果。
---|---
要将这种效果进一步发挥,产生更复杂的结果,请参见高级的光照效果蒙版。
简单的边框叠加
一种简单的框架方式是创建一个花式框架,或者一个带有形状的图像,你可以把图像放在框架下面。例如,这里我们生成一个比图像稍大一点的简单框架,中间有一个花式形状的孔。这个形状是从"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
![]()
关于在已有形状图像上生成边缘的其他方法,请参见边缘变换。你也可以使用阴影效果选择性地给框架增加一点立体感。 |
magick border_heart.png \( +clone -background black -shadow 60x3+3+3 \) \
-background none -compose DstOver -flatten border_overlay.png
![]()
现在我们有了一个简单的叠加框架,可以使用"[DstOver](../static/img/compose/dstover)"合成方式,将图像置于框架下方中央位置。 |
magick border_overlay.png thumbnail.gif \
-gravity center -compose DstOver -composite border_overlaid.jpg
![]()
现在你可以生成一个预制框架库,用于配合你的图像,比如这张秋叶图像。
magick thumbnail.gif autumn_leaves.png +swap \
-gravity center -compose DstOver -composite \
border_leaves.gif
注意我交换了图像的顺序,使用"[DstOver](compose.html#dstover)"将第二张主图像置于框架"之下"。这样一来,决定最终图像尺寸的就是框架,而不是原始图像。不过这样做也会丢失主图像所带的任何元数据(出于同样的原因)。如果你确实想保留缩略图的元数据(比如标签和注释,例如版权信息),最好的办法是将缩略图填充到与框架相同的尺寸,然后使用默认的"[Over](compose.html#over)"合成方式来叠加框架。这样一来,缩略图就是"目标(destination)"图像,其图像元数据得以保留。
徽章叠加示例
这里是另一个更复杂的预制叠加示例,这次使用了一张(利用 extent 作为裁剪方法)调整为正确尺寸的图像,来自 IM 论坛讨论Composite Overlay and Masking。
magick thumbnail.gif -gravity center -extent 90x90 \
badge_overlay.png -composite badge.png
请注意,图像本身并未发生扭曲,只是被略微调亮或调暗,切出了一个圆形并添加了阴影,这一切都在一张叠加图像中完成。如果这是一个真正的徽章,或者"玻璃气泡",那么图像也应该稍微扭曲一下(也许使用桶形畸变),但即使不需要这种扭曲,效果也已经很好。关于"徽章"示例的下一步,请参见使用蒙版和绘制的徽章,它会在徽章外围添加背景透明度。
蒙版与绘制技术
在许多情况下,你不仅想在图像周围叠加一个方形边框,还想将图像边缘裁切为透明。为此你通常需要至少两张图像。一张是包含你想添加到现有图像中的颜色、阴影和高光的蒙版叠加图。第二张则包含你想从原始图像中移除的部分。这两张图像可以用两种不同的方式应用。你可以先"蒙版"去除图像中不需要的部分,再叠加框架,_或者_你可以先叠加框架,然后将原始图像和叠加颜色中不需要的部分都蒙版为透明。使用哪种方法至关重要,涉及的图像会针对特定技术进行设计。不能用某一种方法的图像按错误的顺序用于另一种方法,否则效果不会正常。例如,让我们创建一个更复杂形状的边框,但这次不用担心背景的设置。 |
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
![]()
现在我故意让这个边框变得模糊,使边缘组成部分变得更加半透明。即使没有这种额外的模糊感,边框本身也包含大量半透明的抗锯齿像素,让边缘看起来更平滑、锯齿更少。在图像处理中,考虑这些半透明像素,正确地保留和设置它们,是至关重要的。为了让它更有意思,给这个"模糊"边框加一点随机的颜色。 |
magick border_ellipse.png \
\( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
-compose SrcIn -composite border_ellipse_red.png
![]()
好了,我们有了一个边框,但仍然需要某种方式来定义边框的外部和内部分别代表什么。基本上我们需要一个蒙版来定义这两个区域。 |
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
![]()
这张"蒙版"图像的颜色并不重要,重要的是它的形状,因为它基本上定义了哪些部分被归类为内部、哪些被归类为外部。蒙版可以是灰度蒙版,也可以是像上面展示的那种形状蒙版。不过后者通常更有用,甚至可以是要擦除部分的形状,或要保留部分的形状(如上所示)。在这种情况下,这些图像是按照"蒙版与绘制"技术设计的,意味着你应该先擦除不需要的部分,然后再叠加额外的边框颜色(这也涉及一个透明度蒙版)。例如...
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
始终需要两次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
![]()
但在那种情况下,你也可以简单地在之前生成的双重蒙版图像下方,铺一层纯色或其他某种背景图像... |
magick border_double_masked.png \
\( -size 120x100 plasma:Green-Green -blur 0x1 \) \
+swap -compose Over -composite border_background.png
![]()
重点在于,有了"蒙版"和"叠加"这两张图像,你在如何给图像添加边框方面就有了更大的自由度。你甚至可以定义多个"蒙版"图像,来定义"叠加"边框图像的不同"窗口"。你也可以添加可选的高光和阴影,而不是把它们硬编码进单一的叠加框架图像中。现在有一个重要的提醒。蒙版图像的边缘绝不能与叠加图像的边缘重合。如果它们重合,你将无法正确处理重合边缘处的颜色,或者会产生其他奇怪的"光晕"效果。因此你需要确保蒙版边缘落在叠加图像完全不透明区域内的某个位置。对这两次蒙版操作需要谨慎并提前考虑周全。
带圆角的边框
如上所见,蒙版与绘制技术既可以用来给图像添加额外的颜色或"装饰",也可以用来去除部分内容,从而塑造最终图像的形状。这为我们提供了一种给图像添加圆角的替代方法。IM 的"[-draw](https://imagemagick.org/command-line-options/#draw)"运算符自带一个"roundrectangle"方法,可用来在图像周围提供一个有趣的框架。不过你需要将这个绘制方法的尺寸调整为与图像匹配。IM 提供了根据图像尺寸提取值和进行数学计算的方法。放置矩形的坐标是用来定义矩形的描边宽度的准确"中心"位置(可以是浮点数值)。而且它是以"像素坐标"(像素坐标 vs 图像坐标)给出的,这意味着值 1,1 指的是从上边和左边算起的第二个像素,但更重要的是,它指的是该像素的"中心",实际上距离真正的上边和左边有 1.5 个单位。现在我们使用描边宽度(SW)为 3,这会使图像在各边都增大 3 个像素。这意味着矩形的位置将在左上方距离SW/2 - 0.5即 1.0 像素处,右下方则在ImageSize + SW*1.5 - 0.5即图像尺寸加 4 像素处。这里我们用 IM 自身来完成这些计算,通过花哨的FX 转义生成所需的精确 draw 命令。这被保存为一个Magick Vector Graphics 文件,可以在后续命令中被 draw 直接使用。
magick thumbnail.gif \
-format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
info: > rounded_corner.mvg
| 如果你能用其他方式(使用 shell 或其他 API 语言包装器)算出图像尺寸,你可以在接下来的例子中直接代入相应的 draw 参数,而不必使用 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
至此,我们得到了双重蒙版技术所需的叠加边框图像和透明度蒙版图像。请注意,这些蒙版是针对比原始图像大一个描边宽度的图像的,而(用白色表示的)擦除形状蒙版并没有覆盖整个放大区域,其周围留有 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
![]()
至此,我们为图像加上了带圆角的边框。接下来是如何用一条命令完成上述全部操作,并附加一点额外的花样。不过这个一体化命令仍然会生成一个临时文件,保存针对给定尺寸图像所需的生成 draw 命令。 |
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 论坛Composite Overlay and Masking中讨论过。理想情况下,这两张图像本应一起开发。
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
请注意,前面我说过应避免让透明度边缘与蒙版边缘对齐。在上面的例子中,我恰恰这样做了,结果图像的边缘不会完全正确。不过由于这里的着色实际上只是一种微妙的渐变,而不是强烈的边缘,所以在这个例子中似乎效果还不错。但仍需谨慎对待。关于"徽章"示例的下一步,请参见使用绘制和蒙版的徽章,它颠倒了两次合成操作的顺序,需要一组不同的图像。
绘制与蒙版技术
与其"先蒙版再绘制",你也可以使用另一组图像,先叠加额外的颜色,然后再用蒙版去掉背景。也就是说,你可以执行"先绘制再蒙版"。也就是说,你先拿到图像,叠加边框,这不仅设定了最终边框的所有颜色,还会遮蔽并给原始图像外部部分的一些或全部区域上色。然后你使用一个单独的"外部"或"裁剪"蒙版来去除结果图像中所有不需要的部分。另请注意,"叠加"和"蒙版"两张图像都分别定义了边框的内边缘和外边缘。因此,一张图像并不能在单一图像中完整定义整个边框,这会使其使用起来稍微困难一些。不过实现起来可能更简单。例如...
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
请注意,叠加的部分颜色被去除了。这正是_绘制与蒙版_技术的关键特性,可以使用更简单的叠加图,再通过蒙版进行调整。这种图像蒙版方法用在下一组翻页角示例中,之后也会在下面的花式角落边框中再次用到。
翻页角
Fred Weinhaus编写了一个特殊的 shell 脚本PageCurl,使用非常复杂的数学计算(在 shell 中),为现有图像添加简单的翻页效果。例如... |
pagecurl thumbnail.gif pagecurl.png
![]()
在内部,它实际上使用了绘制与蒙版技术。也就是说,先叠加一个略大一些的"卷角叠加图",然后擦除(蒙版)其余图像,包括叠加图中一小部分区域,这部分会成为透明的角落。不过如果你想给大量图像应用翻页效果,使用完整脚本(如上)是相当慢的方法。毕竟它要进行大量的数学处理(将 IM 本身用作浮点计算器),才能实际计算并生成相应的叠加图和蒙版图像。要给大量图像应用翻页效果,最好只运行一次脚本,以便只生成一次叠加图和透明度蒙版图像。那么让我们为更小的 64x64 像素图像提取这两张图像(使用为此目的添加到脚本中的特殊"-i "pagecurl""选项)。 |
magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:
![]()
上面的命令会创建两个图像文件:"pagecurl_overlay.png"和"pagecurl_mask.png",如图所示。输入图像本身并不重要,因为我们想要的是蒙版图像。"翻页"的结果只是通过特殊的"[null:](files.html#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
![]()
当然,这些图像的尺寸与我们的缩略图或你想应用效果的其他任何图像都不一样,但这没关系,因为我们可以使用几个额外的选项来确保它们按预期工作。具体来说,"[-gravity](https://imagemagick.org/command-line-options/#gravity)"设置确保这两张叠加图像被放置在右下角。而特殊的Define 设置"compose:outside-overlay=false"可以防止蒙版图像擦除未被较小图像覆盖的部分。完整说明请参见Outside-Overlay 设置。如果你想将此应用于大量图像,可以使用"magick mogrify",并采用一种特殊技术,使用"[-draw](https://imagemagick.org/command-line-options/#draw)"来执行Mogrify Alpha 合成。不过这种合成方法不理解特殊的 define 设置,因此只有当图像、叠加图和蒙版尺寸都相同时才能正常工作。
pagecurl -e 0.5 -i /tmp/pagecurl {_一张图像_} 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"' \
{_所有需要翻页的图像_}...
花式转角叠加
这里我们更深入地探讨如何使用这种“双重蒙版”技术,在图像的不同区域以不同方式修改图像,而不是对整幅图像应用单一的大蒙版或边框。这种情况下我们只对转角做双重蒙版。(与之匹配的)边框其余部分是单独添加的。
我使用的转角图像是从原始素材(右图所示)生成的,该素材来自 DIY Frames Section,它属于 Anthony's Icon Library。这个部分还有其他一些素材,你可能想看看。如果你在网上发现了什么好东西,请告诉我,因为我喜欢收集有趣的转角和边缘处理技巧。
我们从那张初始图像生成了一张颜色叠加图和一张蒙版图,这样就能用涂色与蒙版技术把转角叠加到图像上。请注意,这些图像实际上没有使用任何半透明像素,甚至没有任何颜色的渐变。因此这种花式边框可以用来为网页制作干净利落的“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
![]()
| 请注意,为了保留正在添加的透明边框,必须把“[-compose](https://imagemagick.org/command-line-options/#compose)”设置为“Copy”而不是默认的“Over”。如果不这样做,透明部分就会被下一次添加的边框颜色填充,本例中即为“Black”。详情参见边框运算符。
---|---
只使用转角蒙版的妙处在于,只要图像大到足以容纳所添加的转角蒙版,就可以用这种技术为任意尺寸的图像加框。也就是说,你不会受限于手头有的加框图像的尺寸。当然,四个转角图像和边框在图像四周都是相同的,只是做了旋转而已。也就是说,阴影或厚度效果全都是“向内”的。要修正这一点,就需要为每一个转角单独生成不同的转角块,而且原始图像四周添加的额外边缘也需要做成不对称的。基本上这会变得复杂得多,才能产生真正的阴影效果。更好的办法可能是先从转角块中去掉阴影效果,像之前那样应用,然后再全局添加阴影效果。需要谨慎处理。
使用涂色与蒙版制作徽章
之前在徽章叠加和蒙版与涂色制作徽章中见过的同样的徽章图像处理,也可以通过先涂色再蒙版的方式完成。这里我们先把所有颜色和明暗都涂到图上,然后再用蒙版遮出图像最终的透明部分。
magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
badge_paint.png -composite badge_shape.png -compose DstIn -composite \
badge_paint_mask.png
如果你觉得这对这张具体的图像来说有点别扭,那你说对了,确实别扭。原因在于,我们不仅需要给原始图像做明暗和高光处理,还需要把将要包含阴影效果的区域用黑色填满。具体来说,任何将变为完全透明的部分(且只有真正完全透明的像素)都需要涂成黑色。另一方面,带有阴影效果的半透明像素,既需要部分明暗效果,又需要部分透明蒙版。换句话说,阴影使得原本简单的涂色与蒙版技术,在涂色效果与蒙版效果的划分上变得很别扭。这正是为什么在处理诸如添加阴影或星形光斑之类的半透明附加效果时,通常不会使用涂色与蒙版技术。如果图像本身不包含任何透明效果,那么涂色过程就不会显得那么糟糕,在很多情况下甚至比其他技术更简单,因为完成后可以用蒙版把涂上去的叠加层“切掉”。翻页卷角的例子就是这样一种情况,我们用蒙版把翻页卷角叠加层裁剪掉,做出天衣无缝的整体效果。另外还要注意涂色图像中,硬黑区域与明暗效果之间的间隙。这个间隙体现了我之前提到过的一个警示:要确保内部蒙版的结果不会与任何涂色/叠加外部蒙版的边缘发生重叠。正是在这个具体案例中,这种必要的间隙才变得如此明显。关于“徽章”系列示例的下一步,请参见使用光照效果制作徽章,它会把两张蒙版图像合并成一张蒙版/明暗图像。
光照蒙版技术
玻璃气泡按钮
缩略图处理中下一个复杂层次,是应用非常复杂的光照效果。这里的棘手之处与其说是把光照效果应用到图像上,不如说是生成适当的明暗效果。例如使用水感效果,可以给缩略图赋予非常复杂的明暗效果,使其看起来像是被包裹在一个玻璃“气泡”中。而且这种效果在带有圆角的缩略图上效果更好。那么让我们先用一种纯灰色,为我们的缩略图图像生成一个圆角蒙版。 |
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
![]()
现在我们已经有了想要用的纯灰色“形状蒙版”,接下来可以对这个形状应用水感效果,生成一张光照叠加图。 |
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
![]()
有了如上所示的最终光照/明暗叠加图,我们就可以轻松将其应用到任何尺寸合适的缩略图图像上。 |
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 用户论坛话题 Extracting light layer from two images。
不过这项技术还可以走得更远,因为我们也可以直接把阴影效果添加到这张光照蒙版上。但添加的颜色必须是纯黑色,而且你需要确保所选的光照效果合成方式能保证:光照蒙版为黑色时,图像也会呈现完全黑色。而实际上,这正是阴影效果通常添加到图像上的方式,因此你只需直接把阴影加到“光照效果蒙版”上即可,一切都会正常运作!同样的道理也适用于添加光照“光斑”,只是光斑叠加只能使用白色像素。本质上,一张“光照效果图像”又能把两张蒙版与涂色图像重新合并为一张图像。你将在下一个示例中看到这一点。
使用光照效果制作徽章
我使用了蒙版与涂色制作徽章技术中的图像,把它们应用到一张纯灰色画布图像上,从而快速生成一张“已蒙版的光照效果”图像。实际上我也同样可以轻松地用另一种蒙版风格(涂色与蒙版制作徽章)来实现。然后我把这张单一的蒙版图像应用到缩略图上,重现出想要的结果。
# 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
其实我相当喜欢这种蒙版形式,因为蒙版图像本身看起来几乎和你想要的最终图像一模一样,只是少了颜色。也就是说,光照蒙版正是这样创建出来的:只需把效果应用到一张完美的灰色图像上,就能得到一张“光照蒙版”图像。只需记住,用这种特定技术时,半透明阴影必须是纯黑色才能正常工作。对于任何不包含至少部分原始图像的像素,都不能使用灰色。所有透明和半透明区域都必须是带有适当透明度级别的纯白或纯黑颜色。为什么只用一张图像就够了? 之前我们需要两张图像!答案在于,蒙版图像只能局限于添加纯黑或纯白的颜色明暗。这样一来,明暗(光照)效果及其蒙版,本质上就被合并进了这张“光照效果蒙版”的颜色分量里。其结果是,透明度通道被释放出来,用来保存最终图像原本单独存在的透明度蒙版。不过这种做法的局限在于,你只能给图像添加白色和黑色的明暗。比如你无法给被蒙版处理的图像添加灰色。但要注意的是,在某个色彩空间中,以有限的方式添加一些原色和间色的色调是可能的,只是我从未见过有人这样用。总而言之,你无法给图像添加特定的颜色或花式边框,只能添加明暗与阴影、高光与光斑,或简单的黑白文字。不过你不应该尝试把添加的白色和黑色效果混合或重叠,因为两者之间产生的灰色抗锯齿像素,会呈现出底层图像的一种明暗颜色,而不是预期的灰色。这就是这项技术的缺点所在!
用扭曲效果做蒙版...
更令人惊讶的是,由于明暗颜色只是一张灰度图像,你可以把光照效果压缩到仅一个颜色通道加透明度通道蒙版中。这样一来,就能释放出另外两个颜色通道,用于其他图像处理效果!也就是说,你可以把其他内容存进这张单一的“蒙版图像”里。具体来说,你可以把扭曲效果也添加进同一张蒙版图像!关于这方面的更多信息,参见统一扭曲图像,那里正是这样做的。可以说是一种终极蒙版图像。
使用边缘图像加框
给图像添加复杂边框的一种常见方法,是使用预先制作好的加框图像,做出如示例(右图)所示的边框。不过生成边框时也需要小心。如果仔细看给出的这个例子,会发现它其实并不完全正确。生成的边框明暗其实是错的。对于典型的左上方光源,左边和下边的边框应当互换才能生成明暗正确的边框。因此,在我们开始之前,我想强调一点:给缩略图或照片加框时,每条边都要使用正确的图像,或经过正确修改的图像,这一点非常重要。这一点很容易出错,所以自认为做对之后也要再三检查结果。
边框边缘图像
可以用来给图像加框的图像有许多种类型。举例来说,这里有一款“细黑金边”边框,是根据 Michael Slate
这里有两张图像,提供两种不同的光照效果,一种用于上边和左边,另一种用于下边和右边。不过图像沿长度方向的颜色并没有变化。因此,你既可以把这个边框平铺,也可以拉伸它,以得到所需的长度。类似的一套边框素材是这款“细致华丽金色”可平铺边框图像。
由于这些图像带有一些精细细节,你不能简单地把图像拉伸到想要的长度。你也不能直接对这些素材做矩形旋转来生成另一边的素材,因为那样会让精细细节的明暗方向出错。不过对角转置扭曲应该能为另一边得到正确的明暗方向。检查结果时建议格外小心,确保图像四条边上整体明暗和精细细节明暗都正确无误。最后,加框图像有时也可以只由单张图像构成,用它就能生成所有边框边缘,比如这款“竹子”平铺边框图像。
之所以只需要一张图像,是因为这种边框没有特定的“内侧”或“外侧”。不过这种边框同时具备整体和精细细节两个层面的光照效果,因此在为其他缺失的边缘旋转/翻转/转置图像时,仍需谨慎处理。这种边框更大的问题在于,如果只是简单地平铺,宏观细节会变得非常规律,因此你可能需要随机化平铺偏移量,甚至随机化拼接片段的长度,才能让它看起来更自然。稍后会详细说明。可以看到,加框图像有多种多样的风格,在生成缺失的其他边缘图像时,必须小心以正确的方式处理所选的边框图像(相对于光照图像而言)。
加长边框素材
现在,无论使用哪种加框图像,我们都需要制作出更长的素材,以覆盖图像各维度的长度。要做到这一点,基本方法只有两种。你可以简单地用调整尺寸(不保持长宽比)来拉伸边框图像,从而得到正确的长度。这对上面展示的第一套没有内部细节的素材有效,但对呈现的其他任何加框图像都不合适。基本上,这会扭曲内部细节,可能会分散对最终图像观感的注意力。不过另一种加长方法——平铺,则可以用于任何带有重复图案或细节的加框图像,上面展示的所有图像都属于这种情况。如果你要自己制作加框素材,请务必小心让平铺块正确对齐,并且要对齐到像素边界,以确保加框图像中颜色统一,细节循环恰当。如果没做到这一点,平铺块之间就可能出现人工痕迹明显的接缝,因图块的重复而变得显眼。现实世界中的画框工匠在把素材拼接成更长的部件时,也会遇到同样的问题。基本上,很容易得到两种不同色调的木材,或差异很大的木纹图案,把它们“燕尾榫”拼接起来时,接缝就会非常显眼。所以说,这个问题你并不孤单。“竹子”加框图像需要平铺处理。不过由于细节局限在图像的一小块区域内,你可以得到一些有趣的随机平铺效果,可能需要一定程度随机的加长和缩短来去除瑕疵。这里我不会深入讨论,留给有兴趣的读者作为练习。就我们的示例而言,由于这种方法几乎适用于所有加框图像,我将使用一种简单的固定平铺方法来生成所需的更长边缘长度。
过于简单的 append 拼接
我们可以简单地把上面那种“竹子”边框平铺到正确的长度,再把图像拼接(append)在一起,从而加长它。平铺是通过专门的平铺画布图像生成器“[tile:](canvas.html#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
![]()
请注意,上面两个示例中使用的尺寸,是根据加框图像已知的宽度(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
![]()
这种加框方法对这种特定类型的边缘图像来说还算不错,不过对其他类型的边框,效果可能会显得非常滑稽。基本上转角是不正确的,而对大多数边框来说,你会希望像真正的画框一样,让边缘图像以 45 度角接缝的方式相接。一种解决办法是手工预先生成合适的转角图像,然后叠加到这张图像上使其正确。这种做法对简单的可拉伸加框图像(比如“细黑”加框图像)效果不错,但对像“竹子”这样的可平铺图像就会失败得很惨,因为转角图像很可能无法与平铺图像妥善契合。更好的办法是直接从平铺的边缘图像生成转角接缝。后面我会展示这样做的方法。
扩展叠加式加框
此外,通过把边框延伸到超出原始图像边界的范围,还可以让这种边缘加框的效果看起来更好。这种做法常见于“Home-Sweet-Home”类型的图片。要做到这一点,首先需要把原始图像放大,留出大量额外空间,供更长的边框素材叠加进去。
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
请注意,这种加框方式的度量和定位并不简单,可以像我在上面的例子中硬编码的那样,做一些随机化处理。此外,通过为边框长度的两端做适当的额外明暗处理来倒圆角,还可以进一步改善观感。以这种方式给图像加框的一个好得多的方法,是把加框图像作为一个完整整体生成,然后直接叠加到固定尺寸的图像上(参见简单边框叠加)。不过这样做意味着你就不能再对每段边框素材的长度和位置做轻微的随机化处理了。
45 度转角接缝
更好的解决方案是设法以某种方式,把边框图像添加到缩略图周围,使边框每个转角处真正形成 45 度接缝。这并不容易,我尝试了许多绘图和蒙版方法,直到重新发现了一个名为框架,3D 风格边框的神奇运算符。 于是解决方案变得简单了。读入图像,对其执行“[-frame](https://imagemagick.org/command-line-options/#frame)”操作,生成一份指明要加框区域的模板。 |
magick thumbnail.gif -alpha set -bordercolor none \
-compose Dst_Out -frame 15x15+15 frame_template.gif
![]()
现在请注意,这份模板有几个有趣的特点。首先,中间部分是透明的,主图像将放置在这里。其次,它恰好只有四种不同的颜色,用来定义我们想要放置边框图像的每个区域。它不会在转角处生成颜色各异的“抗锯齿”像素。请注意,为了简化处理,这些区域的宽度(15 像素)就是我们要添加到图像上的边框素材的宽度。如果竖直边缘的厚度与水平边缘不同,这种技术就不太好用了。事实上,在这种情况下,几乎没有什么方法能有效运作。这张图像就是加框模板,通过使用颜色填充图元,把每一段边框素材平铺进四个不同颜色的区域,我们就能非常简单轻松地得到 45 度转角接缝。举例来说... |
magick frame_template.gif \
-tile blackthin_top.gif -draw 'color 1,0 floodfill' \
frame_top_filled.gif
![]()
对另外三条边你可以重复这个过程。使用转置以确保内部细节的高光和阴影方向保持正确。 |
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 论坛的一个讨论帖 45 degree frame joints 中,找到了一个更简单的解决方案,即预先把下边缘旋转好。下面是使用内存寄存器保存中间图像的完整示例。 |
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
![]()
可以看到,我们仍然有一个问题,由于平铺产生的对角镜像效果,左上角和右下角看起来非常不自然。要解决这个问题,我们需要添加一个随机化的“[-tile-offset](https://imagemagick.org/command-line-options/#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
这样一来,我们就得到了一张带有随机化平铺偏移量、完美呈现 45 度转角接缝的加框图像。是的,这是一个复杂的示例。不过这样做是为了能使用内存平铺图像,从而在一条命令中就把加框图像预处理完毕。这让操作变得更复杂,但也更为通用。上面的代码已经写成了一个 shell 脚本,你可以下载("[frame_edges.tar.gz](../static/img/scripts/frame_edges.tar.gz)",来自 IM Example Scripts 目录)。这个 tar 文件包含该脚本以及一套边框图像,脚本知道如何处理和使用这些图像。它还会在边框与图像本体之间添加一道“纸板”边框。
未来示例
使用带有匹配转角素材的平铺边缘。边缘图像需要与预先制作的转角素材相匹配,同时还要在图像固定长度上整齐地平铺。这意味着整个平铺边缘可能需要做一些拉伸或压缩,以便让边缘平铺块与转角素材对齐。要正常工作,边缘平铺块必须在图像最短的边上至少重复 3 到 4 次。这种平铺边缘/转角类型的一个例子,就是“树叶”或“fleur”效果边框的实现。
![[IM Text]](../static/img/images/autumn_leaves.png)
![[IM Text]](../static/img/images/badge_overlay.png)
![[IM Text]](../static/img/images/badge_mask.png)
![[IM Text]](../static/img/images/badge_shading.png)
![[IM Image]](../static/img/images/blackthin_top.gif)
![[IM Image]](../static/img/images/blackthin_btm.gif)
![[IM Image]](../static/img/images/goldthin_top.png)
![[IM Image]](../static/img/images/goldthin_btm.png)
![[IM Image]](../static/img/images/bamboo.gif)