一個 jpg 文件,在被展現出來,都是要被轉換成 Bitmap 的,那麼這個 Bitamp 又佔用多大的內存空間呢?下面分狀況來討論下。spa
第一種狀況,圖片被按照原大小展現出來。這裏從網上拿到一個圖片,大小爲 1920 * 1080圖片
而後,我把這個圖片展現出來,並經過 AndroidStudio dump 出 hprof.而且找到這個被解析出來的 Bitmap內存
如上圖,內存大小爲 57153600 B = 54M。這個大小是怎麼來的呢?繼續看上圖,其 寬高分別爲 5040 * 2835. 這裏解析圖片時用的默認配置,即it
Bitmap.Config.ARGB_8888
這個配置表示一個像素須要用 32 位,即 4 字節來表示。那麼最後得出來的內存大小就爲 5040 * 2835 * 4.通過計算恰好就是 57153600.由此獲得一個 jpg 在內存中所佔用的圖片大小的計算公式爲:io
jpg圖片所佔內存大小 = 圖片被解析出來後的寬 * 圖片被解析出來後的高 * 單位像素顏色模式所佔字節數配置
獲得上面的公式後,還有一個小問題。就是原圖是 1920 * 1080.而解析出來的是 5040 * 2835.仔細看看就會知道他們的關係是 寬與寬,高與高恰好是 2.625 倍。map
因此問題就變成了這個 2.625 是從哪裏來的。其實也簡單,就是圖片也是手機屏幕的 density = 420dpi.當咱們描述圖片大小爲 1920 * 1080 的時候,用的是標準的,也即 1 倍 density = 160dpi。而這裏的 2.625 就是 420 / 160.若是手機的屏幕爲 480 dpi,那麼獲得的值就是 3.且稱之爲倍數吧。im
因此最終獲得的公式爲:img
jpg圖片所佔內存大小 = (寬 * density / 160) * (高 * density / 160)* 像素模式所佔字節數 di
第二種狀況,就是根據須要的寬與高來展現出來的。有了上面的公式推導,其實就已經很簡單了,即:
jpg 圖片所佔內存大小 = 須要的高 * 須要的寬 * 像素模式所佔字節數
這裏的寬與高不用再乘上倍數了,由於已是最終在手機屏幕上的寬高了。