zoukankan      html  css  js  c++  java
  • 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();
        }
  • 相关阅读:
    数据库回滚解决删除数据库出错
    教大家支付宝抢红包
    MySql 连接字符串
    搭建Git服务器
    队列的顺序存储结构
    栈的应用---递归
    栈的链式存储结构及应用(C、Java代码)
    栈的顺序存储结构及应用(C、Java代码)
    静态链表、循环链表、双向链表(C代码实现)
    线性表的链式存储结构(Java代码实现)
  • 原文地址:https://www.cnblogs.com/TheoryDance/p/7339893.html
Copyright © 2011-2022 走看看