ImageMagick和gm

想想也使用了近4年的ImageMagick,此文记录一下笔记。

1.ImageMagick 介绍

ImageMagick是免费软件(全部源码开放),可以即用型二进制分发形式提供,也可以作为源代码提供,您可以在开放应用程序和专有应用程序中使用,复制,修改和分发它们。它是在派生的Apache 2.0 许可下分发的。

ImageMagick可以运行于大多数的操作系统,ImageMagick的大多数功能的使用都来源于命令行工具。

ImageMagick利用多个计算线程来提高性能,并且可以读取,处理或写入兆,千兆或兆像素图像大小。

1.1 功能

  • 格式转换:将图片从一个格式转换到另一个格式,包括直接转换成图标;
  • 图片处理:改变尺寸、旋转、锐化(sharpen)、减色、图片特效;在一个图片上写字或画图形,带文字阴影和边框渲染;
  • 制作gif图:将一组图片作成gif动画,直接convert;
  • 图片合成:将几张图片作成一张组合图片,montage;
  • 图片信息获取。

1.2 支持图片格式

PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, 和 SVG.

1.3 支持应用程序及其开发语言

G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), JMagick (Java), WASM-ImageMagick (Javascript/Typescript), JuliaIO (Julia), L-Magick (Lisp), Lua (LuaJIT), NMagick (Neko/haXe), Magick.NET (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), magick (R), RMagick (Ruby), or TclMagick (Tcl/TK)

2.ImageMagick 安装

软件包及下载地址:https://imagemagick.org/script/download.php

安装后验证命令

1
convert -version

验证已包含webp处理功能命令

1
convert -list format

p-webp.png

返回列表里有WEBP即可。

2.1 Mac 可以通过homebrew

安装命令:

1
brew install imagemagick

注意如果要处理webp的图形格式,需要带上参数:

1
brew install imagemagick --with-webp

2.2 Ubuntu(Linux) 通过apt-get

安装命令:

1
sudo apt-get install imagemagick

注意如果要处理webp的图形格式,需要先安装webp

1
sudo apt-get install webp

2.3 CentOS(Linux) 通过包和编译

首先下载安装包/或将已下载的安装包放入服务器

1
wget https://www.imagemagick.org/download/ImageMagick.tar.gz

解压

1
tar -zxvf ImageMagick.tar.gz

编译,注意如果要处理webp的图形格式需要带上参数:

1
2
3
cd ImageMagick-7.0.8-27
./configure --with-webp
make && make install

2.4 Windows

官网上下载安装包,建议安装7.0.3版本并配置环境变量。注意区分32位和64位。

3.ImageMagick使用

(相关图片效果后续补上)

3.1 convert命令

从名字就可看出主要用来对图像进行转化,它能对图像格式进行转化,也能做缩放、剪切、模糊、反转等操作。

常用的命令有:

  • crop 宽x高+起点横坐标+起点纵坐标:裁剪图
  • resize 宽x高[!]:改变尺寸,如果使用惊叹号,表示不保留视觉比例,强行改变尺寸匹配给定的宽和高
  • colors 颜色数:设定图片采用的颜色数,如果是生成png或gif图片应指定这个参数
  • quality 质量:设定jpeg图片输出质量,推荐采用80,此命令仅用于输出格式是jpg的情况,不应省略,省略的话默认质量是95,生成图片过大
  • +profile “*”:图片中不存储附加信息,必须使用,否则生成图片过大

格式转化

如把a.jpg转为a.png。

1
convert a.jpg a.png

多张照片转为pdf

1
convert *.jpg a.pdf

gif拆分

1
convert test.gif test.jpg

会生成很多以test开头的图片文件。

p-gifs.png

大小缩放

比如生成foo.jpg的缩略图foo.small.jpg

1
convert -resize 100x100 foo.jpg foo.small.jpg

刚才是写死尺寸,当然我们也可以通过比例

1
convert -resize 50%x50% foo.jpg foo.small.jpg

加边框

在一张照片的四周加上边框,可以用 -mattecolor 参数

1
convert -mattecolor "#000000" -frame 60x60 yourname.jpg rememberyou.png

其中,”#000000”是边框的颜色,边框的大小为60x60

p-demo.png

加文字

1
convert -fill green -pointsize 40 -draw "text 10,50 Hello" 2.jpg 222.jpg

上面的命令在距离图片的左上角10x50的位置,用绿色的字写下Hello,如果你要指定别的字体,可以用-font参数。

p-demo.png

或者

1
convert 1.png -fill white -pointsize 13 -draw "text 10,15 ‘comeon 2020’" 2.png

模糊图片

高斯模糊

1
convert -blur 80 foo.jpg blur.png

p-demo.png

其中blur参数还可以这样-blur 80x5。后面的那个5表示的是Sigma的值

翻转

上下翻转:

1
convert -flip foo.png bar.png

p-demo.png

左右翻转:

1
convert -flop foo.png bar.png

p-demo.png

反色

形成底片的样子:

1
convert -negate foo.png bar.png

p-demo.png

单色

把图片变为黑白颜色:

1
convert -monochrome foo.png bar.png

p-demo.png

加噪声

1
convert -noise 3 foo.png bar.png

p-demo.png

油画效果

把一张普通的图片,变成一张油画,效果非常的逼真

1
convert -paint 4 foo.png bar.png

p-demo.png

着色

着色是将每个像素的颜色与指定颜色混合的过程。该效果的参数就是要用来混合的颜色。可以用一个百分数(它将分别用于红色、绿色和蓝色),也可以用三个百分数来指定这个参数。也可以提供三个实际值中的一个。要指定三个值,每个值分别代表红色、绿色和蓝色三个采样,使用 red/green/blue 形式的参数。例如, 10/20/30 意味着红色的值是 10、绿色值为 20 而蓝色值为 30。您也可以在这个构造中使用百分数

1
convert -colorize 255 input.jpg output.jpg

1
convert -colorize 100/0/125 input.jpg output.jpg

p-demo.png

内爆效果

内爆效果模拟了您图像的中心被吸入虚拟黑洞的情形。所用的参数是您所期望的内爆效果量。

1
convert -implode 1 input.jpg output.jpg

曝光,模拟胶片曝光

1
convert -solarize 42 input.jpg output.jpg

p-demo.png

扩散

spread 在图像之内以随机的数量移动像素。所用的参数是被移到新选择的位置的像素区域的大小。所以它指定了输出和输入的相似程度

1
convert -spread 5 input.jpg output.jpg

p-demo.png

马赛克

1
convert -sample 10% -sample 1000% input.jpg output.jpg

p-demo.png

从左至右将图片水平相连:

1
convert +append *.jpg result.jpg


1
2
3
4
5
convert -size 350x500 xc:black composite.jpg
composite -geometry +0+0 composite.jpg image1.gif composite.jpg
composite -geometry +100+0 composite.jpg image2.gif composite.jpg
composite -geometry +0+300 composite.jpg image3.gif composite.jpg
composite -geometry +0+375 composite.jpg image4.gif composite.jpg

旋转

把一张图片,旋转一定的角度:

1
convert -rotate 30 foo.png bar.png

p-demo.png

炭笔效果

形成炭笔或者说是铅笔画的效果。

1
convert -charcoal 2 foo.png bar.png

增加 -charcoal 选项的参数的数值会增加应用于该图像的“炭笔”数量,但也会延缓生成图像的过程。

p-demo.png

散射

毛玻璃效果:

1
convert -spread 30 foo.png bar.png

p-demo.png

漩涡

以图片的中心作为参照,把图片扭转,形成漩涡的效果:

1
convert -swirl 67 foo.png bar.png

p-demo.png

凸起效果

用-raise来创建凸边:

1
convert -raise 5x5 foo.png bar.png

p-demo.png

执行后,你会看到,照片的四周会一个5x5的边,如果你要一个凹下去的边,把-raise改为+raise就可以了。其实凸边和凹边看起来区别并不是很大。

为图片添加一些注释信息

1
convert -font Arial -stroke green -fill red -draw "text 50,60 michealwayne.cn" -pointsize 14 07.jpg hist.png

p-demo.png

其中:

  • draw “text 10,10 String” 在以图片左上角为原点坐标的10,10位置处添加文字
  • font 指定字体
  • stroke 描边用的颜色,
  • fill 填充用的颜色,这里用none就可以画出空心字了,
  • pointsize 字体像素大小,
  • font Arial 将注释的字体设置为Arial。也可以在此处指定字体文件的路径。但它是使用位于非标准位置的字体来完成该任务的:
    convert -font c:\windows\fonts\1900805.ttf -fill white - pointsize 36 -draw ‘text 10,475 “ylmf.com”’ floriade.jpg stillhq.jpg
  • fill white 用白色而不是标准的黑色来填充字母。
  • pointsize 36 以点为单位指定字母的大小。一英寸等于 72 点。
1
convert -font fonts\1900805.ttf -fill white -pointsize 36 -draw 'text 10,475 "stillhq.com"' floriade.jpg stillhq.jpg

其中:

  • fill white 用白色而不是标准的黑色来填充字母。

3.2 mogrify命令

Mogrify改写最初的图像文件然后写到一个不同的图像文件。

批量图片格式转换

比如将当前所有jpg文件转换成png格式。

1
mogrify -format png *.jpg

gif拆分

将当前的gif图每一帧都转化成png文件

1
mogrify -format *.gif

批量生产缩略图

1
mogrify -sample 80x60 *.jpg

注意,这个命令会覆盖原来的图片,不过你可以在操作前,先把你的图片备份一下。

1
convert -sample 25%x25% input.jpg output.jpg

3.3 identify命名

描述一个或较多图像文件的格式和特性。

3.4 composite

根据一个图片或多个图片组合生成图片。

3.5 montage

创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。

3.6 compare

在算术上和视觉上评估不同的图片及其它的改造图片。

3.7 display

如果你拥有一个X server的系统,它可以按次序的显示图片

3.8 animate

利用X server显示动画图片

3.9 import

在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。

3.10 conjure

解释执行 MSL (Magick Scripting Language) 写的脚本。


4 gm

npm gm地址https://www.npmjs.com/package/gm

gm是用于nodejs中调用GraphicsMagick和ImageMagick的工具。

4.1 安装

安装过imageMagick后通过npm过git安装

1
npm install gm


1
git clone git://github.com/aheckmann/gm.git

4.2 使用

通过配置开启ImageMagick

1
2
3
4
const fs = require('fs'),
gm = require('gm').subClass({
imageMagick: true
})

然后即可进行图片操作。gm的调用为链式,有种jQuery的感觉。如

1
2
3
4
5
6
gm('./test.jpg')
.resize(200, 200)
.write('./res.jpg', function (err) {
if (err) console.error(err);
else console.log('success');
})

4.3 常用操作

移除EXIF照片的属性信息和拍摄数据

.noProfile()方法

如:

1
2
3
gm('./test.jpg')
.noProfile()
// ...

尺寸放大/缩放

.resize(width, height[, norate])方法

如:

1
2
3
4
5
6
7
gm('./test.jpg')
.resize(200, 200)
// ...

gm('./test.jpg')
.resize(200, 200, '!') // 传'!'时忽视固定比例
// ...

resizeExact(width, height)方法,宽或高。
如:

1
2
gm('./test.jpg')
.resizeExact(200, 200)

获取gif某一帧


1
2
3
4
gm('/path/to/animated.gif[0]')
.write('/path/to/firstframe.png', function (err) {
if (err) console.log('aaw, shucks');
});

信息获取


1
2
3
4
gm('./test.png')
.identify(function (err, data) {
if (!err) console.log(data)
});

4.4 方法封装

还未整理,部分可参考https://github.com/MichealWayne/fe-tools/blob/master/nodejs/imgbuild/setnewimg.js


使用注意

1.ImageMagick对中文支持不好,文件(夹)一定不要含中文

2.webp相关的安装参数或包

文档