很多搞android開發(fā)的搞了幾年都搞不清這些細(xì)節(jié),我也是糊里糊涂地過來的,今天特意來梳理一下,有錯誤的地方請留言指教。
假設(shè)有一張1080x480的png圖片大小50k,加載到內(nèi)存占有多大內(nèi)存空間呢?
- 答案是不確定。要注意:這里看到的50k是pc上壓縮后的圖片大小,而android手機加載的圖片顯然不是壓縮的圖片,是要還原后的原圖。至于怎么還原那是圖片解壓縮算法(或者說編解碼算法)范疇了。
- 那需要多大內(nèi)存空間呢?有關(guān)因素有:圖片分辨率(圖片寬高)、每個像素點大小(比如rbg和rbga格式大小不同吧)、如果* 是resource資源還與圖片存放在哪個drawable目錄有關(guān)。
那到底占用多大內(nèi)存空間呢?
非drawable資源圖片:占用內(nèi)存空間大小 = 每個像素大小 x 圖片寬度 x 圖片高度 = 每個像素大小 x 分辨率
drawable資源圖片:占用內(nèi)存空間大小 = 每個像素大小 x 相對寬度 x 相對高度
相對寬度 = 圖片寬度 x (手機設(shè)備像素密度 / drawable-xx目錄對應(yīng)的像素密度 )
相對高度 = 圖片高度 x (手機設(shè)備像素密度 / drawable-xx目錄對應(yīng)的像素密度 )
drawable-xx目錄對應(yīng)的像素密度值,如下:
標(biāo)準(zhǔn)值為mdpi=160,hdpi=1.5x160=240,xdpi=2x160=320,xxdpi=3x160=480
真實手機設(shè)備像素密度值怎么計算呢?如下:
手機像素密度值 = 手機對角線上多少個像素 / 手機對角線上多少英寸
- 下面是舉例子說明一張圖片加載到內(nèi)存的計算:
假設(shè)有一張1080x480的png圖片,
其原始大小為:1080x480x4B=2073600B=1.98MB //rgba各占1B
pc上看到的是壓縮圖片,可能也就50k左右,相差那么多呢。。
如果這張圖片是從非drawable-xxx目錄比如文件網(wǎng)絡(luò)等地方加載的,不做任何裁剪壓縮等操作,加載到內(nèi)存需要大約1.98MB。
如果這張圖片放在drawable-mdpi目錄下,從這個目錄加載的呢?那么其占用內(nèi)存大小計算如下:
drawable-mdpi目錄對應(yīng)的像素密度值為160,
假設(shè)一部手機比較高端像素密度值為xxdpi即480,
那么這張圖片加載到內(nèi)存不做裁剪壓縮等處理,占用的大小為:
dw = 1080x(480/160) = 1080x3 = 3240
dh = 480x(480/160) = 480x3 = 1440
size = 3240x1440x4B = 18662400B = 17.8MB
可以看出:放在密度比較低的drawable-xx下,加載到密度比較高的手機上時,內(nèi)存占用是很大的,要特別注意。
如果這張圖片放在drawable-xxdpi目錄下,從這個目錄加載的呢?那么其占用內(nèi)存大小計算如下:
drawable-xxdpi目錄對應(yīng)的像素密度值為480,
假設(shè)一部手機比較低端像素密度值為mdpi即160,
那么這張圖片加載到內(nèi)存不做裁剪壓縮等處理,占用的大小為:
dw = 1080x(160/480) = 1080/3 = 360
dh = 480x(160/480) = 480/3 = 160
size = 360x160x4B = 230400B = 225KB
可以看出:放在密度比較高的drawable-xx下,加載到密度比較低的手機上時,內(nèi)存占用是很小的,但圖片往往比較模糊。
- 通過上面的計算例子可以看出,在權(quán)衡圖片模糊程度后往往選擇將圖片放在密度比較高的drawable-xx目錄下,比如drawable-xxdpi目錄下。這樣可以避免高端手機加載圖片時占用過多內(nèi)存,低端手機又能看清楚可以接受即可。
- 實際項目開發(fā)里,往往會對圖片做適當(dāng)?shù)牟眉魤嚎s等操作,在視覺上可以接受的情況下想方法盡可能減少圖片加載到內(nèi)存所占的空間。android在api層面給我們提供了BitmapFactory.Options來處理這個問題。
- 如何獲取圖片加載到內(nèi)存的大小,我使用的是bitmap.allocationByteCount方法獲取的。
- 手機像素密度具體可以參考:具體參考
?著作權(quán)歸作者所有:來自51CTO博客作者yongfengnice的原創(chuàng)作品,請聯(lián)系作者獲取轉(zhuǎn)載授權(quán),否則將追究法律責(zé)任
android開發(fā)圖片放在drawable-xx下的區(qū)別以及加載bitmap內(nèi)存分析
https://blog.51cto.com/u_15639793/5297232