Bitmap

大憨熊 提交于 2020-02-27 18:25:03

一、避免Bitmap加载太大的图片引起OOM

不考虑图片精度问题,则可以使用图片压缩,压缩后的目标图片大小可以参照视图控件的大小:
1.计算视图控件的宽和高
2.Decode时使用BitmapFactory.Options参数,设置BitmapFactory.Options的inJustDecodeBounds变量为true,只获取图片的长和宽,不为图片分配内存
3.计算宽的压缩比和高的压缩比,取小的,这样压缩后的图片大小一定都会>=视图控件的宽和高,设置options.inSampleSize值为计算出的压缩比
4.设置 options.inJustDecodeBounds = false,调用BitmapFactory.decodeResource(res, resId, options)根据options参数解析图片

/**
计算压缩比
*/
public static int calculateInSampleSize(BitmapFactory.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 heightRatio = Math.round((float) height / (float) reqHeight);
		final int widthRatio = Math.round((float) width / (float) reqWidth);
		// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
		// 一定都会大于等于目标的宽和高。
		inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
	}
	return inSampleSize;
}

/**
根据计算的压缩比解析图片,返回Bitmap 
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {
	// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);
    // 调用上面定义的方法计算inSampleSize值
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    // 使用获取到的inSampleSize值再次解析图片
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!