码迷,mamicode.com
首页 > 编程语言 > 详细

java图片压缩(Thumbnails)

时间:2018-12-14 10:55:52      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:ble   import   details   double   图片   mat   read   main   des   

 

package com.hzxc.groupactivity.server.util;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;

import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils;

/**
 * Created by hdwang on 2018/12/13.
 */
public class PicUtils {
 
    public static void main(String[] args) {
 
        PicUtils.commpressPicForScale("/Users/hdwang/Downloads/1.jpg","/Users/hdwang/Downloads/1_s.jpg", 1000, 0.8,750,1334); // 图片小于1000kb


    }
 
    /**
      * 根据指定大小和指定精度压缩图片
      * 
      * @param srcPath
      *            源图片地址
      * @param desPath
      *            目标图片地址
      * @param desFileSize
      *            指定图片大小,单位kb
      * @param accuracy
      *            精度,递归压缩的比率,建议小于0.9
     *  @param desMaxWidth
     *             目标最大宽度
     *  @param desMaxHeight
     *             目标最大高度
      * @return 目标文件路径
      */
    public static String commpressPicForScale(String srcPath, String desPath,
            long desFileSize, double accuracy,int desMaxWidth,int desMaxHeight) {
        if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(srcPath)) {
            return null;
        }
        if (!new File(srcPath).exists()) {
            return null;
        }
        try {
            File srcFile = new File(srcPath);
            long srcFileSize = srcFile.length();
            System.out.println("源图片:" + srcPath + ",大小:" + srcFileSize / 1024
                                        + "kb");
            //获取图片信息
            BufferedImage bim = ImageIO.read(srcFile);
            int srcWidth = bim.getWidth();
            int srcHeight = bim.getHeight();

            //先转换成jpg
            Thumbnails.Builder builder = Thumbnails.of(srcFile).outputFormat("jpg");

            // 指定大小(宽或高超出会才会被缩放)
            if(srcWidth > desMaxWidth || srcHeight > desMaxHeight) {
                builder.size(desMaxWidth, desMaxHeight);
            }else{
                //宽高均小,指定原大小
                builder.size(srcWidth,srcHeight);
            }

            // 写入到内存
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
            builder.toOutputStream(baos);

            // 递归压缩,直到目标文件大小小于desFileSize
            byte[] bytes = commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);

            // 输出到文件
            File desFile = new File(desPath);
            FileOutputStream fos = new FileOutputStream(desFile);
            fos.write(bytes);

            System.out.println("目标图片:" + desPath + ",大小" + desFile.length() / 1024 + "kb");
            System.out.println("图片压缩完成!");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return desPath;
    }
 
    private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException {
       // File srcFileJPG = new File(desPath);
        long srcFileSizeJPG = bytes.length;
        // 2、判断大小,如果小于500kb,不压缩;如果大于等于500kb,压缩
        if (srcFileSizeJPG <= desFileSize * 1024) {
            return bytes;
        }
        // 计算宽高
        BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
        int srcWdith = bim.getWidth();
        int srcHeigth = bim.getHeight();
        int desWidth = new BigDecimal(srcWdith).multiply(
                                new BigDecimal(accuracy)).intValue();
        int desHeight = new BigDecimal(srcHeigth).multiply(
                                new BigDecimal(accuracy)).intValue();

        ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
        Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);
        return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
    }

}

 

参考文章:

https://blog.csdn.net/qiaqia609/article/details/53171149

https://blog.csdn.net/qiaqia609/article/details/53171149

java图片压缩(Thumbnails)

标签:ble   import   details   double   图片   mat   read   main   des   

原文地址:https://www.cnblogs.com/hdwang/p/10118028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!