我们有时候需要批量转换一些照片的格式,或者打包一些不同尺寸的 .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 的远不至此, 完整的了解可以查看官方文档《命令行选项手册》

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Next Post

树莓派控制PWM风扇

周四 5月 26 , 2022
夏天到了,气温越来越高了,小小树莓派的温度也快能烤 […]