• java图片压缩(Thumbnails)


    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);
           fos.close();  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/u010355502/article/details/77197616

  • 相关阅读:
    Qt 学习之路:元素布局
    Qt 学习之路 2(80):定位器
    Qt 学习之路 2(79):QML 组件
    Qt 学习之路:QML 组件
    Qt 学习之路:QML 基本元素
    qt 学习之路 :QML 语法
    Qt 学习之路:QML 和 QtQuick 2
    Qt 学习之路:线程总结
    Qt 学习之路:线程和 QObject
    五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
  • 原文地址:https://www.cnblogs.com/hdwang/p/10118028.html
Copyright © 2020-2023  润新知