圖片佔用內存空間大小都很熟悉:分辨率 * 像素點大小
圖片佔用內存空間大小和 圖片分辨率,像素點大小 有關
1.圖片格式,圖片文件大小和佔用內存空間大小無關
png / jpg 只是這張圖片的容器,它們經過相對應的壓縮算法將原圖每個像素點信息轉換用另一種數據格式表示,一次達到壓縮目的,減少圖片文件大小
無論png,jpg還是webp,都需要先轉換爲bitmap,然後才能顯示
所以圖片小打和圖片加載進內存所佔大小沒關係;
2.圖片佔用內存空間大小和像素點數據格式相關
如沒有指定,默認爲ARGB_8888作爲像素點的數據格式
圖片的分辨率固定爲:1080*452, 加載圖片所佔內存:1080 * 452 * 4B = 1952640B ≈ 1.86MB
數據格式 |
ALPHA_8 |
RGB_565 |
ARGB_4444 |
ARGB_8888 |
RGBA_F16 |
像素點 |
1B |
2B |
2B |
4B |
8B |
內存佔用 |
0.47MB |
0.93MB |
0.94MB |
1.86MB |
3.72MB |
3.圖片佔用內存空間大小和加載view的大小無關
圖片先加載內存,纔會繪製到View上,圖片申請內存時不知道要加載到哪裏,除非提前告知,手動參與圖片加載過程
4.圖片放置res不同目錄時,會影響圖片佔用內存空間大小
在不同的res目錄中,當圖片加載進內存時會經過一次分辨率轉換再計算大小
設備dpi(240),圖片分辨率1080*452,
新圖高度 = 原圖高度 * (設備dpi / 目錄對應的dpi)
新圖寬度 = 原圖寬度 * (設備dpi / 目錄對應的dpi)
故圖片在xhdpi中轉換後應該是:1080 * (240/320)* 452 * (240/320) * 4B = 1098360B ≈ 1.05MB
密度 |
ldpi |
mdpi |
hdpi |
xhdpi |
xxhdpi |
密度值 |
120 |
160 |
240 |
320 |
480 |
手機dpi240 |
7.45MB |
4.19MB |
1.86MB |
1.05MB |
0.47MB |
Mate30pro 410 |
21.74MB |
12.23MB |
5.43MB |
3.06MB |
1.36MB |
MI 10 Pro 396 |
20.28MB |
11.41MB |
5.07MB |
2.85MB |
1.27MB |
除了res下的圖片,其他地方的圖片都不會進行分辨率轉換
5. 圖片使用不同加載庫,佔用內存空間大小不同
如果使用了某個圖片開源庫,對於加載一張圖片到內存佔據多大空間,需要深入開源庫研究
因爲開源庫會對圖片進行優化處理;
通過圖片內存可瞭解圖片佔用內存大小和分辨率,像素點大小有關,故降低內存佔用從圖片本身考慮只能從兩個方向入手:
① 減少每個像素點大小
這個好操作,系統默認以ARGB_8888格式進行處理,每個像素點佔4B大小,可修改格式降低圖片佔用內存大小
② 降低分辨率
系統加載圖片時,不以原圖片分辨率,而是降低一定比例進行加載,可減少圖片佔用內存空間;
可通過BitmapFactory.Options.inSampleSize 降低分辨率,比如一張2000*1500的圖片,設置inSampleSize爲5後,
實際加載到內存中圖片的寬高是400*300,內存佔用從7.63M降至0.46M,節省十幾倍;