GraphicsMagick是非常强大的图片处理工具。支持超过88中图片格式,包含 DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM, TIFF这些常用的格式。图片分享网站Flickr和电商Etsy这两家公司用的就是GraphicsMagick。

安装

windows可以从这个FTP下载可执行安装程序:ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/windows/

同时安装包我上传到百度云中,还有一些测试用的图片:
链接: https://pan.baidu.com/s/1nwLh4hF 密码: v7yt

常用命令

GraphicsMagick包含了许多子命令,常用命令有:

  • convert:转换图片格式和大小,同时叠加变换操作(裁减,模糊等)
  • composite:合并多张图片为一张图片

convert命令

把一种格式的一张图片转换为另外一种格式的图片,在转换同时可以应用图片操作。

语法:

1
gm convert [ options ... ] input_file [ options ... ] output_file

convert命令例子

缩略图:

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

参数说明:

  1. -size 120x120并不是指定原图格式,而是提示JPEG decoder只需要120x120的处理即可,这样在图片解码给缩略图操作的时候就可能不用完整的信息,从而加速命令的执行。
  2. -resize 120x120指定输出的图片的尺寸,这里不会强制缩放图片到120x120,而是把长边缩小为120。
  3. +profile "*"'指定移除ICM, EXIF, IPTC或者其他图片扩展信息,这样可以减小生成的缩略图的大小

-resize参数

1
-resize <width>x<height>{%}{@}{^}{!}{<}{>}

默认情况下,widthheight指的是最大值,并且会保持原图的长宽比。也就是说图片缩放会,会最大化的占用width*height这个区域。可以想象为,使用width*height画了一个矩形,gm会缩放图片,使图片面积最大,但是又能放入这个矩形中。也就是图片的至少有一个边,与这个矩形对应的边长度相等。

如果在尺寸后面追加^,表示widthheight指的是最小值,并且会保持原图的长宽比。可以想象为,使用width*height画了一个矩形,gm会缩放图片,使图片面积最小,但是又能占满这个矩形。

如果在尺寸后面追加!,表示不保留原图的长宽比,强制缩放为widthheight指定的值。

如果只指定了width并且没有跟随x,则height的值会设置为与width一样。-resize 10-resize 10x10是一样的。

如果指定为<width>x或者x<height>,则宽/高使用对应的值,另外一条边根据原图长宽比计算出。

如果在尺寸后面追加%,则使用比例的方式计算尺寸。

如果在尺寸后面追加@,表示尺寸指的是最大的面积大小,gm保证缩放后的图片的width*height小于等于这个面积。

有一种很常见的需求,比如要求图片缩放为640x480如果图片本身小于这个尺寸了,就不动,只把大于这个尺寸的图片缩放。><这两个后缀就是用于处理这种需求的。

如果在尺寸后面追加>,表示图片的长度或者宽度大于指定的尺寸才进行处理。

如果在尺寸后面追加<,表示图片的长度或者宽度小于指定的尺寸才进行处理。

上面说的需求可以使用640x480>来实现。这样如果图片尺寸是256x256就不会处理,如果是512x512或者1024x1024就会被缩放为480x480

-resize的参数应该使用双引号括起来,以免被shell解读。

convert命令中,-resize参数作用与-geometry作用一样。

文字水印:

1
gm convert -gravity southeast -font ArialBold -pointsize 45 -fill red  -draw "text 10,10 hello" input.jpg output.png

参数说明:

  1. -gravity southeast 指定右下角水印
  2. -font ArialBold 指定字体
  3. -pointsize 45 指定文字大小
  4. -fill red 指定文字颜色
  5. -draw "text 10,10 hello" 指定文字颜色和位置

convert命令其他常用参数

  • -quality <value>
    设置JPEG/MIFF/PNG/TIFF格式图片的压缩级别

composite命令

语法:

1
gm composite [ options ... ] change-image base-image [ mask-image ] output-image

composite命令例子

图片叠加(把a叠加到base上):

1
gm composite a.png base.png output.png

图片水印:

1
gm composite -gravity southeast -geometry +50+50 -dissolve 50 watermark.jpg input.jpg output.png

参数说明:
-gravity southeast:设置坐标轴原点到左下角
-geometry +50+50:偏移50,50
-dissolve 50:不透明度50

-gravity参数

1
-gravity <type>

gravity参数用于指定change-image叠加在base-image的什么位置。

有9个位置可以选择,可以联想骰子上的9点:NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast.

默认的位置是NorthWest,也就是左上角。

-geometry参数

1
-geometry {+-}<x>{+-}<y>

-geometry是一个很强大的参数,在不同的命令中有不同的效果。在convert命令中,他用于缩放图片。而在composite命令中,他用于指定change-image的偏移。

+x+y表示横向正向偏移x,纵向正向偏移y。偏移的方向与gravity参数有关。

如果gravity参数的取值为NorthEast, East, SouthEast,则x表示change-image右边与base-image右边的距离。其他情况表示x表示change-image左边与base-image左边的距离。

如果gravity参数的取值为SouthWest, South, SouthEast,则y表示change-image下边与base-image下边的距离。其他情况表示x表示change-image上边与base-image上边的距离。

偏移量不受%号影响。只支持像素单位。

参考资料