整理:android開發中對圖片的處理方式匯總

LruCache(Least Recently Used Cache) 全稱最近最少使用算法,其主要思想是使用SoftReference(或者WeakReference),因為我們的緩存容量是有限的,它會面臨一個問題:當有新的內容需要加入我們的緩存,但我們的緩存空閑的空間不足以放進新的內容時,我們就需要舍棄原有的部分內容從而騰出空間用來放新的內容。

在LruCache 中,我們使用url做key,bitmap做value,利用軟引用的特性(在內存將滿的時候會被垃圾回收器回收,如果還有可用內存,垃圾回收器不會)及時的回收內存,這種方式能夠及時有效回收圖片所占用的內存,但這些方法并未完全解決單個圖片占用內存過大的問題,在程序運行的過程中,圖片該多大還多大。我們只是控制在內存中存在圖片對象的個數而已。

與Lru相似的還有Lfu,前者是最近最少使用,即淘汰最長時間未使用的對象;后者是最近最不常使用,即淘汰一段時間內使用最少的對象。比如我們緩存對象的順序是:A B C B D A C A ,當需要淘汰一個對象時,如果采用LRU算法,則淘汰的是B,因為它是最長時間未被使用的。如果采用LFU算法,則淘汰的是D,因為在這段時間內它只被使用了一次,是最不經常使用的。

注意:對于SoftReference(軟引用)或者WeakReference(弱引用)的Bitmap緩存方案,現在已經不推薦使用了。自Android2.3版本(API Level 9)開始,垃圾回收器更著重于對軟/弱引用的回收。

與此種方法類似,我們可以使用硬盤緩存(DiskLruCache)來進行圖片的管理,這種方法比LruCache 節省內存,但讀取速度較慢(硬盤的讀取速度是未知的)。

2. 按照一定規則壓縮圖片(以android為例)

Android中圖片是以bitmap形式存在的,那么bitmap所占內存,直接影響到了應用所占內存大小。

bitmap所占內存大小計算方式:

圖片長度 x 圖片寬度 x 一個像素點占用的字節數

以下是圖片的壓縮格式:

![BitMap 格式類型](http://img.blog.csdn.net/20161215104040200?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE1NjQwNDU4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

其中,A代表透明度;R代表紅色;G代表綠色;B代表藍色。

ALPHA_8

表示8位Alpha位圖,即A=8,一個像素點占用1個字節,它沒有顏色,只有透明度

ARGB_4444

表示16位ARGB位圖,即A=4,R=4,G=4,B=4,一個像素點占4+4+4+4=16位,2個字節

ARGB_8888

表示32位ARGB位圖,即A=8,R=8,G=8,B=8,一個像素點占8+8+8+8=32位,4個字節

RGB_565

表示16位RGB位圖,即R=5,G=6,B=5,它沒有透明度,一個像素點占5+6+5=16位,2個字節

2.1 質量壓縮(android sdk 提供)

ByteArrayOutputStream baos =newByteArrayOutputStream();//內存流bitmapOld.compress(CompressFormat.JPEG, quality, baos);//quality為壓縮百分比//quality=50,意為壓縮為1/2byte[] bytes = baos.toByteArray();bitmapNew= BitmapFactory.decodeByteArray(bytes,0, bytes.length);//生成圖片對象

通過此種方式,圖片的大小是沒有變的,因為質量壓縮不會減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度等,來達到壓縮圖片的目的,這也是為什么該方法叫質量壓縮方法。圖片的長,寬,像素都不變,那么bitmap所占內存大小是不會變的。

但是bytes.length是隨著quality變小而變小的。這樣適合去傳遞二進制的圖片數據,比如微信分享圖片,要傳入二進制數據過去,限制32kb之內。

如果是bit.compress(CompressFormat.PNG, quality, baos);這樣的png格式,quality就沒有作用了,bytes.length也不會變化,因為png圖片是無損的,不能進行壓縮。

2.2 采樣率壓縮(android sdk 提供)

BitmapFactory.Optionsoptions = new BitmapFactory.Options();options.inSampleSize=2;? ? //inSampleSize 為壓縮比? ? ? ? 此處為1/2bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/Camera/test.jpg", options);

設置inSampleSize的值(int類型)后,假如設為2,則寬和高都為原來的1/2,寬高都減少了,圖片總像素就減少了,自然內存也降低了。

Glide默認加載圖片時是通過將圖片轉換成ImageView的大小后再加載。

Picasso默認是加載了全尺寸的圖片到內存,然后讓GPU來實時重繪大小(也可以手動設置或者將scaletype設置成? centerCrop等)。

2.3 縮放法壓縮(martix,android sdk 提供)

Matrix matrix = new Matrix();matrix.setScale(0.5f,0.5f);bm = Bitmap.createBitmap(bit,0,0, bit.getWidth(),bit.getHeight(), matrix, true);

通過上述代碼,bitmap的長度和寬度分別縮小了一半,圖片大小縮小了四分之一。

2.4 RGB_565法

BitmapFactory.Optionsoptions = new BitmapFactory.Options();options.inPreferredConfig= Bitmap.Config.RGB_565;? //將格式設置成RGB_565bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()? ? ? ? ? ? ? ? ? ? +"/DCIM/Camera/test.jpg", options);

經過此種方式,圖片大小直接縮小了一半,長度和寬度也沒有變,相比argb_8888減少了一半的內存。

注意:由于ARGB_4444的畫質慘不忍睹,一般假如對圖片沒有透明度要求的話,可以改成RGB_565,相比ARGB_8888將節省一半的內存開銷。

Glide默認的Bitmap格式就是RGB_565

Picasso是ARGB_8888

2.5 createScaledBitmap

bitmapNew=Bitmap.createScaledBitmap(bitmapOld,150,150,true);

這里是將圖片壓縮成我們所期望的長度和寬度(150,150)。?

圖片的內存大小相應也發生了改變。

但是這里要說,如果用戶期望的長度和寬度和原圖長度寬度相差太多的話,圖片會很不清晰。

android 中 Bitmap壓縮都是圍繞這個來做文章:Bitmap所占用的內存 = 圖片長度 x 圖片寬度 x 一個像素點占用的字節數。3個參數,任意減少一個的值,就達到了壓縮的效果。

2.6 Bitmap.recycle() 用于不再使用的圖片對象的處理

該方法不是真正降低圖片內存的方法。主要目的是標記圖片對象,方便回收圖片對象的本地數據。

圖片對象的本地數據占用的內存最大,而且與程序Java部分的內存是分開計算的。所以經常出現Java heap足夠使用,而圖片發生OutOfMemoryError的情況。在圖片不使用時調用該方法,可以有效降低圖片本地數據的峰值,從而減少OutOfMemoryError的概率。不過調用了recycle()的圖片對象處于“廢棄”狀態,調用時會造成程序錯誤。所以在無法保證該圖片對象絕對不會被再次調用的情況下,不建議使用該方法。

特別要注意已經用setImageBitmap(Bitmap img)方法分配給控件的圖片對象(意為img存在其他地方的引用),可能會被系統類庫調用,造成程序錯誤。

3.處理美工給的UI圖 tinypng(網站)

一個很好的批處理壓縮圖片文件的網站(工具),可將圖片壓縮至70%左右。?

網站鏈接:https://tinypng.com

但這種方式只能處理美工給的切圖,不能處理來自服務器的圖片文件。

4.webP圖片格式(android,ios均適用)

WebP圖片格式,由谷歌于2010年推出的新一代圖片格式,在壓縮方面比當前JPEG格式更優越。圖片壓縮體積大約只有JPEG的2/3,并能節省大量的服務器帶寬資源和數據空間。Facebook Ebay等知名網站已經開始測試并使用WebP格式。

但WebP是一種有損壓縮。相較編碼JPEG文件,編碼同樣質量的WebP文件需要占用更多的計算資源。

谷歌表示,這種格式的主要優勢在于高效率。他們發現,“在質量相同的情況下,WebP格式圖像的體積要比JPEG格式圖像小40%。谷歌瀏覽器已經支持webp格式,Opera在版本號Opera11.10后也增加了支持,然而火狐和ie暫時還不支持webp格式,可以采用flash插件來顯示webp,當然這樣會耗費一些性能。

美中不足的是,WebP格式圖像的編碼時間“比JPEG格式圖像長8倍”(占用cpu,節省內存)。

分析人士認為,盡管WebP格式尚未像JPEG格式那樣,得到各種軟硬件的廣泛支持,但谷歌推廣這一格式的優勢在于Chrome瀏覽器。這款谷歌開發的瀏覽器的市場份額已達10%以上。

桌面版Chrome可打開WebP格式。

常用的webp轉換工具有:XnConvet,智圖,ISparta,集成方法請自行百度。

http://www.bkjia.com/Androidjc/1019610.html

5 .圖片上傳 (推薦使用luban from github)

一款仿微信的圖片壓縮庫,一般用作上傳圖片的壓縮?

?感謝:http://blog.csdn.net/qq564045867/article/details/53666893

相關:http://www.lxweimin.com/p/1759364ca8b6

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容