跳到主内容

Graphics Magick 命令行使用方法

Graphics Magick 是一个 ImageMagick 的分支版本,但它提供了更易懂的命令行接口、 更精简的二进制体积以及更快速的性能。

它提供了 gm 可执行文件用于调用 2 ,也可以当作库提供给其他编程语言使用 3

警告

不建议在 Windows 上使用 GraphicsMagick

环境依赖问题太难搞了!如果有在 Windows 上使用的需要,建议使用 WSL 1

GraphicsMagick 命令一览

gm 的命令行接口通常是:

gm {{ 子命令 }} {{ 选项 }} {{ 文件 }}

子命令一览:

batch

以交互式或批处理模式处理多条命令

benchmark

测试其他命令的性能

compare

对比两张图片

composite

合成图片

conjure

执行 Magick Script 语言(MSL)的 XML 脚本

convert

转换一张或一组图片的格式

help

显示其他命令的帮助信息

identify

描述一张或一组图片

mogrify

变换一张或一组图片

montage

蒙太奇,由一组图片创建一个合成图片(在一个网格中)

time

测试其他命令的运行时间

version

显示发行版本

register

register this application as the source of messages

你可以在 version 中查看 Graphics Magick 支持的特性。

convert 命令

gm convert 的命令行参数布局是:

gm convert [options ...] infile [options ...] outfile

常用的选项有

-blur
param

<radius>[x<sigma>]

添加高斯模糊滤镜,radius 是高斯半径,决定了图像的模糊程度,值越大,越模糊; sigma 是高斯分布的标准差,决定了高斯分布的聚集程度,越大越分散,越模糊。

应用示例:

gm convert -blur 128 src.webp src-128.webp
gm convert -blur 128x3 src.webp src-128x3.webp

这里是各种参数下的效果展示:

原图
sigma 1~4, radius 16~128

2D 图像应用的高斯函数是

\begin{equation*} G(x, y) = \frac{ e^{ - \frac{ x^2 + y^2 }{ 2 \sigma^2 } } } { \sqrt{ 2 \pi \sigma^2 } } \end{equation*}

要了解一下高斯模糊,可以参考 45

-charcoal
param

factor

转换为炭笔素描风格。 factor 是一个数字,表示轮廓的粗细。

/images/gm-charcoal-shown.webp

-charcoal 1

-define
param

key=value,...

定义一个编解码器配置。使用 -define key=value 定义新值,用 +define key,... 取消定义,用 +define '*' 取消所有定义。详细设置见 6

-density
param

<w>x<h>

设置图像的像素密度,默认单位是 DPI。

-draw
param

<primitive> <coordinate> <content>

在图像上绘制图元,详见 7 。 为了防止 content 中出现特殊字符导致读取错误,最好用 '' 将文本括起来。

-enhance

去噪点。

-fill
param

color

图元的填充色,配合 -draw 使用。

-flip

竖直对称。

-flop

水平对称。

-font
param

font

指定一个字体,配合 -draw 使用。

-format
param

type

转换格式。一般用于转换多个图像文件。不需要指定输出文件名, 其名称将由输入文件推导而来(替换后缀名为对应格式)。

-fuzz
param

<distance>%

设置模糊处理的程度。

-magnify
param optional

factor

放大图像,默认两倍。

-noise
param

radius

去噪声,用 radius 指定邻域半径。

+noise
param

type

加噪声,指定随机数分布:

Uniform
Gaussian
Multiplicative
Impulse
Laplacian
Poisson
Random
-quality
param

value

图像压缩质量,0~100 。越高,损失越少。

-trim

删除所有与角上的像素相同的像素。 如果使用 -fuzz 选项,则删除相近的像素。

实用案例

图片格式转换

任何支持的都可以自动识别文件后缀进行转换:

gm convert src.png dst.webp

特别地,如果希望进行无损压缩:

gm convert src.png -compress LossLess dst.webp

更改图像尺寸

在输出文件的选项中添加 -resize:

gm convert src.png -resize 400x300 dst.png

# {{ 宽 }}x{{ 高 }}

在图像上添加文本标注

需要:

gm convert src.png -font {{ 字体 }} -fill {{ 颜色 }} -draw "text {{ x,y 坐标 }} '{{ 文本 }}'" dst.png
  • 文本外最好用 '' 包裹起来,否则可能因为一些特殊的字符导致命令被转义而出错

  • 可以用 -pointsize 设置字号

  • -draw 命令除了 text 之外还可以画多种图元类型

这里有一个 PowerShell 的例子:

# 创建 $ix$j 模糊的图片并标注参数
param([int]$i, [int]$j)
gm.exe convert -blur "$($i)x$($j)" src.webp "out-$($i)x$($j)-origin.webp"
gm.exe convert -draw "text 0,18 '$($i)x$($j)'" -pointsize 18 -font Arial -fill 'black' "out-$($i)x$($j)-origin.webp" "out-$($i)x$($j).webp"

生成蒙太奇画册

使用 montage 命令:

gm montage {{ src.png }}+ [:options:] {{ dst.png }}

常用的选项有

-tile {{ m }}x{{ n }} 设置画册的网格样式,m 列 n 行 -geometry {{ w }}x{{ h }}+{{ b }} 设置整体的宽 w,高 h,和每个格块的间距 b

  • {{ src }} 可以传入通配符。

上面的那张 演示图 就是通过下面这个脚本创建的:

gm.exe montage out*.webp -geometry 3000x4000+10 result.webp

PDF 转透明图片

这在嵌入用 LaTeX 编译的公式时非常有用(对于没有额外渲染机制的媒体):

gm convert src.pdf -trim dst.svg
gm convert src.pdf -trim dst.png
gm convert src.pdf -trim dst.webp

最好使用矢量图或者支持透明通道的图像格式。 转换 PDF 需要安装 GhostScript 8 。 在 Windows 系统中,GraphicsMagick 在寻找 GhostScript 的动态库时,会查找 \HKEY_*\SOFTWARE\GPL Ghostscript\#.##\GS_DLL 串的值所值的 路径(#.## 表示 GhostScript 的当前版本),而在安装 GhostScript 时, 不一定会修改注册表,因此可能需要手动添加,为了这个键可以记录在任何一个作用域中, 为了环境的独立性,可以安装到 HKEY_CURRENT_USER ,我安装的 GS 是 9.52 版:

[HKEY_CURRENT_USER\SOFTWARE\GPL Ghostscript\9.52]
"GS_DALL"="%USERPROFILE%\scoop\apps\ghostscript\current\bin\gsdll64.dll"

特别说明的是,在 GraphicsMagick 读写 SVG 依赖 libxml2 和 FreeType, 这两者在 Windows 上的安装非常地麻烦,建议避开它们。

%! TEX = xelatex
\[
\iint_{\Sigma}
(
    \frac{ \partial R }{ \partial y } -
    \frac{ \partial Q }{ \partial z }
)   \mathrm{d}y \mathrm{d}z +
(
    \frac{ \partial P }{ \partial z } -
    \frac{ \partial R }{ \partial x }
)   \mathrm{d}z \mathrm{d}x +
(
    \frac{ \partial Q }{ \partial x } -
    \frac{ \partial P }{ \partial y }
)   \mathrm{d}x \mathrm{d}y =
\oint_{r} P\mathrm{d}x + Q\mathrm{d}y + R\mathrm{d}z
\]
\begin{equation*} \iint_{\Sigma} ( \frac{ \partial R }{ \partial y } - \frac{ \partial Q }{ \partial z } ) \mathrm{d}y \mathrm{d}z + ( \frac{ \partial P }{ \partial z } - \frac{ \partial R }{ \partial x } ) \mathrm{d}z \mathrm{d}x + ( \frac{ \partial Q }{ \partial x } - \frac{ \partial P }{ \partial y } ) \mathrm{d}x \mathrm{d}y = \oint_{r} P\mathrm{d}x + Q\mathrm{d}y + R\mathrm{d}z \end{equation*}
gm convert sample.pdf -trim sample.webp
/images/gm-pdf-webp-shown.webp

展示 PDF 转 WebP 的效果