通过BitmapFactory.Options来缩放图片

通过BitmapFactory.Options来缩放图片,主要是用到了它的inSampleSize参数,即采样率。官方文档建议inSampleSize取值最好为2的指数。缩放比例就是1/(inSampleSize的2次方).inSampleSize取值有两种情况比较特殊:

  1. 当inSampleSize小于1时,其作用就相当于1,无缩放效果
  2. 当inSampleSize大于1且不为2的指数时,那么系统会向下取整并选择一个最接近2的指数来代替
如何通过采样率来有效的加载图片?
  1. 将BitmapFactory.Options的inJustDecodeBounds参数设为true,并加载图片(别忘记了)
  2. 从BitmapFactory.Options中取出图片的原始宽高信息,它们对应于outWidth和outHeight参数
  3. 根据采样率的规则并结合目标view的所需大小计算出采样率inSampleSize
  4. 将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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值