圖片壓縮

Android圖片壓縮常用的有質量壓縮、尺寸壓縮、采樣率壓縮以及通過JNI調用libjpeg庫來進行壓縮(尺寸壓縮,質量壓縮底層也是通過調用native的方法進行壓縮的,而native是通過Skia這個庫實現的,但最終還是調用了libjpeg庫進行壓縮的)

質量壓縮

保持像素的前提下改變圖片的位深及透明度(通過算法抹掉(同化)圖片中的一些點附近相近的像素)達到降低質量壓縮文件的目的

常用于將圖片壓縮后將圖片上傳到服務器,或者保存到本地,根據實際需求

尺寸壓縮

通過減少單位尺寸的像素值,真正意義上的降低像素(通過縮放圖片像素來減少圖片占用內存大小)

常用于緩存縮略圖的時候

采樣率壓縮

設置圖片的采樣率,降低圖片像素。這樣做不會先將大圖讀入內存,大大減少了內存的使用,也不必考慮將大圖讀入內存后的釋放事宜

問題:因為采樣率是整數,所以不能很好的保證圖片的質量。如我們需要的是在2和3采樣率之間,用2的話圖片就大了一點,但是用3的話圖片質量就會有很明顯的下降

通過JIN調用libjpeg庫壓縮

通常IOS拍的照片1M左右還比Android拍出來的照片5M的還要清晰,都是在同一個環境下,保存的都是JPEG

原因

1995年 JPEG處理引擎,用于最初的在PC上面處理圖片的引擎。

2005年 skia開源的引擎, 開發了一套基于JPEG處理引擎的第二次開發。便于瀏覽器的使用。

2007年安卓用的skia引擎(閹割版),谷歌拿了skia,去掉一個編碼算法—哈夫曼算法。采用定長編碼算法。但是解碼還是保留了哈夫曼算法,導致了圖片處理后文件變大了。

當時由于CPU和內存在手機上都非常吃緊 性能差,由于哈夫曼算法非常吃CPU,被迫用了其他的算法。

優化方案

繞過安卓Bitmap API層,來自己編碼實現—-修復使用哈夫曼算法。

JIN開發步驟:

(1)將android的bitmap解碼,并轉換成RGB數據? 一個圖片信息---像素點(argb),alpha去掉

(2)JPEG對象分配空間以及初始化

(3)指定壓縮數據源

(4)獲取文件信息

(5)為壓縮設置參數,比如圖像大小、類型、顏色空間

(6)開始壓縮——jpeg_start_compress()

(7)壓縮結束——jpeg_finish_compress()

(8)釋放資源

第三方框架Luban(魯班)壓縮

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容