一个 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 图片所占内存大小 = 需要的高 * 需要的宽 * 像素模式所占字节数

这里的宽与高不用再乘上倍数了,因为已经是最终在手机屏幕上的宽高了。


分享到:


相關文章: