android加載圖片需要哪些優(yōu)化熔吗?
首先,大家應(yīng)該知道,我們編寫的應(yīng)用程序都是有一定內(nèi)存限制的异剥,程序占用了過高的內(nèi)存就容易出現(xiàn)OOM(OutOfMemory)異常,在一個(gè)很小的ImageView上顯示一張超大的圖片不會(huì)帶來任何視覺上的好處絮重,但卻會(huì)占用我們相當(dāng)多寶貴的內(nèi)存冤寿,而且在性能上還可能會(huì)帶來負(fù)面影響。因此在展示高分辨率圖片的時(shí)候青伤,最好先將圖片進(jìn)行壓縮
當(dāng)你需要在界面上加載一大堆圖片的時(shí)候督怜,需要頻繁的加載同一張圖片,這時(shí)重新去加載一遍剛剛加載過的圖片無(wú)疑是性能的瓶頸狠角,因此需要使用圖片緩存技術(shù)
Android中一張圖片占據(jù)的內(nèi)存大小是如何計(jì)算号杠?
首先,我們需要搞清楚一個(gè)概念:我們?cè)陔娔X上看到的 png 格式或者 jpg 格式的圖片丰歌,png(jpg) 只是這張圖片的容器姨蟋,它們是經(jīng)過相對(duì)應(yīng)的壓縮算法將原圖每個(gè)像素點(diǎn)信息轉(zhuǎn)換用另一種數(shù)據(jù)格式表示,以此達(dá)到壓縮目的立帖,減少圖片文件大小眼溶。
而當(dāng)我們通過代碼,將這張圖片加載進(jìn)內(nèi)存時(shí)晓勇,會(huì)先解析圖片文件本身的數(shù)據(jù)格式堂飞,然后還原為位圖,也就是 Bitmap 對(duì)象绑咱,Bitmap 的大小取決于像素點(diǎn)的數(shù)據(jù)格式以及分辨率兩者了绰筛。
所以,一張 png 或者 jpg 格式的圖片大小描融,跟這張圖片加載進(jìn)內(nèi)存所占用的大小完全是兩回事别智。你不能說,我 jpg 圖片也就 10KB稼稿,那它就只占用 10KB 的內(nèi)存空間薄榛,這是不對(duì)的。
那么让歼,一張圖片占用的內(nèi)存空間大小究竟該如何計(jì)算敞恋?
計(jì)算一張圖片占用的內(nèi)存大小公式:分辨率 * 每個(gè)像素點(diǎn)的大小。
例如:一張圖片寬1080 谋右,高 452
那么硬猫,這張圖片的大小按照這個(gè)公式應(yīng)該是:1080 * 452 * 4B = 1952640B ≈ 1.86MB
ps: 這里像素點(diǎn)大小以 4B 來計(jì)算是因?yàn)椋?dāng)沒有特別指定時(shí),系統(tǒng)默認(rèn)為 ARGB_8888 作為像素點(diǎn)的數(shù)據(jù)格式啸蜜,其他的格式如下:
ALPHA_8 -- (1B)
RGB_565 -- (2B)
ARGB_4444 -- (2B)
ARGB_8888 -- (4B)
RGBA_F16 -- (8B)
不過坑雅,這樣的說法并不準(zhǔn)確,在 Android 原生的 Bitmap 操作中衬横,某些場(chǎng)景下裹粤,圖片被加載進(jìn)內(nèi)存時(shí)的分辨率會(huì)經(jīng)過一層轉(zhuǎn)換,所以蜂林,雖然最終圖片大小的計(jì)算公式仍舊是分辨率*像素點(diǎn)大小遥诉,但此時(shí)的分辨率已不是圖片本身的分辨率了。
tip:
1.圖片占據(jù)內(nèi)存空間大小與圖片在界面上顯示的大小沒有關(guān)系
2.當(dāng)圖片放在 res 內(nèi)的不同目錄中噪叙,最終圖片加載進(jìn)內(nèi)存所占據(jù)的大小會(huì)不一樣矮锈,因?yàn)橄到y(tǒng)在加載 res 目錄下的資源圖片時(shí),會(huì)根據(jù)圖片存放的不同目錄做一次分辨率的轉(zhuǎn)換睁蕾,而轉(zhuǎn)換的規(guī)則是:
新圖的高度 = 原圖高度 * (設(shè)備的 dpi / 目錄對(duì)應(yīng)的 dpi )
新圖的寬度 = 原圖寬度 * (設(shè)備的 dpi / 目錄對(duì)應(yīng)的 dpi )
目錄名稱與 dpi 的對(duì)應(yīng)關(guān)系如下苞笨,drawable 沒帶后綴對(duì)應(yīng) 160 dpi:
3.同一個(gè) app,但跑在不同 dpi 設(shè)備上子眶,同樣的界面猫缭,但所耗的內(nèi)存有可能是不一樣的
因?yàn)樵O(shè)備的dpi不一樣