用Java的ImageIO处理一个大于15M的JPG文件,内存溢出。php
因而寻求新的解决方案,用ImageMagicK,发现处理图片速度不使人满意,因而切换至GraphicsMagicK,以下是总结。java
“GraphicsMagick is a fork of ImageMagick. GraphicsMagick has a number of advantages compared to ImageMagick, the most prominent is it's superior performance.” -from im4java development guide.app
以下是快速的总结:ide
GraphicsMagick(gm)是ImageMagick(im)派生出来的,性能好。性能
gm和im都须要安装依赖的库,才能处理如jpeg,png图片。测试
依赖的库有:zlib-1.2.8.tar.gz;libpng-1.6.23.tar.gz;jpegsrc.v9b.tar.gz, 须要首先安装。ui
ImageMagick安装直接能够用yum安装,如 list|grep -i imagemagickthis
GraphicsMagick安装须要本地编译安装,首先执行./configure 看看最后有没有png, jpeg, zlib.(重要)spa
GraphicsMagick与ImageMagick的安装相互独立,但依赖的包相同。code
性能上,15Mjpg文件resize,gm快~20%(4U, 4G), 而在一台性能较差的虚拟机gm要比im快6倍(2U,1G),
图片越大,resize的尺寸越大,性能差异越明显。机器配置相差越大,性能差异越大。
性能测试对比
在一台2U1G VirtualBox Linux下resize一个15M的jpg图片。分别用gm和im进行操做,而后对比。
[root@testserver image]# uname -a
Linux testserver 2.6.32-431.el6.i686 #1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
[root@testserver image]# free -m
total used free shared buffers cached
Mem: 1178 458 719 0 17 302
-/+ buffers/cache: 138 1039
Swap: 2015 137 1878
[root@testserver image]# gm identify test-bigjpg.jpg
test-bigjpg.jpg JPEG 9864x13703+0+0 DirectClass 8-bit 14.8Mi 0.000u 0:01
resize 操做对比:
[root@testserver image]# ./test.sh test-bigjpg.jpg 2048
elapsed 25s using gm
elapsed 154s using im
Identify -verbose 操做对比:
[root@testserver image]# identify -verbose 1464755573477_45.jpg
Image: 1464755573477_45.jpg
Format: JPEG (Joint Photographic Experts Group JFIF format)
Class: DirectClass
Geometry: 13925x6459+0+0
Resolution: 200x200
Print size: 69.625x32.295
Units: PixelsPerInch
Type: ColorSeparation
Endianess: Undefined
Colorspace: CMYK
Depth: 8-bit
.....//此处省略
User time: 5.940u
Elapsed time: 0:34.689
Version: ImageMagick 6.7.2-7 2016-05-09 Q16 http://www.imagemagick.org
[root@testserver image]# gm identify -verbose 1464755573477_45.jpg
Image: 1464755573477_45.jpg
Format: JPEG (Joint Photographic Experts Group JFIF format)
Geometry: 13925x6459
Class: DirectClass
Type: color separated
Depth: 8 bits-per-pixel component
... //此处省略
User Time: 6.580u
Elapsed Time: 0:08
Pixels Per Second: 11.8Mi
附上测试脚本的代码:
#!/bin/sh starttime=`date '+%s'` gm convert $1 -resize $2 $1.resize$2.jpg stoptime=`date '+%s'` echo elapsed `expr $stoptime - $starttime`s using gm starttime=`date '+%s'` convert $1 -resize $2 $1.resize$2.jpg stoptime=`date '+%s'` echo elapsed `expr $stoptime - $starttime`s using im
Im4java
Im4java同时支持GM 和 IM
With im4java, you have three options if you want to use GraphicsMagick:
Reference:
GraphicsMagick: http://www.graphicsmagick.org/
ImageMagick:http://www.imagemagick.org/script/index.php
Delegatge lib: ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates/