JAVA图像压缩,JAI解决之道.

摘要: 继续着前几天弄的影像压缩的东西。对 TIF ,TIFF 文件的压缩,确实很郁闷。后来在网上搜索,都说用JAI去解决。所以到 SUN 公司的官方网站下了这个东西安装,安装后,在JAVA 的 JRE  的  LIB 的 EXT 目录下多了三个JAVA包:jai_codec.jar ,jai_core.jar,mlibwrapper_jai.jar 。前面说过重点时 TIFF 影像的压缩,其他格式的前面已经说过,网上也很多解决方法。对TIFF文件压缩,最开始用了:RenderedOp src = JAI.create("fileload", inputFile); 这种方式去处理. 但最后我发现 SRC 的资源始终不能释放,即使我调用 src.dispose(),也一样不可以,也找不到 close flush等方法。 在网上也有人问同样的问题,至少我没有搜索到答案。

继续着前几天弄的影像压缩的东西。对 TIF ,TIFF 文件的压缩,确实很郁闷。后来在网上搜索,都说用JAI去解决。所以到 SUN 公司的官方网站下了这个东西安装,安装后,在JAVA 的 JRE 的 LIB 的 EXT 目录下多了三个JAVA包:jai_codec.jar ,jai_core.jar,mlibwrapper_jai.jar 。

前面说过重点时 TIFF 影像的压缩,其他格式的前面已经说过,网上也很多解决方法。对TIFF文件压缩,最开始用了:
RenderedOp src = JAI.create("fileload", inputFile); 这种方式去处理. 但最后我发现 SRC 的资源始终不能释放,即使我调用 src.dispose(),也一样不可以,也找不到 close flush等方法。 在网上也有人问同样的问题,至少我没有搜索到答案。

最后尝试下面的方法,用 stream 的方式,因为 stream 可以 close 掉。代码如下,包含了非 TIFF影像的处理,其实非TIFF的也可以用JAI 来处理,这里没有用到。因为我的难点在于TIFF的处理。

//===============以下时通过SUN公司提供的 JAI 来完成图像压缩功能===========
/*
*
* 得到扩展名
*/
public static String getExtension(String filename, String defExt) {
if ((filename != null) && (filename.length() > 0)) {
int i = filename.lastIndexOf('.');

if ((i >-1) && (i < (filename.length() - 1))) {
return filename.substring(i + 1);
}
}
return defExt;
}

public static void RenameFile(String source){
boolean success = (new File(source)).delete();
if(!success){
System.out.println("文件更改名称失败,源资源文件在使用中!");
}
else{
String ext=getExtension(source,"");
File fDest=new File(source+"."+ext);
fDest.renameTo(new File(source));
}

}
/*
* 这里不用转换扩展名和像素大小,直接压缩
*/
public static void CompressImage(String source,String degree) throws FileNotFoundException, IOException, InterruptedException {
System.out.println("开始压缩");
FileSeekableStream stream = new FileSeekableStream(source);
PlanarImage in = JAI.create("stream", stream);
String ext=getExtension(source,"");
OutputStream os = null;

if ( source.endsWith("tif") || source.endsWith("tiff")){
os = new FileOutputStream(source+"."+ext);
TIFFEncodeParam param = new TIFFEncodeParam();
if ("高".endsWith(degree)){
param.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);
}
else if ("中".endsWith(degree)){
param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP3_1D);
}
else if ("低".endsWith(degree)){
param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
}
ImageEncoder enc = ImageCodec.createImageEncoder("TIFF", os, param);
try {
enc.encode(in);
os.flush();
os.close();
stream.close();
} catch (IOException e) {
System.out.println("tiff error"+e.toString());
}
RenameFile(source);
}
else {
BufferedImage image = ImageIO.read(new FileInputStream(source));
//读取图标
BufferedImage image_biao = ImageIO.read(new FileInputStream(
source));
Graphics2D g = image.createGraphics();
g.drawImage(image_biao, 10, 10, image_biao.getWidth(null),
image_biao.getHeight(null), null);
g.dispose();
FileOutputStream out = new FileOutputStream(source);

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
com.sun.image.codec.jpeg.JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(0.1f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(image);
out.close();
}

}


//===============JAI 压缩结束=======================================

上一篇: JAVA图像压缩,头都大了的问题.
下一篇: websphere mq 远程管理
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号