GraphicsMagick+im4java實現高質量大圖的處理

jopen 11年前發布 | 124K 次閱讀 im4java 圖形/圖像處理

做網站往往需要處理各種各樣的圖片,對于jdk自帶的一套圖片處理庫,他的特點是穩定簡單,但是對圖片處理來說,性能確實很不咋的!
        于是我轉向了以C++處理為核心的java處理包—— JMagick+ ImageMagick 。jmagick是一個開源的API,利用JNI(Java Native Interface)技術實現了對ImageMagickAPI 的Java訪問接口,因此也將比純Java實現的圖片操作函數在速度上要快。實地測試后發現,速度果然提高了不少,但是質量卻大大下降了,在大量測試數據下,每生成100張圖片約會有5張圖片生成出現錯誤,還會出現down機的情況。對于一個商業應用來說,這個是絕對不可以接受的,于是對jmagick的研究暫放一段時間。
        經過韓boss指導,我轉向了 GraphicsMagick+im4java 的研究,輸入關鍵詞google一下,很容易就可以找到http://javantsky.iteye.com/blog/747807 ,這篇博客,文章介紹GraphicsMagick+im4java 性能高,運行穩定!

注意事項:如果是在windows下運行,則需要配置ImageMagick的安裝路徑: 
我是配置在config.properties文件里了,比如內容如下所示: 
imageMagickPath=C://Program Files//GraphicsMagick-1.3.14-Q16
如果是在linux平臺下,則不需要配置。

package imageUtils;

import java.io.IOException;
import java.util.ArrayList;

import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;

/**
 * @author hegh E-mail: heguanhua@tjhq.com
 * @version 創建時間:Mar 13, 2012 10:43:12 AM 類說明
 */
public class ImageMagick {

 /** * ImageMagick的路徑 */
  public static String imageMagickPath = null; 
  static{ /**獲取ImageMagick的路徑 */ 
   //Properties prop = new PropertiesFile().getPropertiesFile(); 
   //linux下不要設置此值,不然會報錯
   //imageMagickPath = prop.getProperty("imageMagickPath"); 
  } 

  /** * 根據坐標裁剪圖片
  * @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; 
   IMOperation op = new IMOperation(); 
   op.addImage(srcPath); 
   /**
    * width:裁剪的寬度 
    * height:裁剪的高度 
    * x:裁剪的橫坐標 
    * y:裁剪的挫坐標 
    */ 
   op.crop(width, height, x, y);
   op.addImage(newPath); 
   ConvertCmd convert = new ConvertCmd();
   //linux下不要設置此值,不然會報錯 
   //convert.setSearchPath(imageMagickPath);
   convert.run(op); 
 } 

  /** 
   * 根據尺寸縮放圖片 
   * @param width 縮放后的圖片寬度 
   * @param height 縮放后的圖片高度 
   * @param srcPath 源圖片路徑 
   * @param newPath 縮放后圖片的路徑 
   * @param type 1為比例處理,2為大小處理,如(比例:1024x1024,大小:50%x50%)
   */ 
  public static String cutImage(int width, int height, String srcPath, String newPath,int type,String quality) throws Exception { 
   IMOperation op = new IMOperation();       
   ConvertCmd cmd = new ConvertCmd(true); 
   op.addImage(); 
   String raw = "";
   if(type == 1){
    //按像素
    raw = width+"x"+height+"^";
   }else{
    //按像素百分比
    raw = width+"%x"+height+"%";
   }  
   op.addRawArgs("-sample" ,  raw );   
   if((quality !=null && quality.equals(""))){
    op.addRawArgs("-quality" ,  quality ); 
   }
   op.addImage();   

   String osName = System.getProperty("os.name").toLowerCase();
   if(osName.indexOf("win") != -1) {
    //linux下不要設置此值,不然會報錯
    cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.14-Q16"); 
   }

   try{
    cmd.run(op, srcPath, newPath);        
   }catch(Exception e){
    e.printStackTrace();
   }
   return newPath;
 } 


 /** 
  * 給圖片加水印
  * @param srcPath 源圖片路徑 
  */ 
  public static void addImgText(String srcPath) throws Exception { 
   IMOperation op = new IMOperation();   
   op.font("宋體").gravity("southeast").pointsize(18).fill("#BCBFC8").draw("text 100,100 co188.com");  
   op.addImage(); 
   op.addImage();    

   String osName = System.getProperty("os.name").toLowerCase();    
   ConvertCmd cmd = new ConvertCmd(true); 
   if(osName.indexOf("win") != -1) {
    //linux下不要設置此值,不然會報錯
    cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.14-Q16"); 
   }

   try{
    cmd.run(op, srcPath, srcPath);        
   }catch(Exception e){
    e.printStackTrace();
   }
  } 

  public static void main(String[] args) throws Exception{ 
   //cutImage("D:\\apple870.jpg", "D:\\apple870eee.jpg",98, 48, 370, 320); 
   Long start = System.currentTimeMillis();
   //cutImage(100,100, "e:\\37AF7D10F2D8448A9A5.jpg","e:\\37AF7D10F2D8448A9A5_bak2.jpg",2,"100"); 
   addImgText("e:\\37AF7D10F2D8448A9A5_bak2.jpg"); 
   Long end = System.currentTimeMillis();
   System.out.println("time:"+(end-start)/3600);
  }
}
通過GraphicsMagick+im4java實現高質量大圖的處理,解決了100M以上,以及圖片像素10000以上處理是出現內存溢出的問

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!