介紹
Java下處理圖形是一件很頭疼的工作, 這方面Java雖然提供了JAI/ImageIO API組件讓程序員可以完成大量的操作, 但是, 由於固有一些缺陷, 導致應用的穩定性/常用功能受到極大的影響。 另外一些C/C++製作的圖形庫存在各種各樣的問題, 比如由之封裝的Java API JImageMagic, 稍微大點壓力的羣集可能每天造成數次的崩潰 。
SimpleImage是阿里巴巴的一個Java圖片處理的類庫,可以實現圖片縮略、水印等處理。
SimpleImage中的ImageRender是圖片處理的基類,它是一個抽象類,我們看到,該類中定義了一個抽象方法render(),同時持有一個對ImageRender類的引用。
ReadRedner可以理解成一個組件,不是一個裝飾者,因爲ReadRender是所有渲染操作的第一步。 其他的子類DrawTextRender(水印處理),ScaleRender(縮略處理),WriterRender(輸出)都是裝飾者。
使用示例
- package cn.wuzhuti;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import org.apache.commons.io.IOUtils;
- import com.alibaba.simpleimage.ImageRender;
- import com.alibaba.simpleimage.SimpleImageException;
- import com.alibaba.simpleimage.render.ReadRender;
- import com.alibaba.simpleimage.render.ScaleParameter;
- import com.alibaba.simpleimage.render.ScaleRender;
- import com.alibaba.simpleimage.render.WriteRender;
- public class Example {
- public static void main(String[] args) {
- File in = new File("d:/source.jpg"); //原圖片
- File out = new File("d:/dest.jpg"); //目的圖片
- ScaleParameter scaleParam = new ScaleParameter(1024, 1024); //將圖像縮略到1024x1024以內,不足1024x1024則不做任何處理
- FileInputStream inStream = null;
- FileOutputStream outStream = null;
- WriteRender wr = null;
- try {
- inStream = new FileInputStream(in);
- outStream = new FileOutputStream(out);
- ImageRender rr = new ReadRender(inStream);
- ImageRender sr = new ScaleRender(rr, scaleParam);
- wr = new WriteRender(sr, outStream);
- wr.render(); //觸發圖像處理
- } catch(Exception e) {
- e.printStackTrace();
- } finally {
- IOUtils.closeQuietly(inStream); //圖片文件輸入輸出流必須記得關閉
- IOUtils.closeQuietly(outStream);
- if (wr != null) {
- try {
- wr.dispose(); //釋放simpleImage的內部資源
- } catch (SimpleImageException ignore) {
- // skip ...
- }
- }
- }
- }
- }
項目地址
依賴jar
commons-io.jar 下載地址
jai_codec.jar 下載地址
jai_core.jar 下載地址
常見問題
1.Linux系統下異常。
項目在windows中使用沒有問題,而到Linux系統中,出現:
java.lang.NoClassDefFoundError:
Could not initialize
class
sun.awt.image.code.JPEGImageEncoderImpl
這是因爲java虛擬機在處理圖片時,需要本地的x-server的支持;解決方案如下:
在java啓動時加上參數:-Djava.awt.headless=true
例如:我們在啓動tomcat時,在啓動命令行裏面加上這個參數即可。
或者在tomcat的catalina.sh中添加參數:
- ...
- # LOGGING_CONFIG (Optional) Override Tomcat's logging config file
- # Example (all one line)
- # LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
- #
- # LOGGING_MANAGER (Optional) Override Tomcat's logging manager
- # Example (all one line)
- # LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
- # -----------------------------------------------------------------------------
- JAVA_OPTS="-Djava.awt.headless=true" #啓動參數
- # OS specific support. $var _must_ be set to either true or false.
- cygwin=false
- darwin=false