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方法。