Please enable Javascript to view the contents

ImageMagick命令

 ·  ☕ 17 分钟

ImageMagick

imagemagick_logo.svg_02.jpg

ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。其全部源码开放,可以自由使用,复制,修改,发布。它遵守GPL许可协议。它可以运行于大多数的操作系统。

关于ImageMagick,请仔细阅读以下命令行工具的使用方法:

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

GraphicsMagick

graphicsmagick-logo_2.jpg

GraphicsMagick 它的命令行缩写为 gm,使用 gm -help 来查看帮助,GraphicsMagick是ImageMagick的一个分支(从 ImageMagick 5.5.2 分支出来的),相对于ImageMagick而言,TA处理速度更快,消耗资源更少,GM的手册非常丰富。

GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、Ruby等的调用。

GraphicsMagick的命令与ImageMagick基本是一样的,使用时可以在命令前加上前缀 gm

官网:GraphicsMagick Image Processing System

GraphicsMagick的 gm为创建、比较、转换、编辑和显示图像提供了一套实用程序。所有实用程序都作为单个gm可执行文件的子命令提供。gm可执行文件返回退出代码 0 表示成功,或返回1表示失败:

  • gm animate 动画:在运行X服务器的任何工作站显示器上显示动画(例如GIF文件)。
  • gm batch 批处理:以简单的线性批处理脚本的形式执行任意数量的实用程序命令(例如convert),以提高执行效率,和/或允许在任意脚本或 程序的控制下用作从属共同进程。
  • gm benchmark 基准:在指定的迭代次数或执行时间内执行其他实用程序命令(例如convert),并报告执行时间和其他分析信息,如CPU利用率。 Benchmark提供了各种操作模式,包括使用不同数量的线程执行命令,以及其他报告格式,如逗号分隔值(CSV)。
  • gm compare 比较:比较两个图像并根据指定的度量报告差异统计信息,和/或输出具有差异视觉表示的图像。它还可用于测试图像在特定范围和指 定度量内是否相似,从而向执行环境返回真值。
  • gm composite 合成:合成图像(将图像混合或合并在一起)以创建新图像。
  • gm conjure 魔咒:解释和执行Magick脚本语言(MSL)中的脚本。
  • gm convert 转换:在应用任意数量的图像转换时,使用一种图像格式将输入文件转换为具有相同或不同图像格式的输出文件。
  • gm help :获取某个命名的使用说明
  • gm display 显示:是独立于机器结构的图像处理和显示设备。它可以在运行X服务器的任何工作站显示器上显示图像。
  • gm identify 标识:描述一个或多个图像文件的格式和特征。它还将报告图像是否不完整或损坏。
  • gm import 导入:从X服务器上的任何可见窗口读取图像,并将其输出为图像文件。您可以捕获单个窗口、整个屏幕或屏幕的任何矩形部分。
  • gm mogrify 变形:变换图像或图像序列。这些变换包括图像缩放、图像旋转、颜色还原等。变形图像覆盖原始图像。
  • gm montage 蒙太奇:通过组合几个独立的图像来创建合成。图像平铺在合成图像上,图像的名称可选地显示在各个平铺的正下方。
  • gm time subcommand :执行子命令并报告所用的用户、系统和总执行时间。
  • gm version 版本:报告GraphicsMagick发布版本、最大采样深度、版权声明、支持的功能以及生成软件时使用的选项。

ImageMagick图片处理

GraphicsMagick的命令与ImageMagick基本是一样的。

1
2
3
4
5
6
# 特殊效果
convert -charcoal 2 input.jpg output.jpg   #炭笔
convert -colorize 255 input.jpg output.jpg   #着色 可以指定三种颜色 red/green/blue
convert -implode 4 input.jpg output.jpg   #内爆效果
convert -solarize 42 input.jpg output.jpg   #曝光,模拟胶片曝光
convert -spread 5 input.jpg output.jpg     #随机移动,参数是位移大小

示例解析:

1
convert -crop 300x300+0+0 -resize 200x200 -colors 100 +profile "*" 1.jpg 1.png 

处理过程解释:

  1. 把当前目录 1.jpg 图片文件,从左上角(0,0)坐标为起点,裁剪一块 300x300 像素的部分。
  2. 然后把这部分缩小到 200x200 像素。
  3. 然后把颜色缩减到100色。
  4. +profile "*" , 意味着(去除多余信息)在图片文件里不存储Exif信息,以减小图片体积。
  5. 最后生成 1.png,保存在当前目录。

注意:-resize会试图保留原图的原始长宽比例,因此不一定生成的图片和你指定的尺寸一定匹配,比如,如果 2.jpg 大小是400x200,所以如果用命令:convert 2.jpg -resize 100x100 2.png,那么生成的图片 2.png 的实际大小是100x50。

常用的参数用途说明:

  • crop 宽x高+起点横坐标+起点纵坐标:裁剪图
  • resize 宽x高!:改变尺寸,如果使用惊叹号,表示不保留视觉比例,强行改变尺寸匹配给定的宽和高;如果仅给定宽或者高,如"宽x"或"x高"形式的参数(“x高"与"宽x高"的效果是一样的),则以已知参数为基准按比例改变尺寸。
  • colors 颜色数:设定图片采用的颜色数,如果是生成 png 或 gif 图片应指定这个参数
  • quality 质量:设定jpeg图片输出质量,推荐采用80,此命令仅用于输出格式是jpg的情况,不应省略,省略的话默认质量是95,生成图片过大
  • +profile "*":图片中不存储Exif信息,必须使用,否则生成图片过大,(去除多余信息)

类型转换

1
convert old.jpg new.png     # 进行图片格式转换,改一下后缀名即可

转换为jpg图片会比png图片小

图片缩放和压缩

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## 按尺寸缩放:缩放为 80x60 的尺寸大小
# 可以使用 -sample 和 -resize:
# 其中:-sample 使用一个简单的算法生成缩略图,速度快,画质较低,适合生成100x100以下的图片
# -resize 画质好
convert -sample 80x60 input.jpg output.jpg   # 画质较低
convert -resize 80x60 input.jpg output.jpg # 画质好  
convert -resize 80x60\! input.jpg   output.jpg   # 强制按给定的宽高缩放  

## 按比例缩放:缩放后图像保持原来的长宽比例
convert -resize 50%x50% input.jpg output.jpg  # 将图像缩小为原来的50%*50%
convert -sample 25%x25% input.jpg output.jpg # 将图像缩小为原来的25%*25%
1
2
3
convert -quality 70% input.jpg output.jpg # -quality降低图片的质量,值0-100,越大质量越好,默认值为 75%
# 去除图片多余exif信息,比如日期、相机型号、GPS 使用 -strip
convert -strip input.jpg output.jpg  

压缩 gif 图片:

1
convert input.gif -fuzz 10% -layers Optimize output.gif

裁剪图片

1
2
# 括号中的内容为注释
convert -crop  100()x200()+10(x坐标)+10(y坐标)   input.jpg(源图片路径)   output.jpg(缩放后存放路径)  

旋转图像

convert -rotate 90 input.jpg output.jpg  

加边框

1
2
convert -raise 5x5 input.jpg output.jpg
convert +raise 5x5 input.jpg output.jpg

把图片变为黑白颜色

convert -monochrome input.png output.png  

图片反色处理

图片反色处理通过 convert 的 negate 参数来实现,同时可以针对制定的区域进行反色。

1
2
3
4
5
6
7
# 整个图片进行反色
convert -negate src.jpg negate.jpg

# 部分区域反色
convert -region 100x100+0+0 -negate src.jpg negate-part-1.jpg

convert -gravity center -region 100x100+0+0 -negate src.jpg negate-part-2.jpg

注意:regoin参数需要在negate前,否则无法对指定的区域进行反色处理。另外关于gravity参数见下文

添加图片水印处理

1
2
# 把名为logo.gif的水印图标添加在原始图片(src.jpg)右下角,且水印的下边缘距原始图片10像素、右边缘距原始图片5像素
convert src.jpg logo.gif -gravity southeast -geometry +5+10 -composite dest.jpg  

添加英文文字水印

1
convert  -fill white -pointsize 24 -draw "text 10,15 'lifesinger 2006' "  input.png  output.png

文字坐标在:10x50 的位置

可以用-font指定字体,这时需要安装 Ghostscript 字体支持。

如果安装IM、GM时,没有安装Ghostscript字体,会默认使用Linux系统的字体,目录是:/usr/share/fonts/default/Type1/

添加中文文字水印

1
2
# 需使用最新版本的ImageMagick,同时指明中文字体文件,这样在加中文文字水印时才不乱码
convert -font ~/ImageMagick/font/fangzheng.ttf  -fill green -pointsize 40 -draw "text 10,50 '文字'" input.jpg output.jpg

生成 Gif

执行如下命令將单帧图片压缩成 gif 图片:

1
convert -delay 120 -loop 0 *.png  out.gif

压缩 gif 图片:

1
convert input.gif -fuzz 10% -layers Optimize output.gif

GraphicsMagick图像处理

1
2
3
4
5
6
7
8
# 显示图像文件信息
gm identify a.jpg

# 打印更多信息。
gm identify -verbose 4.png

# 显示图像
gm display 'vid:*.jpg'

合并图像

1
2
# 将三幅图像和并为一副图像
gm montage -mode concatenate -tile 3x1 image1.ppm image2.ppm image3.ppm concatenated.miff

格式转换

1
2
gm convert a.bmp a.jpg
gm convert a.bmp a.pdf #(转换为pdf)

在图像上添加文字

1
gm convert -font Arial -fill blue -pointsize 18 -draw "text 10,10 'your text here'" test.tif test.png

创建gif图像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
gm convert -delay 20 frame*.gif animation.gif
gm convert -loop 50 frame*.gif animation.gif
#(让动画循环50次)

#对每一帧手动指定延时
gm convert -delay 20 frame1.gif -delay 10 frame2.gif -delay 5 frame3.gif animation.gif

#从gif文件中抽取第一帧
gm convert "Image.gif[0]" first.gif

# 转换为640x480的图像
gm convert -resize 640x480 image.gif image.gif

截屏

1
2
# 用鼠标点击所要截取的窗口,或者选择截屏区域,保存为a.jpg
gm import a.jpg

保留窗口的边框

1
gm import -frame a.jpg

缩放

1
2
#更改当前目录下*.jpg的尺寸大小,并保存于目录.thumb里面
gm mogrify -output-directory .thumbs -resize 320x200 *.jpg

调整图像 dpi 和大小

1
2
gm convert -density 288 -geometry 25% image.gif image.gif
#(缩小为原先的1/4,并且dpi为288)

原始图片是 input.jpg,尺寸:160x120

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 只缩小不放大
gm convert input.jpg -resize "500x500>" output_1.jpg
# 加了>,表示只有当图片的宽与高,大于给定的宽与高时,才进行"缩小"操作。
# 生成的图片大小是:160x120,未进行操作
# 如果不加>,会导致图片被比等放大。

# 等比缩图 (缺点:产生白边)
gm convert input.jpg -thumbnail "100x100" output_1.jpg
# 生成的图片大小是:100x75

# 非等比缩图,按给定的参数缩图(缺点:长宽比会变化)
gm convert input.jpg -thumbnail "100x100!" output_2.jpg
# 生成的图片大小是:100x100

# 裁剪后保证等比缩图 (缺点:裁剪了图片的一部分)
gm convert input.jpg -thumbnail "100x100^" -gravity center -extent 100x100 output_3.jpg
# 生成的图片大小是:100x100,还保证了比例。不过图片经过了裁剪,剪了图片左右两边才达到1:1

# 填充后保证等比缩图 (缺点:要填充颜色,和第一种方法基本一样)
gm convert input.jpg -thumbnail "100x100" -background gray -gravity center -extent 100x100 output_4.jpg
# 生成的图片大小是:100x100,还保证了比例,同时没有对图片进行任何裁剪,缺失的部分按指定颜色进行填充。

# 裁剪、填充相结合 (缺点:最差的方法)
gm convert input.jpg -thumbnail "[email protected] -background gray -gravity center -extent 100x100 output_5.jpg
# 生成的图片大小是:100x100,这次保证了大小和比例,其中的10000就是100x100的乘积,同时在填充和裁剪之间做了一个平衡。


# 使用GM,把"位深度32"的图片转换为"位深度24"的图片
# 输入图片zzz.jpg就是"位深度32"的图片,输出图片 zzz_out.jpg就是"位深度24"的图片
# 转完后,图片的颜色会有轻微变化。

gm convert -resize 100x100 -colorspace RGB zzz.jpg zzz_out.jpg

官方示例:

格式:

1
2
3
# 可以看出部分选项用于  input_file 比如 -size 
# 大多数选项用于 output_file
gm convert [ options ... ] input_file [ options ... ] output_file

要制作JPEG图像的缩略图,请使用:

1
gm convert -size 120x120 cockatoo.jpg -resize 120x120 +profile "*" thumbnail.jpg

在此示例中,-size 120x120向JPEG解码器提示图像将被缩小为120x120,从而避免了将全分辨率图像返回给GraphicsMagick进行后续的调整大小(resize)操作,从而使其运行得更快。 -resize 120x120 指定输出图像的所需尺寸, 将对其进行缩放,使其最大尺寸为120像素。+profile "*" 会删除输入中可能存在的任何ICM,EXIF,IPTC或其他配置信息,因为缩略图中不需要这些配置信息。

查看帮助

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
gm help
gm help convert

## gm convert 的参数
-compress type       # image compression type 图像压缩类型
-quality value       # JPEG/MIFF/PNG compression level 压缩级别
-geometry            # 指定尺寸,偏移和调整大小选项。
-resize geometry     # resize the image 调整图像的大小(它是-geometry选项的别名,其行为方式相同)
-sample geometry     # scale image with pixel sampling 具有像素采样的缩放图像
-size geometry      # width and height of image  指定原图像的宽度和高度
-thumbnail          #  resize an image (quickly) 

convert 是主要命令,查看 convert 帮助的步骤:

  • gm convert 先在这里查看相应的选项,找到选项后点击选项可以查看更详细的选项说明。

几个重要的选项

-geometry

格式:

-geometry <width>x<height>{+-}<x>{+-}<y>{%}{@}{!}{^}{<}{>}

默认情况下,宽度和高度是最大值。也就是说,在保持图像的纵横比的同时,图像被扩展或收缩以适合宽度和高度值。

将^附加到 geometry,以便在调整图像大小时保持图像纵横比,但生成的宽度或高度将被视为最小值而不是最大值。

附加一个!(感叹号)指向几何体以强制图像大小与指定的大小完全相同。例如,如果指定640x480!图像宽度设置为640像素,高度设置为480像素。

如果只指定了宽度,而没有尾随的"x”,则将"高度"设置为"宽度”(例如,-geometry 100与-geometry 100x 100相同)。如果仅指定了宽度,但使用了尾随的"x”,则宽度将采用该值,而高度将被选择以保持图像的纵横比。类似地,如果仅以"x”(例如-geometry x256)作为前缀指定高度,则选择宽度以保持纵横比。

要指定百分比宽度或高度,请追加%。图像大小乘以宽度和高度百分比以获得最终图像尺寸。要增大图像的大小,请使用大于100的值(例如125%)。要减小图像的大小,请使用小于100的百分比。

使用@以像素为单位指定图像的最大区域。

仅当图像的宽度或高度超过几何体规范时,使用>更改图像的尺寸。<仅当图像的两个尺寸都小于几何图形规格时,才调整图像的大小。例如,如果指定"640x480>”,并且图像大小为256x256,则图像大小不会更改。但是,如果图像是512x512或1024x1024,则将其大小调整为480x480。将几何体规范括在引号中,以防止外壳程序将<>解释为文件重定向。

当用作convert、import或mogrify命令时,-geometry-resize同义,并指定输出图像的大小。偏移量(如果存在)将被忽略。

-size

格式

-size <width>x<height>{+offset}

使用此选项可以指定原始图像的宽度和高度。一般这些原始图像的 GREY,RGB或CMYK尺寸是未知的。

-compress

图像压缩的类型

格式

-compress <type>

选项包括:None, BZip, Fax, Group3, Group4, JPEG, Lossless, LZW, RLE, Zip, LZMA, JPEG2000, JPEG2000, JBIG, JBIG2, WebP, 和 ZSTD

指定为 +compress 表示以未压缩的格式存储二进制图像。 默认值为指定图像文件的压缩类型。

Lossless” 是指无损JPEG,仅当已修补JPEG库以支持它时才可用。 通常不建议使用无损JPEG。

使用 -quality 选项可以设置JPEG,JPEG-2000,PNG,MIFF,MPEG和TIFF编码器要使用的压缩级别。 使用 -sampling-factor 选项可以设置DPX,JPEG,MPEG和YUV编码器用于对色度通道进行下采样的采样因子。

-quality

JPEG / MIFF / PNG / TIFF压缩等级(这里 quality 翻译为质量)

格式:

-quality <value>

对于JPEG和MPEG图像格式,质量(quality )为0(最低图像质量和最高压缩率)到100(最佳质量但有效压缩率最低)。 默认质量为75。使用-sampling-factor选项可以指定色度下采样的因子。 要使用与JPEG解码器相同的质量值,请使用 -define jpeg:preserve-settings 标志。

对于MIFF图像格式以及使用ZIP压缩时的TIFF格式,quality/10是zlib压缩级别,从0(最坏但最快的压缩)到9(最佳但最慢的压缩)。 由于压缩始终是无损的,因此它对图像外观没有影响。

对于JPEG-2000图像格式,质量使用非线性方程式映射到Jasper库所需的压缩率。 该非线性方程式旨在粗略估计JPEG v1格式提供的质量。 默认质量值75导致请求 16:1 压缩。 质量值100导致要求进行无损压缩。

对于MNG和PNG图像格式,质量值设置zlib压缩级别(quality / 10)和过滤器类型(quality % 10)。 压缩级别从0(最快压缩)到100(最佳但最慢)。 对于0级压缩,使用仅霍夫曼策略,这是最快的,但不一定是最坏的压缩。

如果filter-type(过滤类型)为4或更小,则指定的filter-type用于所有扫描线(scanlines):

0: none
1: sub
2: up
3: average
4: Paeth

如果filter-type为5,则当质量大于50并且图像没有颜色图时使用自适应滤波,否则不使用滤波。

如果filter-type为6,则使用具有最小绝对值之和的自适应过滤。

仅当输出为MNG时,如果过滤器类型为7,则使用LOCO颜色转换和具有最小绝对值之和的自适应过滤。

默认值为75,这意味着使用自适应滤波几乎可获得最佳压缩效果。 由于压缩始终是无损的,因此质量设置对PNG和MNG图像的外观没有影响。

有关更多信息,请参见PNG规范

-sample

使用像素采样缩放图像

有关 geometry 规范的详细信息,请参见-geometry。如果存在-filter选项,则-sample将忽略-filter 。偏移(如果存在于-geometry中)将被忽略,-gravity选项不起作用。

-thumbnail

调整图像大小(快速)

格式:

-thumbnail <width>x<height>{%}{@}{!}{<}{>}

-thumbnail 尽可能快地调整图像大小,而不是图像质量,因此更关注速度。 无论如何,由此产生的图像质量对于许多用途应该是可以接受的。 它主要用于生成较小版本的图像,但也可以用于放大图像。 -thumbnail geometry参数遵循与-resize相同的语法和规则(而 -resize-geometry 相同 )。

-profile

将ICM,IPTC或通用配置文件(profile)添加到映像

格式:

-profile <filename>

-profile filename 将ICM(ICC颜色管理),IPTC(通讯信息)或通用(包括Exif)profile 添加到图像

使用 +profile icm, +profile iptc, 或 +profile profile_name 删除相应的配置文件。 可能会列出多个配置文件,以逗号分隔。 可以通过在名称之前加上一个感叹号来将其从随后列出的匹配项中排除。 例如,+profile '!icm,*' 将除去ICM配置文件以外的所有配置文件。 使用identify -verbose查找图像文件中的配置文件。 使用 +profile "*" 删除所有配置文件。

将图像写入不支持配置文件的格式当然也会导致所有配置文件被删除。 JPEG和PNG格式将存储已读取但未删除的所有配置文件。 在JPEG中,它们存储在APP1标记中,在PNG中,它们以十六进制编码的二进制形式存储在压缩的zTXt块中,除了iCC块存储在iCCP块中。

要提取配置文件,不使用-profile选项。 相反,只需将文件写入图像格式,例如APP1、8BIM,ICM或IPTC。例如,要提取Exif数据(存储在APP1配置文件的JPEG文件中),请使用

gm convert cockatoo.jpg exifdata.app1

请注意,GraphicsMagick不会尝试更新任何配置文件以反映对图像所做的更改,例如,从纵向旋转到横向,因此保留的配置文件可能包含无效数据。

使用google的guetzli压缩图片

google/guetzli: Perceptual JPEG encoder

请注意,Guetzli旨在用于高品质图像。您应该始终倾向于提供未压缩的图像(例如尚未使用任何JPEG编码器压缩的图像,包括Guetzli)。

利用ffmpeg将mp4转换为gif

方法一: 直接将视频转换为gif

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 将整个small.mpr转换为gif (生成的gif相对较大)
ffmpeg -i small.mp4 small.gif

# -r 设置帧率,记录操作步骤的gif使用3,其他gif选择5(体积小很多)
ffmpeg -i input.mp4 -r 5 output.gif

# 设置gif图片大小以及帧率。结合 -s ,gif会小很多,同时帧率可以适当提高
ffmpeg -i input.mp4 -s 200*300 -r 5 output.gif

# -s用于设定分辨率,-b:v设定视频比特率来压缩大小
ffmpeg  -i S70131-15433307.mp4 -s 272x480 -b:v 200k output1.mp4

# 从视频第2秒开始,截取3秒片段为gif
ffmpeg -t 3 -ss 00:00:02 -i small.webm small-clip.gif

# 转换为高质量的gif
ffmpeg -i small.mp4 -b 2048k small.gif

方法二: 先转换为图片,再利用convert转换为 gif

1
2
3
4
5
# 每10帧每秒(会很大)
ffmpeg -i input.mp4 -r 10 output%05d.png

# 再利用Imagemagick的convert工具转换为gif
convert output*.png output.gif

在第一步时指定目录:

1
2
3
mkdir /tmp/gif/

ffmpeg -i input.mp4 -r 10 /tmp/gif/output%04d.png

资料

ImageMagick资料

GraphicsMagick资料

命令行参数,说明文档

其他

您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录