一個 jpg 文件,在被展示出來,都是要被轉(zhuǎn)換成 Bitmap 的,那么這個 Bitamp 又占用多大的內(nèi)存空間呢?下面分情況來討論下。
第一種情況
圖片被按照原大小展示出來。這里從網(wǎng)上拿到一個圖片,大小為 1920 * 1080
然后,我把這個圖片展示出來,并通過 AndroidStudio dump 出 hprof.并且找到這個被解析出來的 Bitmap
如上圖,內(nèi)存大小為 57153600 B = 54M。這個大小是怎么來的呢?繼續(xù)看上圖,其 寬高分別為 5040 * 2835. 這里解析圖片時用的默認配置,即
Bitmap.Config.ARGB_8888
這個配置表示一個像素需要用 32 位,即 4 字節(jié)來表示。那么最后得出來的內(nèi)存大小就為 5040 * 2835 * 4.經(jīng)過計算剛好就是 57153600.由此得到一個 jpg 在內(nèi)存中所占用的圖片大小的計算公式為:
jpg圖片所占內(nèi)存大小 = 圖片被解析出來后的寬 * 圖片被解析出來后的高 * 單位像素顏色模式所占字節(jié)數(shù)
得到上面的公式后,還有一個小問題。就是原圖是 1920 * 1080.而解析出來的是 5040 * 2835.仔細看看就會知道他們的關(guān)系是 寬與寬,高與高剛好是 2.625 倍。
所以問題就變成了這個 2.625 是從哪里來的。其實也簡單,就是圖片也是手機屏幕的 density = 420dpi.當(dāng)我們描述圖片大小為 1920 * 1080 的時候,用的是標(biāo)準(zhǔn)的,也即 1 倍 density = 160dpi。而這里的 2.625 就是 420 / 160.如果手機的屏幕為 480 dpi,那么得到的值就是 3.且稱之為倍數(shù)吧。
所以最終得到的公式為:
jpg圖片所占內(nèi)存大小 = (寬 * density / 160) * (高 * density / 160) 像素模式所占字節(jié)數(shù)*
第二種情況
就是根據(jù)需要的寬與高來展示出來的。有了上面的公式推導(dǎo),其實就已經(jīng)很簡單了,即:
jpg 圖片所占內(nèi)存大小 = 需要的高 * 需要的寬 * 像素模式所占字節(jié)數(shù)
這里的寬與高不用再乘上倍數(shù)了,因為已經(jīng)是最終在手機屏幕上的寬高了。