有了前面两篇文章的铺垫,我们计算Bitmap的大小就相对来说比较简单了。
Android 基础篇 — 不同DPI取哪个本地文件夹中的资源
Android 基础篇 — 放不同drawable文件夹中图片的大小
还是先把这个表格画出来:
drawable | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
---|---|---|---|---|---|
density | 1 | 1.5 | 2 | 3 | 4 |
densityDpi | 160 | 240 | 320 | 480 | 640 |
一般来说,图片的大小满足以下计算公式。
图片大小 = 图片像素点个数 * 每个像素点大小
1 图片像素点个数
那我们就先来看图片像素点个数这个因素,由前两篇文章我们得知,图片像素点个数不仅和图片本身大小相关,还和放在哪个文件夹以及手机屏幕dpi值都有着密切的关联。
在drawable-xhdpi
中放置一张宽高为1125 X 900
的图片,运行以下代码打印了一些相关的值。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Log.d("zp_test", "density: " + metrics.density);
Log.d("zp_test", "densityDpi: " + metrics.densityDpi);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
LogUtils.d("memory 1: " + bitmap.getAllocationByteCount());
}
LogUtils.d("height: " + bitmap.getHeight());
LogUtils.d("width: " + bitmap.getWidth());
image.png
900
的高度,像素点怎么会变成1238
呢?其实只是等比例放大了,因为手机的density
值为2.75
,而xhpi
文件夹的值为2
。
2.75 / 2 * 900 = 1237.5 ≈ 1238
宽度以此类推。
2 像素点大小
图片常见的格式如下:
ARGB_4444,每个像素点2个字节(2byte)
ARGB_8888,每个像素点4个字节(4byte)
RGB_565,每个像素点2个字节(2byte)
而Android手机中,图片的格式和原图的某些属性相关,这里就不作展开讨论。
而此张图的格式为ARGB_8888
,也就是4
个字节,所以打印出来的大小是这样计算出来的:
1238 * 1547 * 4 = 7660744