您的位置:首页 > 编程语言 > Java开发

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

2013-03-25 15:56 246 查看
继续着前几天弄的影像压缩的东西。对 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 压缩结束=======================================

http://www.yihaomen.com/article/java/80.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: