Image Magick

Table of Contents

1. Image Magick 简介

Image Magick 是一个强大的图像处理工具包。它提供了几个非常方便的命令行命令: display, animate, import, montage, mogrify, identify 等,可以进行图像的显示,缩放,旋转, 调色,加框,加注释等,还能制作 GIF 动画,图像索引,能自动生成图像。

Image Magick 非常强大,如图 1 所示图片可以由下面一条命令生成:

$ magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
  -draw 'roundrectangle 264, 5, 304, 85  20,40' -tile gradient:chartreuse-green \
  -draw 'roundrectangle 16,  5, 180, 85  20,40' -tile gradient:chartreuse1-chartreuse3 \
  -draw 'roundrectangle 140, 5, 180, 85  20,40' +tile -fill none \
  -draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
  -strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
  -append -background white -gravity center -extent 320x200 image_magick_cylinder_shaded.png

image_magick_cylinder_shaded.png

Figure 1: Cylinder Shaded

参考:
Official Website: https://www.imagemagick.org/
Examples of ImageMagick Usage: http://www.imagemagick.org/Usage/

1.1. 安装

Ubuntu 系统中可以这样安装 Image Magick:

$ sudo apt-get install imagemagick

MacOS 系统中可以这样安装 Image Magick:

$ brew install imagemagick

1.2. Image Magick 工具集

Image Magick 包含的工具集如表 1 所示。

Table 1: Image Magick 包含的工具集
Image Magick 工具 说明
convert 转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。
identify 描述一个或较多图像文件的格式和特性。
mogrify 按规定尺寸制作一个图像,模糊,裁剪,抖动等。和 convert 不同,mogrify 会直接覆盖原图片文件。
composite 根据一个图片或多个图片组合生成图片。
montage 创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。
compare 在算术上和视觉上评估不同的图片及其它的改造图片。
display 如果你拥有一个 X server 的系统,它可以按次序的显示图片
animate 利用 X server 显示动画图片
import 在 X server 或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。
conjure 解释执行 MSL (Magick Scripting Language) 写的脚本。

上面这种命令可以直接执行,也可以作为 magick 的子命令来执行。如 convertmagick convert 是一样的。

2. convert

2.1. 转换图像的格式

转换命令对一幅图像执行某项操作,并将其以你指定的名字保存。你能使用它完成的一个最基本的事情是转换你的图像到各种其他的格式。下面的命令将当前目录下的一个叫 “howtogeek.png” 的文件转换为对应的 jpeg 格式文件。

$ convert howtogeek.png howtogeek.jpg

你还可以指定 jpeg 格式图像的压缩级别:

$ convert howtogeek.png -quality 95 howtogeek.jpg

-quality 参数值必须在 1 到 100 之间。在没有指定的情况下,Image Magick 使用原始图像的质量等级(quality level),否则的话 Image Magick 取 92 作为其默认值。

2.2. 缩放图像

转换命令还可以便捷地调整一幅图像的大小。下面的命令将一幅图像调整为 200 像素宽,100 像素高:

$ convert example.png -resize 200x100 example.png

在这个命令里面,我们对输入和输出使用了相同的文件名,这样 Image Magick 将会覆盖掉原始文件。

在使用这个命令的时候,Image Magick 会尽量保持图像的纵横比。它将会调整图像以适应 200x100 的区域,这样图像就不是恰好 200x100 了。如果你想要强制把图像设置为指定的大小——即使这样做会改变图像的纵横比的话——那么在尺寸参数后面加一个感叹号就可以了,如:

$ convert example.png -resize '200x100!' example.png

你还可以只指定特定的宽度或者高度,Image Magick 会在保持纵横比的情况下进行缩放。下面的命令将把一幅图像的宽度缩放为 200 像素宽:

$ convert example.png -resize 200 example.png

下面的命令会把一幅图像缩放为 100 像素高:

$ convert example.png -resize x100 example.png

下面是把当前目录下所有 .tif 文件统一为相同的 DPI 和 size,保存到 resized 子目录中:

$ mogrify -path resized/ -density 300 -units PixelsPerInch -resize '2600x3200!' -compress lzw *.tif

2.3. 扩展画布大小

使用参数 -extent 可以扩展画布大小,下面命令将把 input.jpg 的画布大小扩展为 2000x1000,并且原图片居中( -gravity center )放在画布上(注:不会缩放原图片):

$ convert input.jpg -gravity center -extent 2000x1000 output.jpg

2.4. 旋转图像

Image Magick 能够快速地旋转图像。下面的命令将一幅叫做“howtogeek.jpg”的图像旋转 90 度(顺时针方向),并将旋转后的图像保存为“howtogeek-rotated.jpg”:

$ convert howtogeek.jpg -rotate 90 howtogeek-rotated.jpg

如果旋转角度不是 90/180/270/360,则旋转后的图像显然不再是矩形,这时 Image Magick 把它适应为最小矩形后,会把那些补充的像素填充为黑色。当然,我们通过参数 -background 来指定所填充像素的颜色,如指定为白色(因为图片背景往往为白色):

$ convert koala.gif -background white -rotate 3 rotate_3.png

2.4.1. 旋转时不改变宽和高

如果希望旋转后图片的宽和高不变,则可以使用 -distort ScaleRotateTranslate 或者简写为 -distort SRT 。如旋转 10 度(顺时针方向):

$ convert koala.gif -distort SRT 10 rotate_10.png         # 旋转后图片宽和高不变

参考:http://www.imagemagick.org/script/command-line-options.php?#distort

2.5. 裁剪图像

使用 -crop 参数是从一个图片中截取一个指定区域的子图片。它的使用说明如下:

convert -crop widthxheight+x+y 原始图片 目标图片

例如,在图片 src.jpg 中从坐标 (20, 10) (距离左侧 20 像素,顶部 10 像素)开始,裁剪出大小为“300x400”(如果宽度、高度不够则取实际值)的图片保存到 dest.jpg 中:

convert -crop 300x400+20+10 src.jpg dest.jpg

也可以从“中心位置”(指定 -gravity center )开始裁剪图片,如:

$ convert src.jpg -gravity center -crop 300x400+0+0 dest.jpg

也可以从“右下角”(指定 -gravity southeast )开始裁剪图片,如距离右侧 20 个像素,底部 10 个像素:

$ convert src.jpg -gravity southeast -crop 300x400+20+10 dest.jpg

裁剪时除了可以指定像素外,还可以指定“百分比”,如分别去掉顶部、底部 10% 的像素(留下 80%):

$ convert src.jpg -gravity center -crop 100%x80%+0+0 dest.jpg

2.6. 填充矩形

下面的命令可以把图片 koala.gif 中起始坐标为 (0, 0) ,宽和高为 10 和 50 的矩形填充为蓝色:

$ convert koala.gif -fill blue -draw "rectangle 0,0,10,50" out.gif

2.7. deskew(修正倾斜)

指定参数 -deskew threshold 可以自动修正倾斜图片,阈值设置为 40% 可以适应大部分的场景。

2 为原图片(来源于 http://www.fmwconcepts.com/imagemagick/textdeskew/index.php)。

image_magick_deskew_orig.jpg

Figure 2: 原图片

对原图进行下面修正倾斜处理:

$ convert input.jpg -deskew 40% output.jpg

将得到图 3 所示图片。

image_magick_deskew_out.jpg

Figure 3: 使用 -deskew 40% 处理后的图片(边缘填充白色)

2.7.1. 处理边缘填充颜色

修正倾斜时,边缘会自动填充白色。也可以通过 -background 选项填充为其它颜色,如灰色:

$ convert input.jpg -background gray -deskew 40% output.jpg

将得到图 4 所示图片。

image_magick_deskew_out_gray.jpg

Figure 4: 修正倾斜时指定背景为灰色

显然,这种灰色和周边的颜色不是很协调。怎么办?我们可以分两步来让填充颜色变得和周边颜色协调。
第一步,得到倾斜的角度(仅得到倾斜角度,不旋转):

$ angle=`convert input.jpg  -deskew 40% -format "%[deskew:angle]" info:`
$ echo $angle
-2.0134754953909954622

第二步,用上面得到的角度,使用 -distort SRT 旋转图片(参考节 2.4.1):

$ convert input.jpg -distort SRT $angle out.jpg        # angle 是上一步找到的倾斜角度

处理后,得到的图片如 5 图所示,显然,边缘填充颜色变得自然了很多。

image_magick_deskew_auto_bg.jpg

Figure 5: 用 -distort SRT 旋转指定角度

2.8. 转为灰度格式

使用选项 -colorspace Gray 可以把图片转为灰度格式。如:

$ convert source.png -colorspace Gray destination.png
$ mogrify -colorspace Gray source.png                  # 同上,不过它是“原地修改”

2.9. 制作 gif 动画

使用下面命令可以把当前文件夹中的所有 gif 文件转化为一个 gif 动画 animacted.gif:

$ convert -delay 100 *.gif -loop 0 animacted.gif        # 每帧间隔为1s,重复播放

其中,选项 -delay n 表示每帧间隔为 n*10 毫秒,前面的是指定 100,意味着每帧间隔为 1s。 -loop 0 表示不断地重复播放。

参考:http://www.imagemagick.org/Usage/anim_basics/

Author: cig01

Created: <2019-12-21 Sat>

Last updated: <2020-05-24 Sun>

Creator: Emacs 27.1 (Org mode 9.4)