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