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,省卻了配置來配置去的問題。