本文最后更新于:2025年6月12日 下午
mageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。ImageMagick的大多数功能的使用都来源于命令行工具。本书将详细介绍ImageMagick命令行的使用方法。
简介
ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
功能
- 将图片从一个格式转换到另一个格式,包括直接转换成图标。
- 改变尺寸、旋转、锐化(sharpen)、减色、图片特效
- 缩略图片的合成图( a montage of image thumbnails)
- 适于web的背景透明的图片
- 将一组图片作成gif动画,直接convert
- 将几张图片作成一张组合图片,montage
- 在一个图片上写字或画图形,带文字阴影和边框渲染。
- 给图片加边框或框架
- 取得一些图片的特性信息
10,几乎包括了gimp可以作到的常规插件功能。甚至包括各种曲线参数的渲染功能。只是那命令的写法,够复杂。
安装
1 |
|
查看版本:
1 |
|
对于 7+ 的 imagemagick 工具:
1 |
|
命令结构
ImageMagick 的命令行由下面这些元素构成:
- 一个,或多个文件名。
- 零个,一个,或多个图像设置项。
- 零个,一个,或多个图像操作项。
- 零个,一个,或多个图像序列操作项。
- 零个,一个,或多个图像组。
- 零个,或一个图像输出名(convert, composite, montage, compare, import, conjure,这些需要)。
输入文件名
ImageMagick 扩展了“输入文件名”它原本的含义,现在它包括了:
文件名通配符
在 Unix shell 环境下,有一些特殊的字符是作为通配符使用的,如 *
和 ?
。ImageMagick 在各个平台上都支持文件名通配符。假如你想把某目录下的 1.jpg,2.jpg,3,jpg,4.jpg 和 5.jpg 这些文件转成一个 GIF 动画,那么你可以使用这条命令方便地引用所有的 JPEG 文件:
1 |
|
明确的图片格式
图像的数据,都是以一种确定的格式存储的,比如常见的 JPEG,PNG,TIFF 等。ImageMagick 在读取,解析图片之前,必须要知道图片的格式。
多数图像格式,在文件中都设有一些标识来表明它属于哪种格式。如果没有,ImageMagick 会根据文件的扩展名来判断。如 image.jpg 会告诉 ImageMagick 这是一张 JPEG 格式的图片。某些情况下,ImageMagick 不知道图片的格式,那么这时就需要手动指定了。如,我们有一张名为 image,存储了 RGB 三原色位深原始信息的图片(未经过任何压缩的位图),ImageMagick 当然无法自己得知它是什么格式的图片,所以,这时就需要我们明确指定图片格式。
1 |
|
内置图像或图案
ImageMagick 有许多内置的图像和图案,要使用 checkerboard 中的图案:
1 |
|
标准输入输出
Unix 和 Windows 都支持通过管道来重定向输入输出。ImageMagick 支持从标准的输入输出流中读写图像数据,由依次使用一个虚文件名 ‑ 来实现。下面的例子把 convert 的输出通过管道重定向到了 display。
1 |
|
(logo:理解成是一个内置的图像,logo 这种特殊类型。)
第二个用于确定图像格式的 gif:是可选的,因为 GIF 这种格式有自己的标识,ImageMagick 认识它。convert 同样能以这种方式接受标准输入:
1 |
|
其它的一些管道,你可以通过它们的文件描述符来访问。文件描述符0,1。2已经被预定义为标准输入,标准输出,错误输出。如果一个管道被指定为文件描述符 N,那么你可以通过 fd:N 来使用它。下一个例子展示了如何通过管道重定向,把文件描述符3,4的数据添加到文件描述符5中。
1 |
|
ImageMagick 6.4.9-3 中才添加了对文件描述符的支持。
对于 Python,你可以通过调用 File 对象的 fileno() 方法来获取文件描述符。
在需要的时候,你也可以为文件描述符指定具体的图像格式:
1 |
|
一张图片中的某些帧
某些图片格式可以包括有多个图像帧。你可以只获取第一帧, 最后一帧, 或中间的某些帧。为此,你可以在文件名之后,以方括号括起来的形式指定帧。下面的例子中,对于一个有多帧的 GIF 图片,我们只取其第一帧。
1 |
|
在 Unix shell 的环境下,一般中括号是会被转义的,所以,我们需要使用单引号把文件名引起来。Windows 的命令行环境下不用单引号也可以,但多写一对单引号并不会有什么问题。另外,对于单引号和双引号的作用,在 Unix 和 Windows 这两个平台上,常常是相反的,所以,如果你使用 Windows,那么请注意将我们例子中的单引号改为双引号。
你也可以一次获取多帧,在方括号中标出一个范围即可,如下面的例子,我们获取了前四帧的图像:
1 |
|
最后,你可以一次获取非连接的多帧。下面的命令以3,2,4的顺序获取图像:
1 |
|
注意上面的最后两个命令,输出被写入了一个类型为 MNG 的文件当中。因为 MNG 支持保存多帧图像,而如 JPG 之类的格式只是保存单帧的图像。在下面“图像输出名”一节我们还会介绍这方面的内容。
一张图片中的部分区域
最原始的位图图像,就是一个表示出各像素点颜色的序列,它的文件中没有任何的其它像宽、高,格式标识等附加信息。对于这类原始的图像数据,在处理时我们必须明确指定图像的宽和高,或者给出一个范围。在下面的例子中,我们要处理的图片是一个8位的 RGB 位图,宽是 6000,高为 4000,而我们只需要获取一块中心附近 600×400 的图像信息。
1 |
|
使用 ‑extract 选项也可以实现相同的功能:
1 |
|
缩放了的内嵌图像
读入一些图片的同时,重新定义它们的尺寸是很方便的。假设你有很多的大的 JPEG 图片需要转换成一组 PNG 格式的缩略图:
1 |
|
这里,所以的图片都会被读入并且分别被重定义大小。在读入的同时定义尺寸在效率上更好,同时资源占用也更少:
1 |
|
裁切了的内嵌图像
1 |
|
1 |
|
文件名引用
靠一个另外的文件名,来表示实际要读取的图像文件名,实现这个功能有两种方法,第一种方法是使用 @ 这个符号,来指定一个文件,这个文件中包含有实际需要读取的图像文件名,如一个名为 myimages.txt 的文本文件中有如下内容:
1 |
|
下面的命令,ImageMagick 就会读入 frame001.jpg,frame002.jpg,frame003.jpg。
1 |
|
另一种方法,是在文件名中使用格式化字符串,然后在后面的方括号中指定一个范围。看下面的例子:
1 |
|
ImageMagick 实际上会去读取如下的图像:
1 |
|
图像设置
命令行中的一个设置项,可以作用于读入的图像,图像操作,或者将会被输出的图像。一个设置项被设置后会一直发挥作用除非它被重置或命令执行完毕。图像设置命令包括有:
1 |
|
图像操作
图像操作项与图像设置项不同,它只作用于紧接着存在的一个图像,仅仅是这一个图像,之后,图像操作项就会失效。
在这里, 我们说明一下。命令行参数有三种,前面讲过的图像设置项,这里的图像操作项,以及后面会讲到的序列操作项。
图像操作项包括下面这些。
1 |
|
下面例子,‑negate 这项只对 wand 有效,对 wizard 是无效的(但是,如果把它放在 wizard后的话,则会作用于这两张图)。
1 |
|
图像序列操作项
一个图像序列操作项,只作用于紧接着存在的一个图像序列,它们是。
1 |
|
图像定位
许多命令行选项都有一个 geometry 参数,用于指定图像的宽,高等信息。因为图像的坐标系,尺寸,位置等信息是我们经常会用到的,所以为了方便,geometry 这个参数可以用不同的格式给出。关于这点,接下来我们会详细地介绍。
一些命令行选项可接受如下多种格式的 geometry 参数。请记住, 它们处理具体参数时的效果是不同的,详细的内容可查阅它们各个的说明文档。
1 |
|
geometry 参数可以使用下表列出的多种格式指定,在表后我们会讨论更多的细节。最常用的一种格式是 size[offset],意为 size 是必须给出的,而 offset 则是可选的。不过,有时 [size]offset 也行。同时要注意, geometry 这个参数中,绝不允许出现空格符。
size 的形式 | 大概的说明(实际效果对于不同的选项可能差别较大) |
---|---|
scale% | 宽和高同时根据指定的百分比缩放 |
scale‑x%scale‑y% | 宽和高根据指定的百分比分别缩放 |
width | 指定宽度, 高度根据原尺寸比例自动确定 |
width x height | 指定最大的宽度和高度, 图像宽高原比例保存不变(注意没空格, 下同) |
width x height^ | 指定最小的宽度和高度, 宽高原比例不变 |
width x height! | 指定宽度和高度, 忽略原始比例 |
width x height> | 和 width x height 一样, 但只对比这个尺寸大的图像有作用 |
width x height< | 和 width x height 一样, 但只对比这个尺寸小的图像有作用 |
area@ | 等比例缩放图像, 使其总像素值不大于 area. |
(对于一张 1:1 的图, 若设置为121@, 则结果正好是 11x11.) |
注意,上面结尾的修辞字符是可以组合使用的。
{size}{offset} | 指定 offset 偏移(默认是 +0+0). |
---|---|
{size} 的格式见前一个表格. | |
{+‑}x{+‑}y | 指定水平和垂直的偏移, 以像素为单位, 两者必须同时指定 |
偏移量对 ‑gravity 设置项有效, 对其它的带 % 或另外的 size 操作无效. |
对宽和高的基本设置
下面展示了一些简单的例子,用以说明如何给出 ‑resize 的 geometry 参数。我们将使用内置的 logo:这张图作为我们的“输入图像”。logo:这张原始图片宽为640像素,高480像素,记为 640×480。就像你看到的,宽总在高的前面。这条规则同样适用于我们可能会讲到的“坐标”或“偏移”。
1 |
|
忽略宽或高的表示方法
看一些例子:
1 |
|
请注意引号的使用。上面的例子,包括后面的例子中,我们都使用引号把 geometry 引起来了的。很多时候,这样做不是必须的,但当你使用了 <
和 >
; 的时候, 就一定要使用引号,否则这两个符号会被当成命令行的重定向操作处理。另外,在 Windows 平台上,^
也必须使用引号。所以,为了安全起见,我们最好养成对于 geometry 总是使用引号的习惯。
图像定位中的偏移
我们通过一些例子来说明 geometry 参数中的 offsets。使用它的一个典型情形是在 ‑region 这个选项中。‑region 跟在一些其它的命令后,用于指定一块矩形区域。所以,你除了需要指定这个矩形区域的宽和高,还需要指定它的一个起始点(左上角的点)。下面的第一个例子中,我们指定了一个 100×200 的区域,位置在 x=10,y=20,或者我们应该写成 (x,y) = (10,20)。
1 |
|
注意,offsets 必须带上 +/‑。它表示的是一个相对偏移,而不是一个绝对坐标。offsets 的参照点不是固定的,但默认情况下,它是 (0,0),即左上角,上面的第一个例子就是这种情况。
offsets 有可能“出界”,就像第二个例子中的那样, -10+20,对于这个有一部分出界的矩形执行 ‑negate,实际的效果也就相当于 90×200+0+20。
第三个例子中,一来就使用了 ‑gravity 选项,它把当前坐标原点(或叫参照原点)设置为图像的正中,即 (320,240) 的位置,因为这张图的尺寸是 640×480。这意味着后面的 offsets 的实际效果与前面两例就有所不同,变成了 (320-10, 240+20) = (310,260)。 同时 100×200 也不再是根据左上角来计算,而是根据中心点计算。即以 (310,260) 为中心的一个 100×200 的矩形。显然,它的左上角在 (310-50,260-100) = (260,160)。
图像组
在学校时,老师肯定有教过你,在把结果直接写在答题卷上前,或许你应该先在草稿上演算一番。这里我们谈的“图像组”大概就是这个草稿纸的意思。它让你在一个隔离的组中处理一张图像或一个图像序列,处理完后,把结果返回到正常流程中。图像组用一对括号标示,里面的所有操作只对当前组有效。如下例,我们限制 ‑rotate 操作只对 wizard.gif 有效:
1 |
|
特别注意,在 Unix 平台下,用于图像组的括号是需要使用 \
转义的,因为小括号在 shell 中有其它的特殊作用。但是,Windows 平台下的小括号不需要转义。另外,在小括号内的两侧,都有一个空格, 请留意。
前面我们已经谈到了一些命令行中的操作项,不过,下面这几个操作项对于处理一个图像组是比较常用的:
1 |
|
上面几个操作项的参数,都是一个索引值,用以表示在图像组中的某个图像。图像组中的第一个图像的索引值是 0。同时,这个索引值你也可以使用负数,-1 就是图像组中的最后一个图像。
图像输出名
ImageMagick 扩展了原来的“输出文件名”的概念,在 ImageMagick 中,一个图像输出可以是:
- 一种明确的图像格式。
- 输出到系统的标准输出。
- 文件名引用。
明确的图像格式
图像信息都是以某种即定的格式存储起来的,这些格式包括我们熟悉的 JPEG,PNG,TIFF 等。ImageMagick 在写出某个图像时,必须知道应该使用哪一种格式写出。通常情况下,ImageMagick 可以根据扩展名来判断格式,如,对于 image.jpg ImageMagick 会以 JPEG 格式来写出。某些情况下没有给出图像的格式信息,而你又没有明确指定,这时,ImageMagick 会以图像原来的格式写出。比如,我们希望把图像存为名为 image 的原始 RGB 位图:
1 |
|
标准输出
Unix 支持通过管道在各个程序间重定向输入输出。ImageMagick 可以使用一个特殊的文件名 ‑ 来实现管道间的重定向操作。下面的例子中,我们把 convert 的输出重定向到 display 中:
1 |
|
这里,你不一定要明确指定图像格式,GIF 这种格式有它自己的标示,ImageMagick 可以自动正确地识别出。
文件名引用
另外还有一种输出方式,是使用格式化字符串来输出多个图像。假如我们把输出图像名写成 image‑%d.jpg ,同时我们的图像序列中有 3 个图像,那么会得到如下的多个输出结果:
1 |
|
还有一种情况,假如你希望用图像的某些属性来作为其文件名的一部分,那么可以这样:
1 |
|
其结果是:
1 |
|
参考资料
- https://www.w3cschool.cn/imagemagick_use/
- https://dev.to/longlikun/shi-yong-imagemagick-ming-ling-xing-gong-ju-chu-li-tu-xiang-zhi-nan-kd
文章链接:
https://www.zywvvd.com/notes/tools/imagemagic/imagemagic-tutorial/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信支付

支付宝支付