Java图片处理的类库:SimpleImage

无主题博客 » 编程语言 » Java » Java图片处理的类库:SimpleImage

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 ... 
                }
            }
        }
    }
}

项目地址

https://github.com/alibaba/simpleimage

依赖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
    os400=false
    case "`uname`" in
    CYGWIN*) cygwin=true;;
    Darwin*) darwin=true;;
    OS400*) os400=true;;
    esac
    
    # resolve links - $0 may be a softlink
    PRG="$0"
    
    while [ -h "$PRG" ]; do
     ls=`ls -ld "$PRG"`
     link=`expr "$ls" : '.*-> \(.*\)$'`
     if expr "$link" : '/.*' > /dev/null; then
     PRG="$link"
     else
     PRG=`dirname "$PRG"`/"$link"
     fi
    done

发表评论

电子邮件地址不会被公开。 必填项已用*标注