Java ImageIO按质量压缩图片,规避图片发红问题

/**
     * 图片压缩
     * @param inputImage
     * @param formatName
     * @param quality
     * @return
     * @throws IOException
     */
    public static InputStream compressImage(InputStream inputImage, String formatName, float quality) throws Exception {
        BufferedImage image = ImageIO.read(inputImage);
        // 解决压缩后图片发红问题
        //设置一个同宽高的基本图像
        BufferedImage bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        //空图像的画布
        Graphics2D g = bimage.createGraphics();
        //绘制图像
        g.drawImage(image, 0, 0, null);
        //释放资源
        g.dispose();

        // 获取特定格式的图像写入器(比如JPG JPEG),并获取默认的写入参数,用于设置图像的压缩方式和质量
        ImageWriter writer = ImageIO.getImageWritersByFormatName(formatName).next();
        ImageWriteParam param = writer.getDefaultWriteParam();

        // 设置压缩模式为 MODE_EXPLICIT,表示要显式地设置压缩参数,通过 setCompressionQuality() 方法设置压缩质量
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        // 压缩质量0-1
        param.setCompressionQuality(quality);

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 输入图片并关闭
        writer.setOutput(ImageIO.createImageOutputStream(outputStream));
        writer.write(null, new IIOImage(bimage, null, null), param);
        writer.dispose();
        return new ByteArrayInputStream(outputStream.toByteArray());
    }
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream(new File("C:\\Download\\FFCE5F9B@1D42265(06-11-15-22-07).jpg"));
        InputStream compressedImage = compressImage(fis, "jpg", 0.3f);

//        BufferedImage image = ImageIO.read(compressedImage);
//        // 将图片保存到文件系统
//        File outputFile = new File("C:\\Download\\output.jpg");
//        ImageIO.write(image, "jpg", outputFile);

        MultipartFile file = new MockMultipartFile("file", "1.jpg", MediaType.MULTIPART_FORM_DATA_VALUE, compressedImage);
        System.out.println(file.getSize());
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值