图片压缩工具类

前言

在 java图片编码解码_伟衙内的博客-CSDN博客  中,将图片变成byte[] 数组,有时候接受到的图片过大,这样就需要将图片压缩后传输,节省时间。

但是压缩后的图片会失真,这个就看项目对图片要求了。

代码

/**
     * 压缩图片(通过降低图片质量)
     * @explain 压缩图片,通过压缩图片质量,保持原图大小
     * @param quality
     *       图片质量(0-1)
     * @return byte[]
     *      压缩后的图片(jpg)
     * @throws
     */
    public static byte[] compressPicByQuality(byte[] imgByte, float quality) {
        byte[] retBytes = imgByte;
        try {
            ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
            BufferedImage image = ImageIO.read(byteInput);

            // 如果图片空,返回空
            if (image == null) {
                return retBytes;
            }
            // 得到指定Format图片的writer(迭代器)
            Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
            // 得到writer
            ImageWriter writer = (ImageWriter) iter.next();
            // 得到指定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);
            retBytes = byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return retBytes;
    }

使用时可以判断图片的大小,如果图片太小其实可以不用压缩的,

byte[] photo = XXXX;
if(photo.length>80000){//8W的大小保存到数据库应该是60KB,超过这个就压缩
      photo = ImgUtils.compressPicByQuality(photo,0.1F);
}

 

posted @ 2022-03-28 10:27  伟衙内  阅读(35)  评论(0编辑  收藏  举报