高清缩略图之GraphicsMagick

余生长醉 提交于 2019-11-27 06:41:01

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,这个工具不仅仅功能强大,而且处理效率非常高。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!