zoukankan      html  css  js  c++  java
  • java图片无损压缩

    一,提供一张原图,原图大小2.1mb

     二,处理后图片大小对比,大小772kb,对比原图占用内存减少三分之二

      三 ,java代码

     3.1 本地压缩测试

    /**
         * 
         * @param srcFilePath 原图路径
         * @param descFilePath 保存路径
         * @return
         * @throws IOException
         */
        public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException  {
            File file = null;
            BufferedImage src = null;
            FileOutputStream out = null;
            // 指定写图片的方式为 jpg
            ImageWriter  imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
            ImageWriteParam imgWriteParams =new javax.imageio.plugins.jpeg.JPEGImageWriteParam(

    null);

    // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT
            imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
            // 这里指定压缩的程度,参数qality是取值0~1范围内,
            imgWriteParams.setCompressionQuality((float)1);
            imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
            ColorModel colorModel = ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();
    
            imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
                    colorModel, colorModel.createCompatibleSampleModel(16, 16)));
            try {
                if (StringUtils.isEmpty(srcFilePath)) {
                    return false;
                } else {
                    file = new File(srcFilePath);
                    System.out.println(file.length());
                    src = ImageIO.read(file);
                    out = new FileOutputStream(descFilePath);
                    imgWrier.reset();
                    // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何
                    // OutputStream构造
                    imgWrier.setOutput(ImageIO.createImageOutputStream(out));
                    // 调用write方法,就可以向输入流写图片
                    imgWrier.write(null, new IIOImage(src, null, null),
                            imgWriteParams);
                    out.flush();
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }

    public static void main(String[] args) throws IOException {
            String stpa="D:\文件表\test1.jpg";
            String st1="D:\文件表\test2.jpg";
            compressPic(stpa, st1);
        }

    3.2  也可压缩后转成数据格式返回做其他操作

     1 /** 
     2      *  
     3      * 自己设置压缩质量来把图片压缩成byte[] 
     4      *  
     5      * @param image 
     6      *            压缩源图片 
     7      * @param quality 
     8      *            压缩质量,在0-1之间, 
     9      * @return 返回的字节数组 
    10      */  
    11     private byte[] bufferedImageTobytes(BufferedImage image, float quality) {    
    12         // 如果图片空,返回空  
    13         /*if (image == null) {  
    14             return null;  
    15         } */    
    16         // 得到指定Format图片的writer  
    17         Iterator<ImageWriter> iter = ImageIO  
    18                 .getImageWritersByFormatName("jpg");// 得到迭代器  
    19         ImageWriter writer = (ImageWriter) iter.next(); // 得到writer  
    20 
    21         // 得到指定writer的输出参数设置(ImageWriteParam )  
    22         ImageWriteParam iwp = writer.getDefaultWriteParam();  
    23         iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置可否压缩  
    24         iwp.setCompressionQuality(quality); // 设置压缩质量参数  
    25 
    26         iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);  
    27 
    28         ColorModel colorModel = image.getColorModel();  
    29         // 指定压缩时使用的色彩模式  
    30         iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel,  
    31                 colorModel.createCompatibleSampleModel(16, 16)));  
    32 
    33         // 开始打包图片,写入byte[]  
    34         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得内存输出流  
    35         IIOImage iIamge = new IIOImage(image, null, null);  
    36         try {  
    37             // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput  
    38             // 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput  
    39             writer.setOutput(ImageIO  
    40                     .createImageOutputStream(byteArrayOutputStream)); 
    41             writer.write(null, iIamge, iwp);  
    42 
    43         } catch (IOException e) {  
    44             System.out.println("write errro");  
    45             e.printStackTrace();  
    46         }  
    47         return byteArrayOutputStream.toByteArray();  
    48     } 
  • 相关阅读:
    模式使用详解 手拉手就是职责链吗?
    简单说两句味道
    胡说两句...
    补充说明: 表驱动, 链表与职责链
    C++/CLI和TMP: enum hack相當於static const int吗?
    WCF NetTcpBinding Transport安全模式(9) ClientCredentialType证书验证模式Custom验证模式
    WCF NetTcpBinding Transport安全模式(8) ClientCredentialType证书验证模式 PeerOrChainTrust验证模式
    WCF NetTcpBinding Transport安全模式(2) 默认安全配置
    WCF NetTcpBinding Transport安全模式(7) ClientCredentialType证书验证模式 ChainTrust验证模式
    WCF NetTcpBinding Transport安全模式(6) ClientCredentialType证书验证模式 PeerTrust验证模式
  • 原文地址:https://www.cnblogs.com/KdeS/p/11898805.html
Copyright © 2011-2022 走看看