1. 程式人生 > >java 壓縮圖片至指定大小

java 壓縮圖片至指定大小

需求: 壓縮圖片至300k以下

一開始沒有思路在網上搜,發現google有個外掛叫Thumbnails,然後看到了這篇文章:

https://blog.csdn.net/u010355502/article/details/77197616

思路很簡單,按一定的比例壓縮圖片,如果壓縮完大小達不到要求,就把壓縮後的結果繼續壓縮,直到符合要求為止

本文可以說是對原文作者程式碼的改進,去除了一些多餘的IO過程,把遞迴改成了迴圈,並且把檔案操作改為了流和位元組陣列的操作(也是更符合公司的業務程式碼一些)

在此感謝原文作者


import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * 圖片壓縮Utils
 *
 * @author worstEzreal
 * @version V1.1.0
 * @date 2018/3/12
 */
public class PicUtils {

    private static Logger logger = LoggerFactory.getLogger(PicUtils.class);

//    public static void main(String[] args) throws IOException {
//        byte[] bytes = FileUtils.readFileToByteArray(new File("D:\\1.jpg"));
//        long l = System.currentTimeMillis();
//        bytes = PicUtils.compressPicForScale(bytes, 300, "x");// 圖片小於300kb
//        System.out.println(System.currentTimeMillis() - l);
//        FileUtils.writeByteArrayToFile(new File("D:\\dd1.jpg"), bytes);
//    }

    /**
     * 根據指定大小壓縮圖片
     *
     * @param imageBytes  源圖片位元組陣列
     * @param desFileSize 指定圖片大小,單位kb
     * @param imageId     影像編號
     * @return 壓縮質量後的圖片位元組陣列
     */
    public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) {
        if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
            return imageBytes;
        }
        long srcSize = imageBytes.length;
        double accuracy = getAccuracy(srcSize / 1024);
        try {
            while (imageBytes.length > desFileSize * 1024) {
                ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
                Thumbnails.of(inputStream)
                        .scale(accuracy)
                        .outputQuality(accuracy)
                        .toOutputStream(outputStream);
                imageBytes = outputStream.toByteArray();
            }
            logger.info("【圖片壓縮】imageId={} | 圖片原大小={}kb | 壓縮後大小={}kb",
                    imageId, srcSize / 1024, imageBytes.length / 1024);
        } catch (Exception e) {
            logger.error("【圖片壓縮】msg=圖片壓縮失敗!", e);
        }
        return imageBytes;
    }

    /**
     * 自動調節精度(經驗數值)
     *
     * @param size 源圖片大小
     * @return 圖片壓縮質量比
     */
    private static double getAccuracy(long size) {
        double accuracy;
        if (size < 900) {
            accuracy = 0.85;
        } else if (size < 2047) {
            accuracy = 0.6;
        } else if (size < 3275) {
            accuracy = 0.44;
        } else {
            accuracy = 0.4;
        }
        return accuracy;
    }

}

其中imageId為影像編號,僅做日誌輸出用途,可以去掉,getAccuracy()方法是本人測試了幾張圖片後得出的經驗數值(為了減少迴圈次數),也可以不用,直接傳入壓縮質量比即可

本地呼叫圖片測試的話,可以把main()方法的註釋去掉,並引入apache.common.io包,修改圖片路徑執行

相關推薦

java 壓縮圖片指定大小

需求: 壓縮圖片至300k以下一開始沒有思路在網上搜,發現google有個外掛叫Thumbnails,然後看到了這篇文章:https://blog.csdn.net/u010355502/article/details/77197616思路很簡單,按一定的比例壓縮圖片,如果壓

壓縮圖片指定大小

public class BitmapUtil { /** * * @param bitmap * @param maxSize 當傳入的bitmap的大小大於maxSize時,壓縮圖片至maxSize * @re

Java圖片壓縮指定大小

        公司有業務,需要將部分圖片壓縮到指定大小以內才能上傳到某平臺。所以就學習了網上 各位大佬的圖片壓縮程式碼。寫了一個工具類,本著共同學習的態度,把程式碼貼一下,大家一起學習,一起進步。 工具類: package com.yulong.app.util; im

java按比例壓縮圖片指定大小(kb、mb)

       網上有很多壓縮圖片的方法,但是要麼就是不能壓縮到指定的大小以內,要麼就是要引用第三方的外掛,都不太符合我的要求,所以就想著自己寫一個方法來實現。這種方法有點不好就是如果圖片特別大則要進行多次判斷和讀取,可能時間會有點長,這要看實際情況,用的時候要自己注意。  

java壓縮圖片記憶體大小,但不改變解析度大小,第一種方式

/*** @Title: compressPicByQuality * @Description: 壓縮圖片,通過壓縮圖片質量,保持原圖大小* @param  quality:0-1* @return byte[] * @throws*/public static byte

IOS中將照片壓縮指定大小

-(UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize withImage:(UIImage*)img { UIImage *sourceImage =img; UIImage *newImage =ni

Java壓縮圖片util,可等比例寬高不失真壓縮,也可直接指定壓縮後的寬高

package com.yipai.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNot

java壓縮圖片大小不改變圖片解析度

檔案上傳時,有的圖片我們並不強求的圖片質量,因為圖片過大的話,會佔用頻寬以及儲存空間。因此在上傳圖片的時候就要對圖片進行壓縮處理操作,經過百度,網上普遍有兩種,一種是改變圖片長寬,按比例或者設定長寬對圖片進行縮小,另一種是不改變圖片的寬高,改變圖片的質量。關於改變長寬的做法,

java壓縮圖片記憶體大小,但不改變解析度大小,第二種方式

/*** @Title: compressPic * @Description: 壓縮圖片,通過壓縮圖片質量,保持原圖大小* @param  quality:0-1    * @return byte[] * @throws*/public static byte[] co

解決圖片指定大小盒子內不超出正好填滿的代碼

eight 寬度 blog 超出 script img load() 函數 rip <script type="text/javascript"> $(".img").each(function(i){ var img

Java 將List按照指定大小分段

有的時候,如果我們需要將現有的List按照指定的大小(size)分成段到新的newList中,newList中的每個元素都是一個原有的List,原有的List中包含size個元素,見如下程式碼: Ruby程式碼

PHP處理圖片指定大小的縮圖

<?PHP //影象處理類 class Image { private $file; //圖片地址 private $width; //圖片長度 private $height; //圖片長度 private $type;

解決java壓縮圖片透明背景變黑色的問題

public static BufferedImage resize(int faceWidth,BufferedImage srcImg,HttpServletRequest request) throws IOException{                  

Android O 自定義通知例項及一個自定義自動適配縮放圖片特定大小的田字格ImageView

        這一篇博文的思路很簡單,沒有什麼深入的理論,源由是最近在實習公司裡開發用到了Android O的通知,發現與以往有所不同,相關的資料是有,但是大部分都不適用於這個版本,這裡只是寫一個非常簡單的Demo,算是程式碼的儲存吧。另外,為什麼一個自定義View要和通知

按寬/高縮放圖片指定大小並進行裁剪得到中間部分圖片 返回Bitmap

/** * 按寬/高縮放圖片到指定大小並進行裁剪得到中間部分圖片 <br> * 方 法 名:zoomBitmap <br> * 創 建 人: <br> * 建立時間:2016-6-7 下午12:02:52 <br&g

壓縮圖片大小指定Kb以下

像PS,QQ影像等都有該功能,將圖片大小壓縮至指定kb以下。   我也來山寨一把,到目前為止,控制圖片的大小,平時的解決方案通過解析度和質量來控制的。   假定最後壓縮的大小是100kb,那麼在保證不大於100kb的前提下,圖片質量儘可能高。圖片質量越高,圖片佔用大小

java按比例壓縮圖片的原始碼,用java如何把圖片處理到指定大小

public static void uploadImage(File p_in,File p_out,int height,int width,String ftype) throws FileNotFoundException,IOException   {//    取得圖片處理//    Conver

java 上傳圖片以及壓縮圖片大小

縮圖壓縮檔案jar包 <dependency> <groupId>net.coobird</groupId> <artifactId>thumbna

JS中通過指定大小壓縮圖片

前不久王二寫了一個圖片處理庫,可以指定圖片質量壓縮圖片,呼叫的是javaScript的原生方法 toDataURL 和 toBlob,庫裡有如下這些方法: 但是通過質量壓縮圖片有一些不足之處:無法確定壓縮後圖片的大小; 比如下圖,王二隨機選了三張圖片做測試(感興趣的小夥伴可以戳這裡自行測

Java實現圖片壓縮程式碼,圖片大小轉換

package org.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.CropImageFilter; import jav