圖片記憶體佔用計算方法
一張圖片佔用的記憶體由以下因素決定:
- 圖片中的像素點個數
- 每單位像素點佔用字節數
所以,一張圖片佔用的記憶體值為:
圖片長度 * 圖片寬度 * 單位像素點字節數
每單位像素點佔用字節數(byte):
ALPHA_8 | 1 |
ARGB_4444 | 2 |
ARGB_8888 | 4 |
RGB_565 | 2 |
舉例
一張RGB_565
的圖片,長寬分別是1024 * 768
,則:
1024 * 768 * 2 = 1572864
大約等於1.5Mb的記憶體佔用量
實際測試
Drawable drawable = img.getDrawable();
if (drawable instanceof BitmapDrawable)
{
BitmapDrawable bitDrawable = (BitmapDrawable) drawable;
Bitmap bit = bitDrawable.getBitmap();
int rowBytes = bit.getRowBytes();
int height = bit.getHeight();
Log.d("MYLOG","height: "+height+", width: "+bit.getWidth()+", rowBytes: "+rowBytes);
long memSize = rowBytes * height;
Log.d("MYLOG", "memSize = " + memSize + "B = " + formatFileSize(memSize)+"MB");
}
Result : D/ANDROID_LAB: memSize = 6460752B = 6.1614532470703125MB
這張圖是1916*843
的圖,每一像素為4Byte,所以未經處理的圖片在Android系統中將會佔用6MB多的記憶體空間。
也就是說,浪費了6MB的空間,實際上只顯示了小小的一張圖在畫面,所以建議圖片顯示之前一定要先處理過圖片。
另外對圖片的處理,並非將KB數壓縮就能解決
舉例
以下三張圖片,實際放入imageView之後佔用的記憶體是相同的,並不會因為單純降低畫質而影響佔用記憶體大小
Q:100 DPI:300 | Q:1 DPI:300 | Q:1 DPI:30 |