Android如何计算一个图片占用内存的大小?

     我们知道Android是通过Bitmap来加载图片进内存的,而Bitmap是一种位图,本身就是一些像素点组成一张图片,那我们计算一个图片的大小肯定就是长乘宽,px乘px不就算出来了,是的但是1px等于多少byte这个是怎么得到,这个在Bitmap中也有表示,那就是:
Bitmap.Config 表示图片像素类型,包括ALPHA_8、RGB_565、ARGB_4444、ARGB_8888
其中 A表示透明度;RGB分别是Red、Green、Blue,三种原色

像素类型 表示
ARGB_8888 四个通道都是8位,每个像素占用4个字节,图片质量是最高的,但是占用的内存也是最大的
ARGB_4444 四个通道都是4位,每个像素占用2个字节,图片的失真比较严重(已不推荐使用)
RGB_565 没有透明通道,每个像素占用2个字节,图片失真小,但是没有透明度
ALPHA_8 只有透明通道,每个像素占用1个字节大大小,只有透明度,没有颜色值

     Bitmap.Config中定义了几种像素类型,它可以根据图片宽高,最后计算出我们加载进内存的图片大小。写写代码看一下结果,我将一张png图片大小96x96放入mipmap目录

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher, options);
Log.d("Test", "width=" + bitmap.getWidth() + ",height=" + bitmap.getHeight() + ",size=" + bitmap.getByteCount());

结果得到的结果是:
在这里插入图片描述
     这里的长和宽变大了,因为我们放入了mipmap-xhdpi目录,这里我们还需要掌握,图片所放入的目录对图片大小有什么影响,我们知道图片来源有以下几个目录(mipmap和drawable同理)

MDPI HDPI XHDPI XXHDPI XXXHDPI
density 160 240 320 480 640
densityDpi 1 1.5 2 3 4

     density表示屏幕的像素密度,densityDpi表示屏幕上的点等于多少像素,那这下我们就可以知道为什么最后得到的宽是126像素了,我使用的测试机品牌是一加五,我们可以通过代码获取一下他的density(获取的density为2.625)

		DisplayMetrics displayMetrics = new DisplayMetrics();
        //将信息保存到displayMetrics中.
        this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        //1.x轴和y轴的dpi.
        Log.d("logDensityInfo", "ydpi=" + displayMetrics.ydpi);
        Log.d("logDensityInfo", "xdpi=" + displayMetrics.xdpi);
        //2.x轴和y轴的像素个数.
        Log.d("logDensityInfo", "heightPixels=" + displayMetrics.heightPixels);
        Log.d("logDensityInfo", "widthPixels=" + displayMetrics.widthPixels);
        //3.dpi
        Log.d("logDensityInfo", "densityDpi=" + displayMetrics.densityDpi);
        //4.dpi/160.
        Log.d("logDensityInfo", "density=" + displayMetrics.density);
        //5.通常情况下和density相同.
        Log.d("logDensityInfo", "scaledDensity=" + displayMetrics.scaledDensity);

     我们可以计算一下,将96宽度像素宽度的图片放在xhdpi下,它的密度是2,手机的密度是2.625
显示在设备上的宽度(图片真正加载进去的宽):96x2.625/2 = 126px

图片载入模式是ARGB_8888, 一个像素占四个字节
占内存字节大小: 126 x 126 x 4 = 63504

同理如果改成RGB_565, 那么大小应该为126 x 126 x 2 = 31752.

总结一下:

     图片所占用的Bitmap大小计算方法,根据我们所放置图片的目录不同,所以图片多多少少长度和宽度会有一些变化,这个变化和我们所用的设备屏幕密度有关,因此可以根据图上的表来计算长和宽

原始图片宽度                 实际显示图片宽度
————————     = ————————————
放入目录DensityDpi        当前手机的像素密度

然后根据我们所设置的像素类型ARGB_8888或RGB_888去乘上对应的1px所表示的byte从而得出图片所占用的内存。

你可能感兴趣的:(Android技术)