一个 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 图片所占内存大小 = 须要的高 * 须要的宽 * 像素模式所占字节数
这里的宽与高不用再乘上倍数了,由于已是最终在手机屏幕上的宽高了。