這篇文章給大家介紹怎么在Android應(yīng)用中利用Bitmap對(duì)圖片進(jìn)行優(yōu)化,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今,先為新邱等服務(wù)建站,新邱等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為新邱企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。前言
在Android開(kāi)發(fā)過(guò)程中,Bitmap往往會(huì)給開(kāi)發(fā)者帶來(lái)一些困擾,因?yàn)閷?duì)Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError
- 內(nèi)存溢出),本篇博客,我們將一起探討B(tài)itmap的性能優(yōu)化。
為什么Bitmap會(huì)導(dǎo)致OOM?
1.每個(gè)機(jī)型在編譯ROM時(shí)都設(shè)置了一個(gè)應(yīng)用堆內(nèi)存VM值上限dalvik.vm.heapgrowthlimit
,用來(lái)限定每個(gè)應(yīng)用可用的大內(nèi)存,超出這個(gè)大值將會(huì)報(bào)OOM。這個(gè)閥值,一般根據(jù)手機(jī)屏幕dpi大小遞增,dpi越小的手機(jī),每個(gè)應(yīng)用可用大內(nèi)存就越低。所以當(dāng)加載圖片的數(shù)量很多時(shí),就很容易超過(guò)這個(gè)閥值,造成OOM。
2.圖片分辨率越高,消耗的內(nèi)存越大,當(dāng)加載高分辨率圖片的時(shí)候,將會(huì)非常占用內(nèi)存,一旦處理不當(dāng)就會(huì)OOM。例如,一張分辨率為:1920x1080的圖片。如果Bitmap使用 ARGB_8888 32位來(lái)平鋪顯示的話,占用的內(nèi)存是1920x1080x4個(gè)字節(jié),占用將近8M內(nèi)存,可想而知,如果不對(duì)圖片進(jìn)行處理的話,就會(huì)OOM。
3.在使用ListView, GridView等這些大量加載view的組件時(shí),如果沒(méi)有合理的處理緩存,大量加載Bitmap的時(shí)候,也將容易引發(fā)OOM
Bitmap基礎(chǔ)知識(shí)
一張圖片Bitmap所占用的內(nèi)存 = 圖片長(zhǎng)度 x 圖片寬度 x 一個(gè)像素點(diǎn)占用的字節(jié)數(shù)
而Bitmap.Config
,正是指定單位像素占用的字節(jié)數(shù)的重要參數(shù)。
其中,A代表透明度;R代表紅色;G代表綠色;B代表藍(lán)色。
ALPHA_8
表示8位Alpha位圖,即A=8,一個(gè)像素點(diǎn)占用1個(gè)字節(jié),它沒(méi)有顏色,只有透明度
ARGB_4444
表示16位ARGB位圖,即A=4,R=4,G=4,B=4,一個(gè)像素點(diǎn)占4+4+4+4=16位,2個(gè)字節(jié)
ARGB_8888
表示32位ARGB位圖,即A=8,R=8,G=8,B=8,一個(gè)像素點(diǎn)占8+8+8+8=32位,4個(gè)字節(jié)
RGB_565
表示16位RGB位圖,即R=5,G=6,B=5,它沒(méi)有透明度,一個(gè)像素點(diǎn)占5+6+5=16位,2個(gè)字節(jié)
一張圖片Bitmap所占用的內(nèi)存 = 圖片長(zhǎng)度 x 圖片寬度 x 一個(gè)像素點(diǎn)占用的字節(jié)數(shù)
根據(jù)以上的算法,可以計(jì)算出圖片占用的內(nèi)存,以100*100像素的圖片為例
BitmapFactory解析Bitmap的原理
BitmapFactory提供的解析Bitmap的靜態(tài)工廠方法有以下五種:
Bitmap decodeFile(...) Bitmap decodeResource(...) Bitmap decodeByteArray(...) Bitmap decodeStream(...) Bitmap decodeFileDescriptor(...)