一個 jpg 在Android中所佔用的內存大小

一個 jpg 文件,在被展示出來,都是要被轉換成 Bitmap 的,那麼這個 Bitamp 又佔用多大的內存空間呢?下面分情況來討論下。

第一種情況

圖片被按照原大小展示出來。這裡從網上拿到一個圖片,大小為 1920 * 1080


一個 jpg 在Android中所佔用的內存大小


然後,我把這個圖片展示出來,並通過 AndroidStudio dump 出 hprof.並且找到這個被解析出來的 Bitmap


一個 jpg 在Android中所佔用的內存大小


如上圖,內存大小為 57153600 B = 54M。這個大小是怎麼來的呢?繼續看上圖,其 寬高分別為 5040 * 2835. 這裡解析圖片時用的默認配置,即
Bitmap.Config.ARGB_8888

這個配置表示一個像素需要用 32 位,即 4 字節來表示。那麼最後得出來的內存大小就為 5040 * 2835 * 4.經過計算剛好就是 57153600.由此得到一個 jpg 在內存中所佔用的圖片大小的計算公式為:

jpg圖片所佔內存大小 = 圖片被解析出來後的寬 * 圖片被解析出來後的高 * 單位像素顏色模式所佔字節數

得到上面的公式後,還有一個小問題。就是原圖是 1920 * 1080.而解析出來的是 5040 * 2835.仔細看看就會知道他們的關係是 寬與寬,高與高剛好是 2.625 倍。所以問題就變成了這個 2.625 是從哪裡來的。其實也簡單,就是圖片也是手機屏幕的 density = 420dpi.當我們描述圖片大小為 1920 * 1080 的時候,用的是標準的,也即 1 倍 density = 160dpi。而這裡的 2.625 就是 420 / 160.如果手機的屏幕為 480 dpi,那麼得到的值就是 3.且稱之為倍數吧。

所以最終得到的公式為:jpg圖片所佔內存大小 = (寬 * density / 160) * (高 * density / 160) 像素模式所佔字節數*

第二種情況

就是根據需要的寬與高來展示出來的。有了上面的公式推導,其實就已經很簡單了,即:

jpg 圖片所佔內存大小 = 需要的高 * 需要的寬 * 像素模式所佔字節數

這裡的寬與高不用再乘上倍數了,因為已經是最終在手機屏幕上的寬高了。


分享到:


相關文章: