高清縮略圖之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,這個工具不只僅功能強大,並且處理效率很是高。

相關文章
相關標籤/搜索