xiaobaoqiu Blog

Think More, Code Less

GraphicsMagick

1.介绍

GraphicsMagick 是个图片处理库,是从ImageMagick 5.5.2分支出来的,但是现在他变得更稳定和更轻、更快一些

GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。 通过使用OpenMP可是利用多线程进行图片处理,增强了通过扩展CPU提高处理能力。GraphicsMagick可以再绝大多数的平台上使用,Linux、Mac、Windows都没有问题。

GraphicsMagick支持大图片的处理,并且已经做过GB级别的图像处理实验。GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、Ruby等的调用。

详细见GraphicsMagick官网: http://www.graphicsmagick.org/

2.Ubuntu安装

应该是所有的Unix-like的安装都差不多。

2.1 下载

官网找到最新的release版本的下载地址,这里使用的版本是1.3.20(Released August 16, 2014)。

2.2 安装

下载到本机之后,依次解压,配置,make

1
2
3
4
5
6
7
8
9
xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo tar -xvzf GraphicsMagick-1.3.20.tar.gz

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ cd GraphicsMagick-1.3.20/

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo ./configure

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo make

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo make install

2.3 验证

验证安装是否成功,gm version

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
33
34
35
36
37
38
39
40
41
42
43
44
xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ gm version
GraphicsMagick 1.3.20 2014-08-16 Q8 http://www.GraphicsMagick.org/
Copyright (C) 2002-2014 GraphicsMagick Group.
Additional copyrights and licenses apply to this software.
See http://www.GraphicsMagick.org/www/Copyright.html for details.

Feature Support:
  Native Thread Safe       yes
  Large Files (> 32 bit)   yes
  Large Memory (> 32 bit)  yes
  BZIP                     no
  DPS                      no
  FlashPix                 no
  FreeType                 yes
  Ghostscript (Library)    no
  JBIG                     no
  JPEG-2000                no
  JPEG                     no
  Little CMS               no
  Loadable Modules         no
  OpenMP                   yes (201107)
  PNG                      yes
  TIFF                     no
  TRIO                     no
  UMEM                     no
  WebP                     no
  WMF                      no
  X11                      yes
  XML                      no
  ZLIB                     yes

Host type: x86_64-unknown-linux-gnu

Configured using the command:
  ./configure 

Final Build Parameters:
  CC       = gcc -std=gnu99
  CFLAGS   = -fopenmp -g -O2 -Wall -pthread
  CPPFLAGS = -I/usr/include/freetype2
  CXX      = g++
  CXXFLAGS = -pthread
  LDFLAGS  = -L/usr/lib
  LIBS     = -lfreetype -lpng12 -lXext -lSM -lICE -lX11 -lz -lm -lgomp -lpthread

从上面也可以看到当前系统支持的图片格式。

2.4 安装常见delegates

GraphicsMagick支持很多格式,但是需要安装额外的delegates,常见的delegates见这里

这里以jpeg为例:

1
2
3
4
5
6
7
8
9
xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo wget ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates/jpegsrc.v9.tar.gz

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo tar xvfz jpegsrc.v9.tar.gz

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20/delegates/jpeg-9$ sudo ./configure --enable-shared

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20/delegates/jpeg-9$ sudo make

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20/delegates/jpeg-9$ sudo make install

再次重新安装GraphicsMagick,在configure的时候会发现支持jpeg:

1
2
3
4
5
6
7
8
xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo ./configure
...
JPEG v1           --with-jpeg=yes           yes
...

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo make

xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ sudo make install

碰到的问题:

1
2
xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ gm version
gm: error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory

libjpeg.so.9在/usr/local/lib下面,首先尝试使用LDFALGS指定其路径,发现无效。

google到的解决办法:

1
2
xiaobaoqiu@xiaobaoqiu:/usr/local/lib$ sudo ranlib /usr/local/lib/libjpeg.a
xiaobaoqiu@xiaobaoqiu:/usr/local/lib$ sudo ldconfig /usr/local/lib

之后再重新安装GraphicsMagick就正常了。

关于ranlib的作用见:http://blog.csdn.net/yuntongsf/article/details/6284517

关于ldconfig的作用见:http://blog.csdn.net/wooin/article/details/580679

2.5 常用命令

gm常用的命令如下,详细使用(包括例子)见官网手册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
xiaobaoqiu@xiaobaoqiu:/usr/local/GraphicsMagick/GraphicsMagick-1.3.20$ gm
GraphicsMagick 1.3.20 2014-08-16 Q8 http://www.GraphicsMagick.org/
Copyright (C) 2002-2014 GraphicsMagick Group.
Additional copyrights and licenses apply to this software.
See http://www.GraphicsMagick.org/www/Copyright.html for details.
Usage: gm command [options ...]

Where commands include: 
    animate - animate a sequence of images
      batch - issue multiple commands in interactive or batch mode
  benchmark - benchmark one of the other commands
    compare - compare two images
  composite - composite images together
    conjure - execute a Magick Scripting Language (MSL) XML script
    convert - convert an image or sequence of images
    display - display an image on a workstation running X
       help - obtain usage message for named command
   identify - describe an image or image sequence
     import - capture an application or X server screen
    mogrify - transform an image or sequence of images
    montage - create a composite image (in a grid) from separate images
       time - time one of the other commands
    version - obtain release version

几个常用的命令如下:

2.5.1 显示图片

1
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm display house.jpg

原图如下:

2.5.2 原图信息

获取详细图片信息

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm identify -verbose house.jpg 
Image: house.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Geometry: 480x300
  Class: DirectClass
  Type: true color
  Depth: 8 bits-per-pixel component
  Channel Depths:
    Red:      8 bits
    Green:    8 bits
    Blue:     8 bits
  Channel Statistics:
    Red:
      Minimum:                     0.00 (0.0000)
      Maximum:                   255.00 (1.0000)
      Mean:                      148.47 (0.5822)
      Standard Deviation:         70.25 (0.2755)
    Green:
      Minimum:                     0.00 (0.0000)
      Maximum:                   250.00 (0.9804)
      Mean:                      128.17 (0.5026)
      Standard Deviation:         58.91 (0.2310)
    Blue:
      Minimum:                     0.00 (0.0000)
      Maximum:                   235.00 (0.9216)
      Mean:                      100.93 (0.3958)
      Standard Deviation:         56.00 (0.2196)
  Filesize: 18.1K
  Interlace: No
  Orientation: Unknown
  Background Color: white
  Border Color: #DFDFDF
  Matte Color: #BDBDBD
  Page geometry: 480x300+0+0
  Compose: Over
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  JPEG-Quality: 75
  JPEG-Colorspace: 2
  JPEG-Colorspace-Name: RGB
  JPEG-Sampling-factors: 2x2,1x1,1x1
  Signature: 2bbf2e59864556b88e49e6fcaa7c2a7373fc0b7b28cb7b07dd16904c13ccf328
  Tainted: False
  Elapsed Time: 0:01
  Pixels Per Second: 13.7M

2.5.3 格式转换

需要当前的GraphicsMagick支持的格式,另外支持转换成pdf格式:

1
2
3
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert house.jpg house.png

xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert house.jpg house.pdf

png图片如下:

2.5.4 图片缩放

参数包含新的宽高

1
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert -resize 160x100 house.jpg -quality 90 house_160_100.jpg

缩放效果如下:

2.5.5 图片裁剪

参数格式 : 宽x高+左上角x+左上角y

1
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert -crop 200x200+50+50 house.jpg house_cut_200_200.jpg

裁剪效果如下:

2.5.6 图片旋转

参数为旋转角度,正数为顺时针旋转,负数为逆时针旋转

1
2
3
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert -rotate 90 house.jpg house_rotate_90.jpg

xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert -rotate -90 house.jpg house_rotate_-90.jpg

旋转效果如下:

2.5.7 添加文字

参数包括字体的样式,大小,添加的位置等

1
xiaobaoqiu@xiaobaoqiu:~/Picture/testGraphicsMagick$ gm convert -font Arial -fill red -pointsize 18 -draw "text 50,50 'baoqiu.xiao'" house.jpg house_sign.jpg

效果如下:

2.5.8 添加水印

1
gm composite -geometry +50+50 -gravity southeast watermark.jpg house.jpg house_watermark.jpg

效果如下:

3. IM4JAVA

GraphicsMagicK提供了常见的几种编程API接口,见这里,但是没有java的接口。常见的两个java支持库是JMagick和IM4JAVA。

3.1 JMagick

JMagick下载地址:http://www.jmagick.org/

JMagick存在的问题是有crash的风险,不稳定(见这里),并且存在图片生成错误的问题(见这里).

3.2 IM4JAVA

官方网站 : http://im4java.sourceforge.net/index.html

下载地址 : http://sourceforge.net/projects/im4java/files/

Maven支持:http://mvnrepository.com/artifact/org.im4java/im4java 示例如下:

1
2
3
4
5
<dependency>
    <groupId>org.im4java</groupId>
    <artifactId>im4java</artifactId>
    <version>1.4.0</version>
</dependency>

简单java示例代码:

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
/**
 * 按照规定的尺寸对图片进行缩放
 *
 * @param srcPath         需要缩放的源文件路径
 * @param destinationPath 生成图片的目标路径
 * @param needWidth       需要缩放的宽度
 * @param needHeight      需要缩放的高度
 * @param quality         图片的质量,0~25:差,50~75:中等,75~100高
 * @return
 */
public static void zoom(String srcPath, String destinationPath, int needWidth, int needHeight, int quality) throws FsCommonException {
    // 创建图片转换命令
    ConvertCmd cmd = new ConvertCmd(true);
    IMOperation op = new IMOperation();
    op.addImage(srcPath);
    op.resize(needWidth, needHeight);
    //设置图片质量参数
    if (quality > 0) {
        op.addRawArgs("-quality", String.valueOf(quality));
    }
    op.addImage(destinationPath);
    try {
        cmd.run(op);
    } catch (Exception e) {
        LOGGER.error("缩放图片失败,输入文件:" + srcPath, e);
        ErrorCodeConstants.throwException(ErrorCodeConstants.CUT_FILE_FAIL);
    }
}