天天看點

Android壓縮圖檔到100K以下并保持不失真的高效方法

 在開發android企業應用時,會經常上傳圖檔到伺服器,而我們公司目前維護的一個項目便是如此。該項目是通過私有apn與伺服器進行互動的,聯通的還好,但移動的速度實在太慢,客戶在使用軟體的過程中,由于上傳的資訊中可能包含多張圖檔,會經常出現上傳圖檔失敗的問題,為了解決這個問題,我們決定把照片壓縮到100k以下,并且保證圖檔不失真(目前圖檔經過壓縮後,大約300k左右)。于是我就重新研究了一下android的圖檔壓縮技術。

android端目錄結構如下圖所示:

Android壓縮圖檔到100K以下并保持不失真的高效方法

使用的第三方庫jar包,如下圖所示:

Android壓縮圖檔到100K以下并保持不失真的高效方法

其中ksoap2-android-xxx.jar是android用來調用webservice的,gson-xx.jar是把javabean轉成json資料格式的。

本篇部落客要講解圖檔壓縮的,核心代碼如下:

檢視全部源碼,請通路:

https://github.com/feicien/studydemo/tree/master/fileuploaddemo

壓縮原理講解:壓縮一張圖檔。我們需要知道這張圖檔的原始大小,然後根據我們設定的壓縮比例進行壓縮。

這樣我們就需要做3件事:

1.擷取原始圖檔的長和寬

以上代碼是對圖檔進行解碼,injustdecodebounds設定為true,可以不把圖檔讀到記憶體中,但依然可以計算出圖檔的大小,這正好可以滿足我們第一步的需要。

2.計算壓縮比例

一般手機的分辨率為 480*800 ,是以我們壓縮後圖檔期望的寬帶定為480,高度設為800,這2個值隻是期望的寬度與高度,實際上壓縮後的實際寬度也高度會比期望的要大。如果圖檔的原始高度或者寬帶大約我們期望的寬帶和高度,我們需要計算出縮放比例的數值。否則就不縮放。heightratio是圖檔原始高度與壓縮後高度的倍數,widthratio是圖檔原始寬度與壓縮後寬度的倍數。insamplesize為heightratio與widthratio中最小的那個,insamplesize就是縮放值。

insamplesize為1表示寬度和高度不縮放,為2表示壓縮後的寬度與高度為原來的1/2

3.縮放并壓縮圖檔

前3行的代碼其實已經得到了一個縮放的bitmap對象,如果你在應用中顯示圖檔,就可以使用這個bitmap對象了。由于考慮到網絡流量的問題。我們好需要犧牲圖檔的品質來換取一部分空間,這裡調用bm.compress()方法進行壓縮,這個方法的第二個參數,如果是100,表示不壓縮,我這裡設定的是60,你也可以更加你的需要進行設定,在實驗的過程中我設定為30,圖檔都不會失真。

壓縮效果:本demo可以把1.5m左右的圖檔壓縮到100k左右,并且沒有失真。

效果圖如下:

Android壓縮圖檔到100K以下并保持不失真的高效方法

更新:

判斷照片角度

旋轉照片