图片的二次采样,防止图片加载导致内存不足
图片加载中由于图片太大导致的会导致设备的内存不足,所以这里就需要对图片的大小进行一定的裁剪,通常称之为图片的二次采样,
其中第一次采样是只是单纯的获取图片的宽和高,对图片并没有什么非分之想... ,首先需要用到采样的条件,通 过 BitmapFactory.Options得到一个
opts(姑且这样叫),然后通过这个 opts.inJustDecodeBounds = true;这里的话,inJustDecodeBounds字面意思就知道仅仅获取图片的 边缘(也就是宽和高),
第一次采样让它为true,只获取图片原始的宽和高,第二次采样的时候就要将它置为false,要真正开始采样了..
采样的时候有一个采样比率,默认是1, 如果是 1 的话,他就是图片原始的宽高,如果是 2 的话,他就是取图片宽和高的1/2,也就是宽取一 半,高取一半,这样获取的图片就是原始图片的1/4 大了,以此类推,如果是4 的话,获取的图片大小就是原始图片的1/16了,采样比率都是 2的倍数...
代码:
//galaxy2这张图片,不进行压缩,大小是2.78M
//图片===图片的二次采样
//第一次,假采,并不会生成bitmap ,目的图片的宽高
//采样的条件
BitmapFactory.Options opts = new BitmapFactory.Options();
//仅仅采集边界===宽高
opts.inJustDecodeBounds = true;//
Bitmap bitmap = BitmapFactory
.decodeResource(getResources(), R.mipmap.galaxy2,opts);
Log.d("flag", "----------------->download: 第一次采样的bitmap: " +bitmap);
int rawHeight = opts.outHeight;//图片原始的高度
int rawWidth = opts.outWidth;//图片原始的宽度
Log.d("flag", "----------------->download: 原始图片的宽: " +rawWidth+", 高: "+rawHeight);
//第二次
opts.inJustDecodeBounds = false;//采集的bitmap图片
int inSampleSize = 1;
//计算采样比率
//标准100*100; 300*300;100*200
//标准 100*100px
while (rawHeight>=100*inSampleSize&&rawWidth>=200*inSampleSize){
inSampleSize*=2;
}
Log.d("flag", "----------------->download: 采样比率: " +inSampleSize);
opts.inSampleSize = inSampleSize;//采样比率= 2 图片原图1/4
//第二次采集图片
mBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.galaxy2,opts);
//采样比率16采样之后的大小是:0.01M
//采样比率8采样之后的大小是:0.04M
Log.d("flag", "----------------->download: bitmap进行二次采样的大小是: " +
mBitmap.getByteCount()*1.0f/1024/1024);
img.setImageBitmap(mBitmap);
//标准100*100; 300*300;100*200 这个就是想让采样后的图片多大
如果理想的图片宽 和 高乘以采样的比率比原始图片的宽.高小,那么继续将采样的比率乘以2,继续采..直到符合条件为止,然后所得的tp就是想要的图片大小
..