Java圖片處理的類庫:SimpleImage

介紹

Java下處理圖形是一件很頭疼的工作, 這方面Java雖然提供了JAI/ImageIO API組件讓程序員可以完成大量的操作, 但是, 由於固有一些缺陷, 導致應用的穩定性/常用功能受到極大的影響。 另外一些C/C++製作的圖形庫存在各種各樣的問題, 比如由之封裝的Java API JImageMagic, 稍微大點壓力的羣集可能每天造成數次的崩潰 。

SimpleImage是阿里巴巴的一個Java圖片處理的類庫,可以實現圖片縮略、水印等處理。

SimpleImage中的ImageRender是圖片處理的基類,它是一個抽象類,我們看到,該類中定義了一個抽象方法render(),同時持有一個對ImageRender類的引用。

ReadRedner可以理解成一個組件,不是一個裝飾者,因爲ReadRender是所有渲染操作的第一步。 其他的子類DrawTextRender(水印處理),ScaleRender(縮略處理),WriterRender(輸出)都是裝飾者。

使用示例

[java] 預覽複製
  1. package cn.wuzhuti;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import org.apache.commons.io.IOUtils;  
  7. import com.alibaba.simpleimage.ImageRender;  
  8. import com.alibaba.simpleimage.SimpleImageException;  
  9. import com.alibaba.simpleimage.render.ReadRender;  
  10. import com.alibaba.simpleimage.render.ScaleParameter;  
  11. import com.alibaba.simpleimage.render.ScaleRender;  
  12. import com.alibaba.simpleimage.render.WriteRender;  
  13.   
  14. public class Example {  
  15.   
  16.     public static void main(String[] args) {   
  17.         File in = new File("d:/source.jpg");      //原圖片  
  18.         File out = new File("d:/dest.jpg");       //目的圖片  
  19.         ScaleParameter scaleParam = new ScaleParameter(10241024);  //將圖像縮略到1024x1024以內,不足1024x1024則不做任何處理  
  20.           
  21.         FileInputStream inStream = null;  
  22.         FileOutputStream outStream = null;  
  23.         WriteRender wr = null;  
  24.         try {  
  25.             inStream = new FileInputStream(in);  
  26.             outStream = new FileOutputStream(out);  
  27.             ImageRender rr = new ReadRender(inStream);  
  28.             ImageRender sr = new ScaleRender(rr, scaleParam);  
  29.             wr = new WriteRender(sr, outStream);  
  30.           
  31.             wr.render();                            //觸發圖像處理  
  32.         } catch(Exception e) {  
  33.             e.printStackTrace();  
  34.         } finally {  
  35.             IOUtils.closeQuietly(inStream);         //圖片文件輸入輸出流必須記得關閉  
  36.             IOUtils.closeQuietly(outStream);  
  37.             if (wr != null) {  
  38.                 try {  
  39.                     wr.dispose();                   //釋放simpleImage的內部資源  
  40.                 } catch (SimpleImageException ignore) {  
  41.                     // skip ...   
  42.                 }  
  43.             }  
  44.         }  
  45.     }  
  46. }  

項目地址

依賴jar

commons-io.jar  下載地址

jai_codec.jar 下載地址

jai_core.jar 下載地址

常見問題

1.Linux系統下異常。

項目在windows中使用沒有問題,而到Linux系統中,出現:

java.lang.NoClassDefFoundError:

Could not initializeclass sun.awt.image.code.JPEGImageEncoderImpl

這是因爲java虛擬機在處理圖片時,需要本地的x-server的支持;解決方案如下:

在java啓動時加上參數:-Djava.awt.headless=true

例如:我們在啓動tomcat時,在啓動命令行裏面加上這個參數即可。

或者在tomcat的catalina.sh中添加參數:

[shell] 預覽複製
  1. ...  
  2. # LOGGING_CONFIG (Optional) Override Tomcat's logging config file  
  3. # Example (all one line)  
  4. # LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"  
  5. #  
  6. # LOGGING_MANAGER (Optional) Override Tomcat's logging manager  
  7. # Example (all one line)  
  8. # LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"  
  9. # -----------------------------------------------------------------------------  
  10.   
  11. JAVA_OPTS="-Djava.awt.headless=true" #啓動參數  
  12.   
  13. # OS specific support. $var _must_ be set to either true or false.  
  14. cygwin=false  
  15. darwin=false  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章