介绍
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);
-
- 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();
- } catch (SimpleImageException ignore) {
-
- }
- }
- }
- }
- }
项目地址
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中添加参数:
- ...
-
-
-
-
-
-
-
-
-
- JAVA_OPTS="-Djava.awt.headless=true"
-
-
- cygwin=false
- darwin=false
- os400=false
- case "`uname`" in
- CYGWIN*) cygwin=true;;
- Darwin*) darwin=true;;
- OS400*) os400=true;;
- esac
-
-
- 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
- ...