图片压缩存储空间

允我心安 提交于 2019-12-13 16:06:41

/**
    * @Title: compressPicByQuality 
    * @Description: 压缩图片,通过压缩图片质量,保持原图大小
    * @param  quality:0-1
    * @return byte[] 
    * @throws
    */
    public static byte[] compressPicByQuality(File file, float quality) {
        byte[] inByte = null;
        try {
            BufferedImage image = ImageIO.read(file);
    
            // 如果图片空,返回空
            if (image == null) {
                return null;
            } 
            // 得到指定Format图片的writer
            Iterator<ImageWriter> iter = ImageIO
            .getImageWritersByFormatName("jpeg");// 得到迭代器
            ImageWriter writer = (ImageWriter) iter.next(); // 得到writer
    
            // 得到指定writer的输出参数设置(ImageWriteParam )
            ImageWriteParam iwp = writer.getDefaultWriteParam();
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置可否压缩
            iwp.setCompressionQuality(quality); // 设置压缩质量参数
    
            iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
    
            ColorModel colorModel = ColorModel.getRGBdefault();
            // 指定压缩时使用的色彩模式
            iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel,
            colorModel.createCompatibleSampleModel(16, 16)));
    
            // 开始打包图片,写入byte[]
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得内存输出流
            IIOImage iIamge = new IIOImage(image, null, null);
    
            // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
            // 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput
            writer.setOutput(ImageIO
            .createImageOutputStream(byteArrayOutputStream));
            writer.write(null, iIamge, iwp);
            inByte = byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            System.out.println("write errro");
            e.printStackTrace();
        }
        return inByte;
    }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!