- 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
来源: http://www.bubuko.com/infodetail-2883644.html