我们知道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从而得出图片所占用的内存。