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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM