使用Thumbnails實現(xiàn)圖片指定大小壓縮
項目中有個要求,對上傳服務(wù)器的圖片大小進(jìn)行判斷,大于500k的圖片要進(jìn)行壓縮處理,讓其小于500k后在上傳。
可以通過java api的ImageIO實現(xiàn)圖片壓縮,但是看了網(wǎng)上的博客普遍都說bug比較多,會有OOM內(nèi)存溢出的現(xiàn)象。
Thumbnails插件是Google的插件,能指定不同的參數(shù)進(jìn)行壓縮操作。
比如:寬高(size),縮放(scale),制定質(zhì)量比(outputQuality)等。
插件使用的jar包為:
thumbnailator-0.4.8.jar
代碼如下:
/**
*
* @param srcPath 原圖片地址
* @param desPath 目標(biāo)圖片地址
* @param desFileSize 指定圖片大小,單位kb
* @param accuracy 精度,遞歸壓縮的比率,建議小于0.9
* @return
*/
public static String commpressPicForScale(String srcPath,String desPath,
long desFileSize , double accuracy){
try {
File srcFile = new File(srcPath);
long srcFilesize = srcFile.length();
System.out.println("原圖片:"+srcPath + ",大小:" + srcFilesize/1024 + "kb");
//遞歸壓縮,直到目標(biāo)文件大小小于desFileSize
commpressPicCycle(desPath, desFileSize, accuracy);
File desFile = new File(desPath);
System.out.println("目標(biāo)圖片:" + desPath + ",大小" + desFile.length()/1024 + "kb");
System.out.println("圖片壓縮完成!");
} catch (Exception e) {
e.printStackTrace();
}
return desPath;
}
public static void commpressPicCycle(String desPath , long desFileSize,
double accuracy) throws IOException{
File imgFile = new File(desPath);
long fileSize = imgFile.length();
//判斷大小,如果小于500k,不壓縮,如果大于等于500k,壓縮
if(fileSize <= desFileSize * 500){
return;
}
//計算寬高
BufferedImage bim = ImageIO.read(imgFile);
int imgWidth = bim.getWidth();
int imgHeight = bim.getHeight();
int desWidth = new BigDecimal(imgWidth).multiply(
new BigDecimal(accuracy)).intValue();
int desHeight = new BigDecimal(imgHeight).multiply(
new BigDecimal(accuracy)).intValue();
Thumbnails.of(desPath).size(desWidth, desHeight).outputQuality(accuracy).toFile(desPath);
//如果不滿足要求,遞歸直至滿足小于1M的要求
commpressPicCycle(desPath, desFileSize, accuracy);
}
然后壓縮圖片大?。?/p>
commpressPicForScale(filePath, filePath, 500, 0.8);
壓縮完成:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
cocos2d-2.0-x-2.0.3 交叉編譯到android報錯解決
我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也沒成功 今天來了下載了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本問題還是哪一步出錯誤了,在這里詳細(xì)的整理一下,感興趣的朋友可以了解下2013-01-01
Android實現(xiàn)瘋狂連連看游戲之加載界面圖片和實現(xiàn)游戲Activity(四)
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)瘋狂連連看游戲之加載界面圖片和實現(xiàn)游戲Activity,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Android RecyclerView實現(xiàn)吸頂動態(tài)效果流程分析
RecyclerView是Android一個更強(qiáng)大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實現(xiàn)數(shù)據(jù)縱向滾動,也可以實現(xiàn)橫向滾動(ListView做不到橫向滾動)。接下來講解RecyclerView的用法2022-12-12
Android自定義LinearLayout布局顯示不完整的解決方法
這篇文章主要給大家介紹了關(guān)于Android自定義LinearLayout但布局顯示不完整的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Android listview定位到上次顯示的位置的實現(xiàn)方法
這篇文章主要介紹了Android listview定位到上次顯示的位置的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-08-08
淺析Android手機(jī)衛(wèi)士讀取聯(lián)系人
這篇文章主要介紹了淺析Android手機(jī)衛(wèi)士讀取聯(lián)系人的相關(guān)內(nèi)容,通過getContentResolver()方法獲取獲取ContentResolver內(nèi)容解析器對象,對android手機(jī)衛(wèi)士讀取聯(lián)系人相關(guān)知識感興趣的朋友參考下吧2016-04-04

