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)釋放資源