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 图像
许多示例使用如本段文字右侧所示的 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:
上面示例中所显示的图像,是用 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 Fonts 或 1001 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 命令。你们乐于分享自己发现的意愿与坦诚,都值得称赞。
那么,「闲话少说」,让我们去看一些示例吧。
![[IM Output]](../static/img/images/test.png)
![[IM Output]](../static/img/test_undertile.jpg)