今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候

就要用BitmapFactory.Options这个东东了,Options里主要有两个参数比较重要.

[java] view plaincopy
  1. options.inJustDecodeBounds = false/true;
  2. //图片压缩比例.
  3. options.inSampleSize = ssize;

我们去解析一个图片,如果太大,就会OOM,我们可以设置压缩比例inSampleSize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,第一步就是

获取图片的宽高,这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,然后第二步就是设置合适的压缩比例inSampleSize,这时候获得合适的Bitmap.这里我画了简单的流程图,如下:

主要是通过BitmapFactory.Options 来实现。

Options中有个属性inJustDecodeBounds。我们可以充分利用它,来避免大图片的溢出问题。他是什么原理呢?

API这样说:如果该 值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。但是允许我们查询图片的信息这其中就包括图片大小信息(

options.outHeight (图片原始高度)和option.outWidth(图片原始宽度))。

Options中有个属性inSampleSize。我们可以充分利用它,实现缩放。

如果被设置为一个值> 1,要求解码器解码出原始图像的一个子样本,返回一个较小的bitmap,以节省存储空间。

例如,inSampleSize = = 2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

对于任何值< = 1的同样处置为1。

那么相应的方法也就出来了,通过设置 inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),

然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。

实现步骤:

第一步:BitmapFactory.Option

设置 inJustDecodeBounds为true

第二步:BitmapFactory.decodeFile(path,option)方法

解码图片路径为一个位图。如果指定的文件名是空的,或者不能解码到一个位图,函数将返回null[空值]。

获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度)

第三步:计算缩放比例,也可以不计算,直接给它设定一个值。

options.inSampleSize = "你的缩放倍数";

如果是2就是高度和宽度都是原始的一半。

第四步:设置options.inJustDecodeBounds = false;

重新读出图片

bitmap = BitmapFactory.decodeFile(path, options);

具体实现:

package xiaosi.compress;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;public class Compress extends Activity
{/** Called when the activity is first created. */private ImageView    image    = null;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);image = (ImageView) findViewById(R.id.image);image.setImageBitmap(decodeBitmap());}public Bitmap decodeBitmap(){BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;// 通过这个bitmap获取图片的宽和高&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/MTXX/3.jpg", options);if (bitmap == null){System.out.println("bitmap为空");}float realWidth = options.outWidth;float realHeight = options.outHeight;System.out.println("真实图片高度:" + realHeight + "宽度:" + realWidth);// 计算缩放比&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int scale = (int) ((realHeight > realWidth ? realHeight : realWidth) / 100);if (scale <= 0){scale = 1;}options.inSampleSize = scale;options.inJustDecodeBounds = false;// 注意这次要把options.inJustDecodeBounds 设为 false,这次图片是要读取出来的。&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;bitmap = BitmapFactory.decodeFile("/sdcard/MTXX/3.jpg", options);int w = bitmap.getWidth();int h = bitmap.getHeight();System.out.println("缩略图高度:" + h + "宽度:" + w);return bitmap;}
}

android 的injustdecodebounds相关推荐

  1. 分享大神的一些博文、视频、资料--持续更新

    心理学家 Ericsson 的研究发现:决定伟大水平和一般水平的关键因素,既不是天赋,也不是经验,而是[刻意练习]的程度. 教育最重要的不是灌输,而是引发思考.这样的话就没有必要按时间顺序,介绍很多细 ...

  2. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )

    文章目录 一.解码图片参数 inJustDecodeBounds 二.计算图片的缩小比例 三.设置图片缩小配置 inSampleSize 四.设置图片像素格式 inPreferredConfig 五. ...

  3. Android 高清加载巨图方案 拒绝压缩图片

    Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处:  http://blog.csdn.net/lmj623565791/article/details/49300989:  本文出自: ...

  4. Android 常见工具类封装

    1,MD5工具类: public class MD5Util {public final static String MD5(String s) {char hexDigits[] = { '0', ...

  5. Android Handler 异步消息处理机制的妙用 创建强大的图片载入类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 近期创建了一个群.方便大家交流,群号: ...

  6. Android内存管理之道

    2019独角兽企业重金招聘Python工程师标准>>> 相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确实是一门 ...

  7. android获取图片缩略图,Android系获取图片和视频的缩略图

    获取手机里视频缩略图: public static Bitmap getVideoThumbnail(ContentResolver cr,Uri uri) { Bitmap bitmap = nul ...

  8. Android高效加载大图、多图解决方案,有效避免程序OOM

    高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...

  9. Android性能优化之图片压缩优化

    1 分类 Android图片压缩结合多种压缩方式,常用的有尺寸压缩.质量压缩.采样率压缩以及通过JNI调用libjpeg库来进行压缩. 参考此方法:Android-BitherCompress 备注: ...

最新文章

  1. 【转】SAP中的FTP操作样例
  2. 如何检测过期的统计信息(转)
  3. 使用ActiveMQ支持Spring Integration路由
  4. 有关eclipse for java ee版本遇到的坑( Context initialization failed)
  5. 29岁当教授,发表11篇Nature和Science,这位顶尖科学家正式全职回国
  6. Java 并发(JUC 包-03)
  7. linux下用c语言写吃金豆,吃金豆pacmanTC版
  8. IPD流程在华为15年发展历程…
  9. 机器人光机电一体化分拣实训系统
  10. 希腊字母在数学或物理中代表的意思各是什么
  11. 鸟与虫(六)拉勾网,我可不可以找到工作
  12. 认识与使用计算机 答案,2016年计算机二级文管试题题库(含答案)
  13. Activiti流程引擎架构概述
  14. Android自定义星星评分控件,高效
  15. 飞凌单片机解密_GX28E01单片机解密
  16. 华为p10 内存测试软件,华为p10闪存门怎么回事 华为p10/P10Plus闪存怎么测试
  17. 最优策略(Optimal Policy)及贝尔曼最优方程(Bellman Optimally Equation)
  18. 7-182 换钱计划
  19. 《深入理解计算机系统》(CSAPP)实验七 —— Malloc Lab
  20. Volatility 内存数字取证方法

热门文章

  1. HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);出现异常
  2. 【19保研】保研预报名招生信息汇总!
  3. 华兴数控g71外圆循环编程_数控G71内外圆粗车循环指令教案
  4. mysql intersect 使用方法_MySQL查询优化一例——也说说 Using intersect
  5. antd react table扩展行(expandedRowRender,onExpand)异步记载数据再渲染问题
  6. JAVA-------计算机基础与准备阶段
  7. 天宇,snapseed,第四课,风光照片调整
  8. Windows下双网卡配置静态路由,实现内外网同时使用
  9. RtlCopyMemory致使的蓝屏
  10. 机器学习:几种常见的学习方法