JAVA图像压缩,JAI解决之道.
By:Roy.LiuLast updated:2009-09-06
继续着前几天弄的影像压缩的东西。对 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 压缩结束=======================================
前面说过重点时 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 压缩结束=======================================
From:一号门
Previous:JAVA图像压缩,头都大了的问题.
Next:websphere mq 远程管理
COMMENTS