Java图片处理的类库:SimpleImage
2016-04-27 14:08
513 查看
介绍
Java下处理图形是一件很头疼的工作, 这方面Java虽然提供了JAI/ImageIO API组件让程序员可以完成大量的操作, 但是, 由于固有一些缺陷, 导致应用的稳定性/常用功能受到极大的影响。 另外一些C/C++制作的图形库存在各种各样的问题, 比如由之封装的Java API JImageMagic, 稍微大点压力的群集可能每天造成数次的崩溃。
SimpleImage是阿里巴巴的一个Java图片处理的类库,可以实现图片缩略、水印等处理。
SimpleImage中的ImageRender是图片处理的基类,它是一个抽象类,我们看到,该类中定义了一个抽象方法render(),同时持有一个对ImageRender类的引用。
ReadRedner可以理解成一个组件,不是一个装饰者,因为ReadRender是所有渲染操作的第一步。 其他的子类DrawTextRender(水印处理),ScaleRender(缩略处理),WriterRender(输出)都是装饰者。
使用示例
[java] 预览复制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 initializeclass
sun.awt.image.code.JPEGImageEncoderImpl
这是因为java虚拟机在处理图片时,需要本地的x-server的支持;解决方案如下:
在java启动时加上参数:-Djava.awt.headless=true
例如:我们在启动tomcat时,在启动命令行里面加上这个参数即可。
或者在tomcat的catalina.sh中添加参数:
[shell] 预览复制
...
# 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
相关文章推荐
- java运行本地命令
- Java SpringMVC项目导出excel多种类对应工具类整理(util)
- Java中的两个关键字——super、this
- Java之设计模式
- Java三大框架入门-struts2入门(一)
- 利用myeclipse建立webservice服务端和客户端
- Spring Aop和websocket
- 数字签名
- Spring MVC坑汇总+Stackoverflow巧解答
- 通过eclipse生成doc
- final关键字用于String时的一个问题
- 使用MyEclipse格式化JSP设置
- Spring注解详解
- 练习springMVC的一个小例子,为了方便以后继续学习springmvc和别的框架整合
- SpringMVC @RequestBody接收Json对象字符串
- 设计模式之单例详解
- java IO流操作文章
- 415 Unsupported Media Type
- Java内存机制
- java中的String类常量池详解