高清缩略图之GraphicsMagick

GraphicsMagick号称图像处理领域的瑞士军刀,也称命令行版的Photoshop, 短小精悍的代码却提供了一个超棒、高效的工具和库集合,来处理图像的读取、写入和操做,支持超过88中图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。 html

经过使用OpenMP但是利用多线程进行图片处理,加强了经过扩展CPU提升处理能力。 前端

GraphicsMagick能够再绝大多数的平台上使用,Linux、Mac、Windows都没有问题。 java

GraphicsMagick支持大图片的处理,而且已经作过GB级别的图像处理实验。GraphicsMagick可以动态的生成图片,特别适用于互联网的应用。能够用来处理调整尺寸、旋转、加亮、颜色调整、增长特效等方面。GaphicsMagick不只支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、Ruby等的调用。事实上,GraphicsMagick是从 ImageMagick 5.5.2 分支出来的,可是它比ImageMagick更稳定、更快。目前不少大型网站的图片处理都用了GraphicsMagick,例如淘宝等网站。如下简单介绍一下GraphicsMagick的用法。 linux

1、安装 git

从GraphicsMagick的官方网站http://www.graphicsmagick.org/下载最新版本,目前最新版为v1.3.17 github

我这里下载的是windows版本,双击exe文件安装完成。(若是是在linux下安装,直接输入sudo apt-get install GraphicsMagick 便可) windows

2、命令行使用方法 浏览器

如下例子来源http://hi.baidu.com/thinkinginlamp/item/753d86383545d10fcfb9fe14 session

先上一个原始图片(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

3、在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,这个工具不只仅功能强大,并且处理效率很是高。

相关文章
相关标签/搜索