GraphicsMagick号称图像处理领域的瑞士军刀,也称命令行版的Photoshop, 短小精悍的代码却提供了一个超棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过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是从 ImageMagick 5.5.2 分支出来的,但是它比ImageMagick更稳定、更快。目前很多大型网站的图片处理都用了GraphicsMagick,例如淘宝等网站。以下简单介绍一下GraphicsMagick的用法。
一、安装
从GraphicsMagick的官方网站http://www.graphicsmagick.org/下载最新版本,目前最新版为v1.3.17
我这里下载的是windows版本,双击exe文件安装完成。(如果是在linux下安装,直接输入sudo apt-get install GraphicsMagick 即可)
二、命令行使用方法
以下例子来源http://hi.baidu.com/thinkinginlamp/item/753d86383545d10fcfb9fe14
先上一个原始图片(input.jpg:160x120),以后的各个例子都会用到它:
BTW:列位看官现在可以咽口水了。
缩略图1
gm convert input.jpg -thumbnail '100x100' output_1.jpg
实际生成的图片大小是:100x75,也就是说说按此命令,会保持图片比例不变生成缩略图。这样很不错,但是有一个潜在的问题:我们不能简单明了的知道图片的最终大小,结果是前端显示的时候,无法设置img标签的width和height属性,如果我没记错的话,一般是推荐设定width和height属性的,否则浏览器渲染起来可能会稍稍慢一点。
缩略图2
gm convert input.jpg -thumbnail '100x100!' output_2.jpg
这次实际生成的图片大小按定义来,但图片变形了,有时候这是不能接受的。
缩略图3
gm convert input.jpg -thumbnail '100x100^' \
-gravity center -extent 100x100 output_3.jpg
这次不仅保证了大小,还保证了比例。不过图片经过了裁剪。
缩略图4
gm convert input.jpg -thumbnail '100x100' \
-background gray -gravity center -extent 100x100 output_4.jpg
这次不仅保证了大小,还保证了比例,同时没有对图片进行任何裁剪,多余的部分按指定颜色进行填充。
缩略图5
gm convert input.jpg -thumbnail '10000@' \
-background gray -gravity center -extent 100x100 output_5.jpg
这次保证了大小和比例,其中的10000就是100x100的乘积,同时在填充和裁剪之间做了一个平衡。
明白了以上几个例子,缩略图基本就能通吃了,肯定有一种会适合你的需求。GraphicsMagick的资料非常少,但好消息是GraphicsMagick和ImageMagick的用法基本兼容,所以你可以通过ImageMagick的资料来套用。
更多的命令请看http://www.graphicsmagick.org/utilities.html
三、在java程序中使用GraphicsMagick
GraphicsMagick没有提供java接口,如果需要在java中使用GraphicsMagick,一种方法是用JNI技术,在java中调用GraphicsMagick的C++接口,JMagick就是使用JNI技术实现 的,但JMagick只能调用部分GraphicsMagick功能。另一种方法是在java中通过Runtime对象在命令行中启动GraphicsMagick,从而使用GraphicsMagick的功能。从效率上来说,第二种方法的效率比第一种的低,但第二种方法可以使用GraphicsMagick的所有功能。im4java是ImageMagick的另一个Java开源接口。与JMagick不同之处在于im4java只是生成与ImageMagick相对应的命令行,然后将生成的命令行传至选中的IM-command(使用java.lang.ProcessBuilder.start()实现)来执行相应的操作。它支持大部分ImageMagick命令,可以针对不同组的图片多次复用同一个命令行。
im4java可以在mvn仓库中找到,也可以到github下载,github地址为:https://github.com/Widen/im4java
以下是使用im4java和GraphicsMagick生成高清缩略图的代码示例:
1.根据坐标裁剪图片
/**
* 根据坐标裁剪图片
*
* @param srcPath 要裁剪图片的路径
* @param newPath 裁剪图片后的路径
* @param x 起始横坐标
* @param y 起始挫坐标
* @param x1 结束横坐标
* @param y1 结束挫坐标
*/
public static void cutImage(String srcPath, String newPath, int x, int y, int x1,
int y1) throws Exception {
int width = x1 - x;
int height = y1 - y;
GMOperation op = new GMOperation();
op.addImage(srcPath);
/**
* width:裁剪的宽度
* height:裁剪的高度
* x:裁剪的横坐标
* y:裁剪的挫坐标
*/
op.crop(width, height, x, y);
//设置输出的图片压缩比,有效值范围是0.0-100.0,数值越大,缩略图越清晰
op.quality(95.0);
op.addImage(newPath);
//如果使用ImageMagick,设为false,使用GraphicsMagick,就设为true,默认为false
ConvertCmd convert = new ConvertCmd(true);
//linux下不要设置此值,不然会报错
convert.setSearchPath("C:\\Program Files\\GraphicsMagick-1.3.17-Q16");
convert.run(op);
}
2.根据尺寸缩放图片
/**
* 根据尺寸缩放图片
* @param width 缩放后的图片宽度
* @param height 缩放后的图片高度
* @param srcPath 源图片路径
* @param newPath 缩放后图片的路径
*/
public static void cutImage(int width, int height, String srcPath, String newPath) throws Exception{
GMOperation op = new GMOperation();
op.addImage(srcPath);
op.resize(width, height);
op.quality(95.0);
op.addImage(newPath);
//如果使用ImageMagick,设为false,使用GraphicsMagick,就设为true,默认为false
ConvertCmd convert = new ConvertCmd(true);
//linux下不要设置此值,不然会报错
convert.setSearchPath("C:\\Program Files\\GraphicsMagick-1.3.17-Q16");
convert.run(op);
}
3.给图片加水印
/**
* 给图片加水印
* @param srcPath 源图片路径
*/
public static void addImgText(String srcPath) throws Exception {
GMOperation op = new GMOperation();
op.font("宋体").gravity("southeast").pointsize(18).fill("#BCBFC8").draw("这是一个水印");
op.addImage();
op.addImage();
ConvertCmd convert = new ConvertCmd(true);
//linux下不要设置此值,不然会报错
convert.setSearchPath("C:\\Program Files\\GraphicsMagick-1.3.17-Q16");
convert.run(op,srcPath,srcPath);
}
总结:如果网站需要进行大量的图片处理操作,建议使用GraphicsMagick,这个工具不仅仅功能强大,而且处理效率非常高。
来源:oschina
链接:https://my.oschina.net/u/179588/blog/90188