java 实现压缩图片质量

无需导入第三方包,利用java自带的 awt 处理即可完成图片的质量压缩,真正对图片的质量进行压缩的(不是通过修改图片的高,宽进行缩小图片。就单单缩小图片质量)

优点:不修改图片大小,简便。

缺点:对jpg格式能处理很好,对于gif,png其他格式不适合。

话不多说直接上代码,使用起来 直接调用 compressPic 即可


package com.js.mdp.app.common;

import javax.imageio.*;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.*;


/**
 * ClassName ImgUtils
 * description:
 *
 * @author tm
 * @version V1.0
 */
public class ImgUtils {

    

    /**
     *
     *   传递byte数据,返回压缩后的 byte 数组
     * @param bytes  压缩前的 byte 数组
     * @return byte  压缩后的 byte 数组
     */
    public static byte[] compressPic(byte[] bytes)  {
        BufferedImage bufferedImage = null;
        try {
            //将b作为输入流;
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
            bufferedImage = ImageIO.read( in);
            bytes = compressPic(bufferedImage);
            return  bytes;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] compressPic(BufferedImage image) throws IOException  {
        ByteArrayOutputStream outArray = new ByteArrayOutputStream();
        // 指定写图片的方式为 jpg
        ImageWriter imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
        ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
                null);
        // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT
        imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        // 这里指定压缩的程度,参数qality是取值0~1范围内,
        imgWriteParams.setCompressionQuality((float)0.1);
        imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
        // ColorModel.getRGBdefault();
        ColorModel colorModel = image.getColorModel();
        imgWriteParams.setDestinationType(new ImageTypeSpecifier(
                colorModel, colorModel.createCompatibleSampleModel(16, 16)));
        try {
            imgWrier.reset();
            // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何
            // OutputStream构造
            imgWrier.setOutput(ImageIO.createImageOutputStream(outArray));
            // 调用write方法,就可以向输入流写图片
            imgWrier.write(null, new IIOImage(image, null, null),
                    imgWriteParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return outArray.toByteArray();
    }


}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值