⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://usage.imagemagick.org/index.html)

ImageMagick 使用示例

ImageMagick 版本 7

这些页面汇集了从命令行使用 ImageMagick(简称「IM」)版本 7 的示例。其中许多写法在旧版的 版本 6 上也有直接对应的用法。同时也展示了通过 ImageMagick 应用程序编程接口(API)能做些什么。我们希望它能在你读完简明的 命令行(CLI)选项手册 之后,成为 IM 用户最先访问的页面。

在网络上,「怎样才能……?」这样相同的问题被反复提出。我们希望这些页面能解答大多数常见的「操作指南」类疑问。

相关站点:Fred's ImageMagick Scripts / RubbleWebs(从 PHP 使用 IM CLI) / Snibgo's ImageMagick pages / ImageMagick 官方网站

ℹ️ 本页面是 usage.imagemagick.org(Anthony Thyssen 先生所著的 IM Examples)的非官方翻译。ImageMagick 本体文档的中文翻译请参阅 ImageMagick 日语文档

实用示例(Practical Examples)

基本用法
基本命令与图像处理
图像文件的处理
图像的读取与写出
主要图像格式
GIF、JPEG、PNG 图像的处理
从文本到图像
将文本转换为图像
复合字体效果
字体渲染的样式与技法
图像注释
添加标签与图像叠加
缩略图与加边框
大照片的小型参考图
照片处理
对照片进行加工
镜头校正
校正照片的畸变
蒙太奇(排列)
图像的索引与排列
多图像图层
组合多个图像
动画基础
动画的制作与研究
动画优化
缩小 GIF 动画的体积
动画修改
动画的修改与合并
视频的处理
处理实拍视频的图像
图像比较
比较两幅或更多图像
高级技巧
图像的复杂操作
背景示例
生成随机背景的示例
分发仓库
通向其他 IM 脚本与信息的链接
参考索引
特定选项的快速索引
辅助脚本
示例中使用的 Shell 脚本

基本技法(Basic Techniques)

画布的创建
创建画布或背景图像
颜色基础与通道
底层的颜色处理
颜色的修改
常见的颜色修改
蒙版与背景去除
Alpha 通道与透明度的处理
减色与抖动
减少颜色数量
裁剪与镶边
切片、切出、加框、修剪
调整尺寸与缩放
图像的放大与缩小
重采样滤波器
控制图像调整尺寸
图像合成
两幅图像的叠加与合并
图像绘制
矢量图形、MVG・SVG 图像
简单的图像扭曲
翻转、旋转、扭转
图像的畸变变换
就像游乐园的镜子迷宫一样
图像的变形
大幅改变图像的外观
图像映射效果
镜头、玻璃、水波纹的效果
模糊与锐化
模糊、锐化、阴影
形态学(Morphology)
利用像素邻域
卷积
加权平均的邻域处理
傅里叶变换
在频域中修改图像
抗锯齿
抗锯齿的效果与问题
其他
零碎的内容
API・脚本・构建
在其他环境中的使用
在 Windows 上的用法
Windows PC 上的 IM
开发与缺陷
新旧开发提案与缺陷

ImageMagick 使用示例 —— 引言

ImageMagick 是什么(毫不掩饰的概括)

ImageMagick 是为图像的批处理而设计的。也就是说,你可以把图像处理操作组合到脚本(Shell、DOS、Perl、PHP 等)中,应用于大量图像,或作为 Web 应用程序、视频处理工具、全景图生成器等其他工具的子系统来使用。它不是一个 GUI 图像编辑器

ImageMagick 首先是一个图像到图像的转换器。这正是它最初的设计目的。也就是说,它能将几乎任何图像格式(如果有它做不到的,请告诉我们)转换为其他任何图像格式。

但与此同时,它也是一个图像处理算法的库。这些算法既可以从命令行和 Shell/DOS 脚本(这些示例页面所展示的)访问,也可以从 C、C++、Perl、Ruby、PHP 等众多编程语言访问。请参阅 ImageMagick API

速度并不是 IM 的主要特长,它更看重所生成图像的品质。话虽如此,这并不意味着它不能在合理的时间内转换图像,只是说它并不快得令人瞠目而已。因此,尤其是在试图压缩为能力受限的图像格式时,IM 在某些处理上可能会比较耗时。

ImageMagick 主要处理的是呈像素矩形阵列(一般称为「栅格」)形态的图像。它也能处理像 Postscript、PDF 这样的「矢量」图像格式,但代价是在读取时将它们转换为栅格,在保存时围绕栅格生成矢量图像的封装。其结果是,在默认设置下矢量图像往往会被不当处理。不过,借助特定选项可以改善这种情况。请参阅 关于矢量图像格式的一点说明

关于这份 ImageMagick 使用示例

这些页面是我从 1993 年开始写起,并放到几乎同期出现的全新万维网上的 ImageMagick 技巧与窍门集 的发展与延续。关于 IM 许多方面的、这些页面中未收录的信息,那份文档中至今仍有保留。不过,本页面是为了给人阅读而设计的,而那份技巧集只是为了我自己备忘之用。因此在某些地方它可能含糊或杂乱。欢迎你浏览、学习并提出意见。

其他示例则取自或发展自 IM 论坛 上对用户提问的回答,或是作为各种问题解决方案而投来的内容。

我期待收到其他 IM 用户的建议和邮件。这类邮件通常都能促成这些示例页面的改进与扩充。

命令行环境

所有示例都是以在 UNIX、尤其是 GNU/Linux 系统上使用 BASH 脚本为前提编写的。因此,部分示例会用到 Shell 的「for-do」循环。许多示例在行末放置反斜杠「\」,将命令延续到下一行。较长的命令被拆分成多行,以突出所应用的步骤。

不过,只要稍微改变特定字符的处理方式,这些示例也可以从 PC Windows 的批处理脚本中使用。再做少许调整,还可以直接从 PHP 脚本中的「system」调用来执行。

在这些替代环境中使用 ImageMagick 命令的详情,请参阅 在 Windows 上的用法API 与脚本。欢迎投稿与测试示例。

PerlMagick 及其他 API

这些示例应该都能改写成从 Perl、C、C++、Ruby、PHP 等语言使用 IM API 的形式。我建议先在命令行上尝试,确保其正确运行后,再把操作转换到你所使用的特定 API 上。

在 IM 版本 6 中情况有了很大改善,但命令行实际上一次只处理一个图像序列。而 API 没有这个限制,可以单独或一起操作多个图像序列,从而进行更复杂的处理。借助这一能力,用 IM API 实现这些示例会更简单,也不再需要许多命令行示例所需的图像临时文件保存。使用 API 时,你只需将永久或半永久的图像保存到磁盘即可。

基本上,你可以以示例页面为起点,了解 ImageMagick 能做什么,先在命令行上把想做的事组合好,再落实到难以更改的脚本或 API 代码中。

此外,我还建议为 API 代码详尽地添加注释,并尽可能附上你所要做之事的命令行等价写法。这样你就能与使用命令行所得的结果进行核对和比较。这对调试日后可能遇到的问题很有帮助,尤其是在 Core ImageMagick 库的图像处理有所改进之时。

输入图像与结果的下载

我尽可能在 IM 示例命令的输入中使用 IM 内置的图像(如「logo:」或「rose:」等),或用 IM 命令生成输入图像。我也经常在后面的示例中复用前一条命令的输出。因此,要亲自尝试这些示例,通常无需下载「测试」图像。

不过,这类生成图像或内置图像并不总是合适。因此当使用外部图像时,我会在该小节后续的示例中复用其输入图像或前一示例的结果。

有时会显示原始的源图像,而对于较大的图像,则提供指向源图像的链接。更常见的情况是,由于输入众所周知或不言自明,只展示最终的结果图像。

所展示的 IM 示例命令几乎全部都是在其所登载的同一 Web 目录内运行的。也就是说,你看到的命令,正是实际用来生成该图像的命令。因此,只要更改页面的 URL,就能下载或浏览示例所用的输入图像。外部源图像的备份副本也放在「images」和「img_photos」子目录中。也请参阅那些图像的 Fancy Photo Index 示例。

某些示例会生成文本输出或图像信息,它会被保存到文本文件中,并为 Web 页面显示生成对应图像。当你选择文本输出的图像时,将链接到命令实际输出文本的副本。

在所有这些示例中,只要选择输出图像,应该就能下载示例命令实际创建的图像。不过请注意,并非所有浏览器都能理解所使用的全部图像格式。

外部图像的来源

顺便一提,这些示例中使用的源图像大多来自 Anthony's Icon Library,尤其是该库的 背景平铺大型剪贴画 各个分区(我喜欢龙!)。补充:由于网站正逐步迁移到新服务器,这些页面有时可能处于离线状态。

这个库其实比万维网还要早。由于当时缺少在 X Window System 上可用的、优质而干净的图标图像,我在 1991 年创建了它。万维网的出现当然改变了局面,但我原来的库至今仍然存在,虽然不再活跃地增长,但作为图像来源仍可使用。

某些图像,或较大图像的一部分,是各示例的作者贡献的。这类示例的作者会注明在贡献分区或页面末尾。

如果你在寻找特定图像,我建议用 Google 图片搜索(或类似工具)找到合适的。当然,你可以用 IM 为自己的目的转换、调整这些图像的尺寸。不过,如果你打算商用,请注意版权问题。

Web 页面上的 PNG 图像

[IM Output]

许多示例使用如本段文字右侧所示的 PNG 格式图像。PNG 图像格式支持带有半透明像素的图像,这是其他图像格式大多不提供的功能。它也是一种被充分理解的格式,如今大多数图像程序和 Web 浏览器都能使用。

不过,一些 Web 浏览器无法正确处理透明 PNG 图像(尤其是 Microsoft Internet Explorer v6)。因此,我在 Web 上的图像一般使用 JPEG 和 GIF 格式,仅在生成带有半透明像素的图像,或后续示例需要精确颜色时才使用 PNG 格式。

为了让 IE v6 浏览器显示 PNG 图像,我使用了借助复杂 JavaScript 的特殊「样式表」。关于这一点,请参阅 面向 IE 的透明 PNG。从技术上讲,这只是 IE 而非 ImageMagick 的问题。

在屏幕上显示图像

在屏幕上显示图像时,也可能出现显示方面的问题。因此,我建议使用如下命令,在图像下方铺满「checkerboard(棋盘格)」图案,使透明与半透明像素更加醒目。

   magick composite -compose Dst_Over -tile pattern:checkerboard image.png x:

[IM Output]

上面示例中所显示的图像,是用 Shell 脚本生成的特殊 PNG 格式 测试图像。通常,这条命令会把结果输出到你的显示器上,而不是像这样输出到 Web 页面上。

仔细看,会发现透过半透明的颜色能看到棋盘格图案。但整幅图像作为整体却是完全不透明的。因此,这一技法应该能在所有显示器、Web 浏览器和图像查看器上奏效。

从 IM v6.0.2 起,「magick display」程序会自动做类似的事情。不过,使用颜色表的图像(也就是 GIF)似乎不会以这种方式处理。如上所示,使用「x:」输出图像格式,可以不保存图像而直接显示到屏幕上。详情请参阅 显示输出

字体的使用

这些示例所用的字体,来自我多年来找到并为自己保存的一小批 TrueType 字体。其中一部分受版权保护,因此无法在线公开。

不过,欢迎你用手头别的字体来替代。这些示例应该能在你系统上可用的任意合适字体下运行(图像尺寸会略有变化)。Microsoft 的「Arial」字体,或者「Times-BoldItalic」,在大多数系统上都能用。

要查看你所用 IM 版本当前可用的字体,请运行以下命令……

   magick -list font

警告:当找不到所请求的字体时,ImageMagick 以前会悄悄地用默认字体(通常是 Arial 或 Times)替代。现在它仍会这样做,但会发出警告。为确保使用的是你想要的字体而非默认字体,请事先测试字体。

在我的 Linux 系统上,我使用一个特殊的 Perl 脚本「[**imagick_type_gen**](../static/img/scripts/imagick_type_gen)」来生成保存在主目录「.magick」子目录下的「type.xml」文件。ImageMagick 会用这个包含 XML 格式字体列表的文件来查找字体。这个脚本会「locate」并描述系统上所有可用的字体(如果你刚添加了新字体,请先运行「updatedb」)。有了这套设置,你只需指定想用的字体名称,而无需提供特定字体文件的完整路径。

例如……

   # 与其使用下面这条命令……
   magick -font $HOME/lib/font/truetype/favorite/candice.ttf \
           -pointsize 72 label:Anthony  anthony.gif

   # 可以使用更简单的字体标签……
   magick -font Candice -pointsize 72 label:Anthony  anthony.gif

在 IM v6.1.2-3 之前,「type.xml」文件名为「type.mgk」。如果你使用的是更旧的 IM,请留意这一点。

这些 IM 示例所用的字体,列在 示例字体的蒙太奇示例 中。我个人最喜欢的是 Candice,所以它被相当频繁地使用。

如果你喜欢「Candice」字体或我使用的其他字体,可以从 Free Fonts1001 Fonts .com 获取。

示例页面的更新

这些示例页面处于持续改进的循环之中。一般来说,当我的兴趣转向别的事情时,页面的更新可能会长期停滞。

这些示例常常会用 IM 的最新测试版重新构建,以便我能确认每个版本的 IM 在正式发布前可能出现的变更与缺陷。不过,所展示的示例图像,是给定的 IM 命令在我的系统上生成的。如果你得到不同的结果,那么你的 IM 很可能是远为陈旧的版本(含有旧缺陷),或者没有正确安装。

另外,发给我的邮件,以及在 讨论论坛 上关于 ImageMagick 的讨论,通常都会促成向这些示例添加新示例或整个章节。讨论越多,示例就越好。

如果你在用 IM 做一些有趣的事情,请务必分享,把你技法的示例提供给 IM 社区的其他人。IM 应用上一些最了不起的进步,正是源自像你这样的用户。

特别致谢

特别感谢 Cristy。他花了好几个月时间,不知疲倦地投入升级与缺陷修复,并陪我应付那些异想天开的提案……尤其是我关于命令行处理、括号、图像序列运算符、GIF 动画处理的那些大提案。

他出色地完成了把版本 7 打造成现有最佳、最先进的命令行图像处理程序的工作。大多数用户大概不会对此表示感谢,但我确实由衷地赞赏他为 IM 倾注的努力。

也感谢 Gabe Schaffer,他在关于 JPEG 格式与库、仿射矩阵运算符,以及 Magick Vector Graphics 整体的讨论中给了我很大帮助。

还要感谢编写 PNG 编码器模块、并关注减色与抖动的 Glenn Randers-Pehrson。他最先为 IM 添加了「halftone」抖动,我后来修订并扩展了它,在有序抖动设置文件中加入了新的抖动方式。

最后,感谢那些大体潜伏在 IM 用户论坛 中、带着问题、建议和解决方案的庞大人群。其中许多人如今已作为创意与建议的贡献者,名字遍布整个 IM Examples。

也感谢那些在论坛上定期回答问题的人。比如「Bonzo」,以及他详述如何从 PHP 脚本使用 IM 命令的网站 RubbleWebs。还有「scri8e」,以及他关于闪光与星辰处理的网站 Moons Stars。也感谢 Pete「el_supremo」。

特别要向 Fred Weinhaus 致谢。作为图像处理早期就投身其中的研究者,他在 通用图像畸变运算符 的早期实现上给了我很大帮助。Fred 的 ImageMagick 脚本可在 Fred's ImageMagick Site 上看到,它们常常成为未来 IM 新功能的概念验证。

也感谢数字图像处理专家 Nicolas Robidoux。他重做了 椭圆加权平均重采样,大幅改善了 通用图像畸变 的输出。

最后,感谢众多 ImageMagick 用户,他们在论坛和 Web 上允许我向他人展示他们作为某个项目一部分所使用的 IM 命令。你们乐于分享自己发现的意愿与坦诚,都值得称赞。

那么,「闲话少说」,让我们去看一些示例吧。