我们有时候需要批量转换一些照片的格式,或者打包一些不同尺寸的 .ico 图标用于网站图标和软件应用图标。如果我们使用格式转换类工具,可能有时候达不到我们最初的目的。而 ImageMagick 可以帮助我们。
什么是 ImageMagick?
ImageMagick 可以创建、编辑、合成或转换数字图像。它可以读取和写入各种格式(超过 200 种)的图像,包括 PNG、JPEG、GIF、WebP、HEIC、SVG、PDF、DPX、EXR 和 TIFF。ImageMagick 可以调整大小、翻转、镜像、旋转、扭曲、剪切和变换图像,调整图像颜色,应用各种特殊效果,或绘制文本、线条、多边形、椭圆和贝塞尔曲线。
ImageMagick 广泛应用于 Linux、Windows、Mac Os X、iOS、Android 等。例如 PHP 就内置了 ImageMagick 模块,你可以选择性的进行安装和使用。
安装 ImageMagick
前往 ImageMagick 官网下载自己合适的版本。例如对于 Windows 用户,你可以下载 ImageMagick-7.x-Q16-x64-dll.exe,这是一个动态链接库的 Windows 64 位版本,支持的像素是 16 位深度。使用 16 位深度在处理图片时比 8 位深度慢 15% 至 50%,占用的内存也为后者的 2 倍。
安装完成后,使用如下命令查看是否安装成功:
magick --version
ImageMagick 的使用方法
在之前的版本中,使用的是 convert 命令,但是从较新版开始(具体哪个版本开始忘了),将改为使用 magick convert 命令,这点注意一下。
ImageMagick 的命令参数太多,想要完整了解的可以查看官方文档《命令行选项手册》。我这里只举一些常用的例子,供大家参考。
1.简单的格式和尺寸转换
按比例调整图片大小,并且转换图片的格式:
# a.png 放大2倍并转换成jpg 格式的 b.jog magick convert a.png -resize 200% b.jpg # a.png 缩小50%并且覆盖原文件 magick convert a.png -resize 50% a.png
2.GIF 的一些应用
将指定的图片合成一个 .gif,默认以第一张图片的尺寸为准:
# 将 1~3号图片,合并为一个gif图片 magick convert 1.jpg 2.jpg 3.jpg fin.gif # 将 文件夹内的所有jpg文件,合并为一个gif图片 magick convert *.jpg fin.gif
.gif 转静态图片。-coalesce 参数是根据图像元数据的设置覆盖图像序列中的每个图像,以重现动画序列中每个点的动画效果。
magick convert -coalesce fin.gif out.jpg
3.ICO 的一些应用
制作多个尺寸的 ico 图标,用 ImageMagick 再合适不过了:
# 将多张不同尺寸的 png 图片合并到 fav.ico magick convert 16.png 32.png 48.png 128.png 256.png -colors 256 fav.ico # 直接由一张 png,生成不同尺寸的 fav.ico magick convert in.jpg -define icon:auto-resize=16,32,48,128,256 -compress zip fav.ico
4.分割图片
使用 -crop 参数可以把一副图像分成若干块大小一样的图片:
magick convert b.png -crop 500x500 c.jpg
例如,原图片尺寸为1920×1080,按照 500x 500 切割,可分出 11 块图片(注意如果尺寸不是目标图片的整数倍,那么右边缘和下边缘的一部分图片就用实际尺寸)。
5.颜色反转
使用 -negate 参数可以帮助我们取反颜色:
magick convert a.jpg -negate b.jpg
6.压缩图片
-quality 参数可以调整图片的质量,取值范围是 [0, 100]:
- 0 代表最低的图像质量(最高压缩率)
- 100 代表最佳质量(但最不有效的压缩)
magick convert -quality 80 a.jpg b.jpg
值得注意的是,一张图片的压缩率是有上限的,100% 压缩率不代表把图片变成“战损版”,只是能压缩的地方压缩到了极致。
7.PDF 转图片
ImageMagick 甚至还能实现 PDF 与图片的互转。下面我们先介绍一些参数:
- -density 参数:指定输出图像的分辨率 ( DPI ),在 Mac OS 上,默认的分辨率 ( 72 ) 输出的图像字迹不清,需要更高分辨率获得清晰的图像。
- -flatten 参数:某些情况得到的 JPG 图片会出现黑色背景(转换成 PNG 不会),可以使用 -flatten 选项让其保持白色背景,但加上这个选项,多页 PDF 不会分成多个 JPG 图像。
- -background 参数:可以一次命令转换多页 PDF 成多个图像并保持白色背景。
# 某些情况得到的 JPG 图片会出现黑色背景,可以使用 -flatten 选项让其保持白色背景。 # 但加上这个选项,多页 PDF 不会分成多个 JPG 图像。 magick convert -density 150 -flatten 'my.pdf[0]' my.jpg # 可以一次命令转换多页 PDF 成多个图像并保持白色背景 magick convert -density 150 -background white -alpha remove my.pdf my.jpg
但第二种方式 IM 内部应该是一页一页的转换,所以一个多页的 PDF 耗时会比较久,采用第一种方式让 Node.js 多进程同时转换该 PDF 可以提升速率。
8.多个图片合并到PDF
ImageMagick 也可以很方便的帮我们合并一些图片到 PDF,这对整理一些漫画的我来说,非常的方便:
# 按顺序合并所有的 jpg 图片,图片质量与原图保持一致,占用空间与原图相近 magick convert "*.{jpg}" out.pdf # 按顺序合并所有的 jpg 图片,图片质量最高,占用空间远大于原图空间 magick convert "*.{jpg}" -quality 100 out.pdf # 按顺序合并所有的 jpg 图片,图片质量最低,占用空间远小于原图空间 magick convert "*.{jpg}" -quality 0 out.pdf # 按顺序合并所有的 jpg 和 png 图片 magick convert "*.{png,jpg}" out.pdf
需要注意的是,图片的排序是按照文件夹中图片的默认排序而定的。
你甚至还可以结合批处理文件 bat,对当前目录下所有文件夹内的图片进行 pdf 合成,并将每个生成的 pdf 都命名为自己的文件夹的名称,生成在 bat 的根目录下:
# 支持中文路径 chcp 65001 @echo off # 历遍当前目录下所有文件夹 for /d %%i in (*) do ( cd %%i # 每个文件夹内图片生成 pdf 到命令根目录 magick convert "*.{jpg}" %~dp0\%%i.pdf cd.. ) pause
当然,ImageMagick 的远不至此, 完整的了解可以查看官方文档《命令行选项手册》。