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

来源:互联网 发布:windows电脑登录微信 编辑:程序博客网 时间:2024/04/20 05:46

继续着前几天弄的影像压缩的东西。对 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

原创粉丝点击