bitmap压缩


		private Bitmap compressBitmap(String path, int size) throws IOException {
			// 取得图片
			InputStream ins = this.getAssets().open(path);
			BitmapFactory.Options options = new BitmapFactory.Options();
			// 这个参数代表,不为bitmap分配内存空间,只是获取该图片的一些信息(例如图片大小),就是为了后面的内存优化
			options.inJustDecodeBounds = true;
			// 通过创建图片的方式,取得options的信息,并存入options中(这里就是利用了java的地址传递来赋值)
			//虽然此方法有返回值且类型为Bitmap,但此处返回null
			BitmapFactory.decodeStream(ins, null, options);
			// 关闭流
			ins.close();

			// 生成压缩的图片
			int i = 0;
			Bitmap bitmap = null;
			while (true) {
				// 这一步是根据要设置的大小,使宽和高都能满足
				if ((options.outWidth >> i <= size)
						&& (options.outHeight >> i <= size)) {
					// 重新取得流,注意:这里一定要再次加载,不能二次使用之前的流!
					ins = this.getAssets().open(path);
					// 这个参数表示 新生成的图片为原始图片的几分之一。
					options.inSampleSize = (int) Math.pow(2.0D, i);
					// 这里之前设置为了true,所以要改为false,否则就创建不出图片
					options.inJustDecodeBounds = false;
					//此处返回压缩之后的bitmap
					bitmap = BitmapFactory.decodeStream(ins, null, options);
					break;
				}
				i += 1;
			}
			return bitmap;
	}


上面代码update如下:

		private Bitmap compressBitmap(String path, int size) throws IOException {
			// 取得图片
//			InputStream ins = this.getAssets().open(path);
			BitmapFactory.Options options = new BitmapFactory.Options();
			// 这个参数代表,不为bitmap分配内存空间,只是获取该图片的一些信息(例如图片大小),就是为了后面的内存优化
			options.inJustDecodeBounds = true;
			// 通过创建图片的方式,取得options的信息,并存入options中(这里就是利用了java的地址传递来赋值)
			//虽然此方法有返回值且类型为Bitmap,但此处返回null
//			BitmapFactory.decodeStream(ins, null, options);
			BitmapFactory.decodeFile(path, options);
			// 关闭流
//			ins.close();

			// 生成压缩的图片
			int i = 0;
			Bitmap bitmap = null;
			while (true) {
				// 这一步是根据要设置的大小,使宽和高都能满足
				if ((options.outWidth >> i <= size)
						&& (options.outHeight >> i <= size)) {
					// 重新取得流,注意:这里一定要再次加载,不能二次使用之前的流!
//					ins = this.getAssets().open(path);
					// 这个参数表示 新生成的图片为原始图片的几分之一。
					options.inSampleSize = (int) Math.pow(2.0D, i);
					// 这里之前设置为了true,所以要改为false,否则就创建不出图片
					options.inJustDecodeBounds = false;
					//此处返回压缩之后的bitmap
//					bitmap = BitmapFactory.decodeStream(ins, null, options);
					bitmap = BitmapFactory.decodeFile(path, options);
					break;
				}
				i += 1;
			}
			return bitmap;
	}

BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片可以使用decodeResource方法。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值