android 通过uri获取bitmap图片并压缩 在 Android 开发中,获取并压缩图片是一项非常重要的任务。特别是在调用图库选择图片时,需要通过uri获取bitmap图片并进行压缩,以避免OutOfMemoryError(OOM)。本文将详细介绍如何通过uri获取bitmap图片并压缩。 让我们来看看 Media.getBitmap() 方法的源码: ```java public static final Bitmap getBitmap(ContentResolver cr, Uri url) throws FileNotFoundException, IOException { InputStream input = cr.openInputStream(url); Bitmap bitmap = BitmapFactory.decodeStream(input); input.close(); return bitmap; } ``` 从源码中可以看到,Media.getBitmap() 方法非常简单粗暴,只是将InputStream解码成Bitmap,然后返回原始大小的Bitmap。如果图库选择的图片很大时,程序极有可能会报OOM。 为了避免OOM,我们需要改进该方法,在 BitmapFactory.decodeStream 之前压缩图片。下面是改进后的代码: ```java public static Bitmap getBitmapFormUri(Activity ac, Uri uri) throws FileNotFoundException, IOException { InputStream input = ac.getContentResolver().openInputStream(uri); BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options(); onlyBoundsOptions.inJustDecodeBounds = true; onlyBoundsOptions.inDither = true;//optional onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional BitmapFactory.decodeStream(input, null, onlyBoundsOptions); input.close(); int originalWidth = onlyBoundsOptions.outWidth; int originalHeight = onlyBoundsOptions.outHeight; if ((originalWidth == -1) || (originalHeight == -1)) return null; //图片分辨率以480x800为标准 float hh = 800f;//这里设置高度为800f float ww = 480f;//这里设置宽度为480f //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;//be=1表示不缩放 if (originalWidth > originalHeight && originalWidth > ww) {//如果宽度大的话根据宽度固定大小缩放 be = (int) (originalWidth / ww); } else if (originalHeight > originalWidth && originalHeight > hh) {//如果高度大的话根据高度固定大小缩放 be = (int) (originalHeight / hh); } //计算缩放比 if (be <= 0) be = 1; BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = be; input = ac.getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions); input.close(); return bitmap; } ``` 在上面的代码中,我们首先通过 BitmapFactory.Options 对象来获取图片的原始宽度和高度,然后计算缩放比,最后使用 BitmapFactory.decodeStream() 方法来解码图片。这样可以避免OOM,并且可以获取到压缩后的bitmap图片。 在实际开发中,我们可以在 onActivityResult() 方法中调用 getBitmapFormUri() 方法来获取压缩后的bitmap图片。例如: ```java Uri mImageCaptureUri = data.getData(); Bitmap photoBmp = null; if (mImageCaptureUri != null) { photoBmp = getBitmapFormUri(ac, mImageCaptureUri); } ``` 通过uri获取bitmap图片并压缩是 Android 开发中非常重要的一步骤。通过改进 Media.getBitmap() 方法,我们可以避免OOM,并且可以获取到压缩后的bitmap图片。
- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- 粉丝: 3
- 资源: 968
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 【Python】基于话题相似度的夸夸机器人.zip
- 【机器人】将ChatGPT飞书机器人钉钉机器人企业微信机器人公众号部署到vercel及docker.zip
- 【java】用mirai机器人搜索音乐并以卡片的形式分享.zip
- 【爬虫】vue2聊天室,图灵机器人,node爬虫.zip
- 【Python爬虫】基于Python的淘宝千牛店铺上下架商品.zip
- 【Python】基于Python的美篇高清图片爬虫.zip
- MATLAB 风力发电系统低电压穿越-串电阻策略 低电压穿越 双馈风力发电机
- 【Python】基于Python爬虫爬取牛津三千词并导入到Anki方便背诵.zip
- 【Python】Python爬虫实战--小猪短租爬虫.zip
- 【Python学习】Python爬虫学习、总结、收集.zip
- 【PHP】一个PHP写的telegram机器人.zip
- 【Python爬虫】基于Python实现基本的网页爬虫.zip
- 【java】Java课程大项目-消息中间件比赛(实现进程内消息队列).zip
- 【C#】基于C#的消息队列服务产品中间件.zip
- 【机器人】基于code hijack和code injection极简微信机器人.zip
- 【Python】简明饭否机器人教程(使用Python).zip