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