Bitmap內存分析
從Android提供的獲取bitmap內存大小api如下:
/**
* Returns the minimum number of bytes that can be used to store this bitmap's pixels.
*
* <p>As of {@link android.os.Build.VERSION_CODES#KITKAT}, the result of this method can
* no longer be used to determine memory usage of a bitmap. See {@link
* #getAllocationByteCount()}.</p>
*/
public final int getByteCount() {
// int result permits bitmaps up to 46,340 x 46,340
return getRowBytes() * getHeight();
}
以上代碼分析height就是原圖片的高谐鼎,而getRowBytes的值與bitmap格式有關棚亩,如果ARGB-8888 每個像素占8bit 總共32bit映屋,4字節(jié),所以需要*4,有關bitmap格式表對應的字節(jié)如下:
格式 | 描述 | 字節(jié) |
---|---|---|
ALPHA_8 | 只有一個alpha通道 每個像素占4bit | 0.5 |
ARGB-4444 | 每個像素占四bit瘦穆,即A=4,R=4赊豌,G=4扛或,B=4 | 2 |
RGB-565 | 比較特殊 R=5 G=6 B=5 無ALPHA通道 | 2 |
ARGB-8888 | 每個像素占四bit,即A=8碘饼,R=8告喊,G=8,B=8 | 4 |
但是bitmap格式也只是以上決定因素之一派昧,另外還需要和屏幕分辨率(Density)有關黔姜。一般來說如果放在xxhdpi為480 三星手機的密度為640
所以公式為手機本身密度/圖片存放位置的密度*寬才能拿到他實際的寬,高也同理蒂萎。最后再加上精度問題之前的寬高需要+0.5f秆吵。所以最后得出來的公式:
(原圖片寬* 手機的密度 / 存放位置的密度(例如xhdpi)+0.5f)*
(原圖片高* 手機的密度 / 存放位置的密度(例如xhdpi)+0.5f)*
圖片格式(默認ARGB8888為4)=bitmap占用內存大小。
Bitmap內存優(yōu)化
使用inSampleSize
inSampleSize就是降低圖片的采樣率五慈,如果為2的話那加載的內存則會是原來的1/4纳寂。
jpg vs png
jpg屬于有損壓縮,而png屬于無損壓縮泻拦,毙芜,有損壓縮刪除一些圖像變化,讓人腦自己去補充争拐,所以體積會比有損小腋粥,但是造成的弊端顯而易見。有損壓縮一般人眼識別都都大致一樣但是有損壓縮在高分辨下打印出來就能看到明顯的損壞,而無損則不會有隘冲。另外jpg走的是rgb565 從內存方面考慮會比png(ARGB-8888)小一半左右闹瞧,但是這也要取決于圖片額內容。
兩者在選擇時候主要體現(xiàn)于:
- 是否真的需要alpha通道
- 用戶的cpu是否強勁展辞,jpg的有損壓縮算法會比png的無損更加耗時奥邮。
- 看你的色值是否豐富,如果豐富請選擇jpg罗珍,如果只是作為背景可以選擇png洽腺。
使用矩陣
大圖小用用采樣,小圖大用用矩陣覆旱。
使用合理的圖片格式
ALPHA8 沒必要用蘸朋,因為他只有透明度沒有顏色。
ARGB4444 雖然占用內存只有 ARGB8888 的一半通殃,不過已經(jīng)被官方嫌棄度液。
ARGB8888 是最常用的,安卓bitmap默認是這種格式画舌。
RGB565 其實如果不需要 alpha 通道堕担,特別是資源本身為 jpg 格式的情況下,用這個格式比較理想曲聂。
使用自定義view
復寫ondraw方法去繪制圖形霹购。
參考文檔http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=498