ImageMagick高清壓縮圖片-GraphicsMagick+im4java
之前有寫過imageMagick壓縮圖片的文章,但是那篇文章中用到的是jmagick。
JMagick是一個開源API,利用JNI(Java Native Interface)技術實現了對ImageMagick API的Java訪問接口,因此也將比純Java實現的圖片操作函數在速度上要快。JMagick只實現了ImageMagicAPI的一部分功能,它的發行遵循LGPL協議。
而且jmagick有一個致命的缺點,在web應用中,部署在tomcat服務器中,過一陣子可能出現tomcat crash的問題。由此,我也不建議使用jmagick。
后來參考了javaeye上的文章,發現imageMagick還有其他的接口,那就是im4java。
im4java是ImageMagick的另一個Java開源接口。與JMagick不同之處在于im4java只是生成與ImageMagick相對應的命令行,然后將生成的命令行傳至選中的IM-command(使用java.lang.ProcessBuilder.start()實現)來執行相應的操作。它支持大部分ImageMagick命令,可以針對不同組的圖片多次復用同一個命令行。
這篇文章,我就是主要講解im4java。經過測試,im4java也是能夠高清壓縮圖片,而且它也特別強大,至少一些基本常見的業務都是可以完美實現的。
目前我只寫了一個壓縮方法,當然也是參照其他大神的方法改進的,以符合自己的業務需求。
用im4java,我們需要安裝GraphicsMagick:
GraphicsMagick 是一個用來讀寫、生成超過90種圖像格式的工具集合,支持包括 TIFF, JPEG, JPEG-2000,PNG, PDF, PhotoCD, SVG, 和GIF 等圖像格式。GraphicsMagick 是基于 ImageMagick 開發的。
GraphicsMagick是ImageMagick的一個分支,相對于ImageMagick而言,TA處理速度更快,消耗資源更少。
GraphicsMagick官網:http://www.graphicsmagick.org/index.html
GraphicsMagick-API:http://www.graphicsmagick.org/convert.html
直接下載最新版的GraphicsMagick,安裝即可。
在你的程序里,我們只要調用im4java壓縮的工具類就行。
返回值你可以自定義,一般返回壓縮后的路徑。
附上源碼:
/* 根據尺寸縮放圖片 * * @author tanjun * @date 2013年9月6日 * @param path * 源圖路徑 * @param width * 壓縮后寬度 * @param height * 壓縮后高度 * @param type * 1為像素,2為百分比處理,如(像素大小:1024x1024,百分比:50%x50%) * @return * @throws Exception */ public static String createThumbnail(String path,int width, int height,String type) throws Exception { IMOperation op = new IMOperation(); ConvertCmd cmd = new ConvertCmd(true); String newFileName=null; //文件名前綴 String prevFileName=null; try { op.addImage(); String raw = ""; if("1".equals(type)){ //按像素 raw = width+"x"+height+"!"; prevFileName=width + "x" + height + "_"; }else{ //按百分比 raw = width+"%x"+height+"%"; prevFileName=width + "%x" + height + "%_"; } //壓縮 op.addRawArgs("-thumbnail", raw); //圖片質量 op.addRawArgs("-quality", "100"); op.addImage(); //系統類型 String osName = System.getProperty("os.name").toLowerCase(); if (osName.indexOf("win") != -1) { // linux下不要設置此值,不然會報錯 cmd.setSearchPath(DspConfigHolder.getProperty("imageMagickPath")); } //讀取配置文件:工程路徑 String filePath = DspConfigHolder.getProjectAbsPath() + path; String fpath[]=filePath.split("/"); //原圖名稱 String oldFileName=fpath[fpath.length-1]; //壓縮圖名稱 String fileName=IdCreater.newId()+getImgSuffix(oldFileName);; //壓縮后的新文件名 newFileName= prevFileName+ fileName; //新文件路徑 String newfile=filePath.replace(oldFileName, newFileName); //壓縮 cmd.run(op, filePath, newfile); } catch (Exception e) { e.printStackTrace(); throw new Exception(MessageUtil.getMessage("thumbnailimage.error")); } return DspConfigHolder.getImgUploadPath()+newFileName; }你的 GraphicsMagick安裝路徑:
DspConfigHolder.getProperty("imageMagickPath");//我這里是配置在properties文件中
##image安裝路徑(linux下不需要此項) imageMagickPath=C:\\Program Files\\GraphicsMagick-1.3.18-Q8好了,以上就是利用 GraphicsMagick+im4java 來高清壓縮圖片。
我們不再使用jmagick,省卻了配置來配置去的問題。