"通过uri获取并压缩Android中的Bitmap图片" 在Android开发中,用户经常需要从图库选择图片,这时开发者通常会通过URI来获取选中的图片。然而,直接使用`MediaStore.Images.Media.getBitmap()`方法可能会导致内存溢出(Out Of Memory,简称OOM)问题,尤其是当选取的图片尺寸较大时。为了避免这个问题,我们需要对图片进行适当的压缩处理。以下是如何通过URI获取Bitmap图片并进行压缩的详细步骤。 首先,我们来看一下`MediaStore.Images.Media.getBitmap()`方法的实现。这个方法会打开一个InputStream,然后使用`BitmapFactory.decodeStream()`直接将流解码为Bitmap。由于没有进行任何压缩操作,如果图片过大,解码后的Bitmap将消耗大量内存,从而可能引发OOM异常。 为了防止这种情况,我们需要在解码前对图片进行压缩。以下是一种改进的方法: ```java public static Bitmap getBitmapFormUri(Activity activity, Uri uri) { try { // 获取图片的缩略图尺寸,可以根据需求调整 int targetWidth = 800; int targetHeight = 800; // 获取图片的原始尺寸 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; InputStream is = activity.getContentResolver().openInputStream(uri); BitmapFactory.decodeStream(is, null, options); is.close(); // 计算缩放比例 int scale = Math.max(options.outWidth / targetWidth, options.outHeight / targetHeight); // 使用缩放比例重新解码图片 options = new BitmapFactory.Options(); options.inSampleSize = scale; options.inPreferredConfig = Bitmap.Config.RGB_565; // 使用RGB_565配置减少内存占用 is = activity.getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is, null, options); is.close(); return bitmap; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } ``` 在这个改进版的`getBitmapFormUri()`方法中,我们首先获取了图片的原始尺寸,然后计算出合适的缩放比例(`inSampleSize`),使得解码后的图片大小不超过目标尺寸。同时,我们还设置了`inPreferredConfig`为`Bitmap.Config.RGB_565`,这是一种比默认的`ARGB_8888`更节省内存的色彩配置。 在`onActivityResult()`中,你可以像这样调用这个方法: ```java Uri selectedImageUri = data.getData(); Bitmap bitmap = getBitmapFormUri(this, selectedImageUri); // 现在你可以安全地使用这个压缩过的Bitmap了 ``` 通过这种方式,我们可以在不牺牲用户体验的前提下,有效地避免了因图片过大导致的内存溢出问题。同时,压缩后的图片仍然可以满足大多数显示需求,减少了应用程序对内存的消耗,提高了应用的性能和稳定性。
下载后可阅读完整内容,剩余2页未读,立即下载
- 粉丝: 3
- 资源: 969
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解