通过BitmapFactory.Options来缩放图片,主要是用到了它的inSampleSize参数,即采样率。官方文档建议inSampleSize取值最好为2的指数。缩放比例就是1/(inSampleSize的2次方).inSampleSize取值有两种情况比较特殊:
- 当inSampleSize小于1时,其作用就相当于1,无缩放效果
- 当inSampleSize大于1且不为2的指数时,那么系统会向下取整并选择一个最接近2的指数来代替
如何通过采样率来有效的加载图片?
- 将BitmapFactory.Options的inJustDecodeBounds参数设为true,并加载图片(别忘记了)
- 从BitmapFactory.Options中取出图片的原始宽高信息,它们对应于outWidth和outHeight参数
- 根据采样率的规则并结合目标view的所需大小计算出采样率inSampleSize
- 将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片
下面是通过BitmapFactory.Options来缩放图片的部分代码:
/**
* 缩放资源id为resId的图片
* @param res
* @param resId 资源id
* @param reqWidth 缩放后的宽度
* @param reqHeight 缩放后的高度
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId,options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds=false;
return BitmapFactory.decodeResource(res, resId,options);
}
/**
*计算inSampleSize
* @param options
* @param reqWidth 缩放后的宽度
* @param reqHeight 缩放后的高度
* @return
*/
private static int calculateInSampleSize(Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
//计算inSampleSize直到缩放后的宽高都小于指定的宽高
while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
System.out.println(inSampleSize);
return inSampleSize;
}
使用时的代码如下:
Bitmap bitmap=BitmapUtils.decodeSampledBitmapFromResource(getResources(), R.drawable.timg2, 100, 100);
img.setImageBitmap(bitmap);