java压缩图片质量

使用了工具thumbnailator,据说thumbnailator是一个非常好的图片开源工具,使用起来很方便。不过没仔细看过,我只是需要压缩图片,让其占用空间变小而已。使用maven引入jar包

<!-- 图片缩略图 -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

代码如下即可:

        Thumbnails.of("C:/Users/my/Pictures/this/2.jpg")
                  .scale(1f)
                  .outputQuality(0.25f)
                  .toFile("C:/Users/my/Pictures/this/2(1).jpg");

源图片为1.2MB,压缩后图片大小为157KB

 

另外一种压缩,我这边的场景是,开始有一张图片只有200~300KB左右,但是我们要绘制一些特殊的图片或水印在上面,绘制完成后,就变成3、4M左右了,经过下面这种方式压缩后,大概变为1/3大小,但是分辨率和清晰度基本看不出有什么变化

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.Callable;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;

import org.apache.commons.lang.StringUtils;

import com.grand.mysql_handler.mapper.SystemMapper;

import net.sf.json.JSONObject;

    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(imgWriteParams.MODE_EXPLICIT);
        // 这里指定压缩的程度,参数qality是取值0~1范围内,
        imgWriteParams.setCompressionQuality((float)1);
        imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
        ColorModel colorModel = image.getColorModel();// ColorModel.getRGBdefault();
        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();
    }

 

posted @ 2017-08-10 16:17  理舞  阅读(1249)  评论(0编辑  收藏  举报