Android中一張圖片(BitMap)占用的內(nèi)存主要和以下幾個因數(shù)有關(guān):圖片長度,圖片寬度斩松,單位像素占用的字節(jié)數(shù)伶唯。
一張圖片(BitMap)占用的內(nèi)存 = 圖片長度 x 圖片寬度 x 單位像素占用的字節(jié)數(shù)
其中單位像素占用的字節(jié)數(shù)由其參數(shù)BitmapFactory.Options的inPreferredConfig變量決定。
inPreferredConfig是一個枚舉值:
Enum Values | 介紹 |
---|---|
ALPHA_8 | 此時圖片只有alpha值惧盹,沒有RGB值乳幸,一個像素占用一個字節(jié)。這種格式的圖片钧椰,看起來質(zhì)量太差粹断,已經(jīng)不推薦使用。 |
ARGB_4444 | 一個像素占用2個字節(jié)嫡霞,alpha(A)值瓶埋,Red(R)值,Green(G)值,Blue(B)值各占4個bites共16bites,即2個字節(jié) |
ARGB_8888 | 一個像素占用4個字節(jié)养筒,alpha(A)值狡汉,Red(R)值,Green(G)值闽颇,Blue(B)值各占8個bites共32bites,即4個字節(jié)盾戴。這是一種高質(zhì)量的圖片格式,電腦上普通采用的格式兵多。它也是Android手機上一個BitMap的默認格式尖啡。 |
RGB_565 | 一個像素占用2個字節(jié),沒有alpha(A)值剩膘,即不支持透明和半透明衅斩,Red(R)值占5個bites ,Green(G)值占6個bites 怠褐,Blue(B)值占5個bites,共16bites畏梆,即2個字節(jié)。對于沒有透明和半透明顏色的圖片來說奈懒,該格式的圖片能夠達到比較的呈現(xiàn)效果奠涌,相對于ARGB_8888來說也能減少一半的內(nèi)存開銷。因此它是一個不錯的選擇磷杏。另外我們通過android.content.res.Resources來取得一個張圖片時溜畅,它也是以該格式來構(gòu)建BitMap的。從Android4.0開始极祸,該選項無效慈格。即使設(shè)置為該值,系統(tǒng)仍然會采用 ARGB_8888來構(gòu)造圖片遥金。 |
注:ARGB指的是一種色彩模式浴捆,里面A代表Alpha,R表示red稿械,G表示green选泻,B表示blue,其實所有的可見色都是紅綠藍組成的溜哮,所以紅綠藍又稱為三原色滔金。
示例:
一張寬高都是100且ARGB_8888圖片占有內(nèi)存大小為 **100 * 100 * 4 = 40000字節(jié) **
另外,需要注意這里的圖片占用內(nèi)存是指在Navtive中占用的內(nèi)存茂嗓,當然BitMap使用的絕大多數(shù)內(nèi)存就是該內(nèi)存餐茵。 因為我們可以簡單的認為它就是BitMap所占用的內(nèi)存。
Bitmap對象在不使用時,我們應(yīng)該先調(diào)用recycle()述吸,然后才它設(shè)置為null忿族。雖然Bitmap在被回收時可以通過BitmapFinalizer來回收內(nèi)存锣笨。但是調(diào)用recycle()是一個良好的習(xí)慣。在Android4.0之前道批,Bitmap的內(nèi)存是分配在Native堆中错英,調(diào)用recycle()可以立即釋放Native內(nèi)存。 從Android4.0開始隆豹,Bitmap的內(nèi)存就是分配在dalvik堆中椭岩,即JAVA堆中的,調(diào)用recycle()并不能立即釋放Native內(nèi)存璃赡。但是調(diào)用recycle()也是一個良好的習(xí)慣判哥。
通過dumpsys meminfo命令可以查看一個進程的內(nèi)存使用情況, 當然也可以通過它來觀察我們創(chuàng)建或銷毀一張BitMap圖片內(nèi)存的變化碉考,從而推斷出圖片占用內(nèi)存的大小塌计。 示例:adb shell dumpsys meminfo ”com.example.test"