在Android中处理大图片不是一件很随意的事情,因为通常我们使用的是内置的BitmapFactory解码图片的,而BitmapFactory往往会因为图片过大而遇到OutOfMemoryError的异常。要想正常使用,一种简便的方式是分配更少的内存空间来存储,即在载入图片的时候以牺牲图片质量为代价,将图片进行放缩,这是一种避免OOM所采用的解决方法。

  在BitmapFactory中有一个内部类BitmapFactory.Options,其中值得我们研究的是inSampleSize和inJustDecodeBounds两个属性:

  1、inSampleSize —— 参数类型为int型。该值表示在解析图片为Bitmap时在长宽两个方向上像素缩小的倍数。inSampleSize的默认值和最小值为1(当小于1时,将该值当做1来处理),且在大于1时,该值只能为2的幂(当不为2的幂时,会自动取与该值最接近的2的幂)。例如,当inSampleSize为2时,一个1080*720的图片,将被缩小为540*360,相应地,它的像素数和内存占用都被缩小为了原来的1/4。

  2、inJustDecodeBounds —— 参数为Boolean型。设置inJustDecodeBounds为true后,decodeFile并不分配空间,只会获取图片的一些信息,比如原始图片的长度和宽度,即options.outWidth和options.outHeight。

  要对图片进行缩放,就要改变inSampleSize的值,通过上面的inJustDecodeBounds可以知道图片原始的大小,那么这样以来就可以通过算法来得到一个恰当的inSampleSize值。其动态算法可参考下面的:

  1. public int getSampleSize(int resourceId, int requiredWidth, int requiredHeight) {
  2. BitmapFactory.Options options = new BitmapFactory.Options();
  3. options.inJustDecodeBounds = true;
  4. BitmapFactory.decodeResource(getResources(), resourceId, options);
  5.  
  6. int imageHeight = options.outHeight;
  7. int imageWidth = options.outWidth;
  8. int inSampleSize = 1;
  9.  
  10. while (imageHeight > requiredHeight || imageWidth > requiredHeight) {
  11. inSampleSize *= 2;
  12. imageHeight /= inSampleSize;
  13. imageWidth /= inSampleSize;
  14. }
  15.  
  16. return inSampleSize;
  17. }

然后就可以用这个SampleSize去解析大图了,注意一下就是,记得不要再设置inJustDecodeBounds字段了。

关于如何避免Android中Bitmap引起的OutOfMemoryError的更多相关文章

  1. Android中Bitmap, Drawable, Byte,ID之间的转化

    Android中Bitmap, Drawable, Byte,ID之间的转化 1.  Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArray ...

  2. android中Bitmap的放大和缩小的方法

    android中Bitmap的放大和缩小的方法 时间 2013-06-20 19:02:34  CSDN博客原文  http://blog.csdn.net/ada168855/article/det ...

  3. 查找并修复Android中的内存泄露—OutOfMemoryError

    [编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...

  4. Android中 Bitmap Drawable Paint的获取、转换以及使用

    比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...

  5. Android中Bitmap对象和字节流之间的相互转换

    android 将图片内容解析成字节数组,将字节数组转换为ImageView可调用的Bitmap对象,图片缩放,把字节数组保存为一个文件,把Bitmap转Byte   import java.io.B ...

  6. Android中Bitmap对象和字节流之间的相互转换(转)

    android 将图片内容解析成字节数组:将字节数组转换为ImageView可调用的Bitmap对象:图片缩放:把字节数组保存为一个文件:把Bitmap转Byte import java.io.Buf ...

  7. 在Android中解决内存溢出 – OutOfMemoryError

    原文链接:http://riggaroo.co.za/fixing-memory-leaks-in-android-outofmemoryerror/ 注:本文在原文基础上在如何判断内存是否泄露方面进 ...

  8. Android中Bitmap,byte[],Drawable相互转化

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  9. Android中 Bitmap和Drawable相互转换的方法

    1.Drawable->Bitmap Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res, R.d ...

随机推荐

  1. ORACLE导入Excel数据

    首先建好一个和Excel表字段对应字段的表,然后 select t.* from 表名 t  for update; 点击这个锁子,打开它 粘贴,然后 再提交事务即可

  2. Django 定制验证码

    一.图片验证码 方式一: def get_validCode_img(request): path=os.path.join(settings.BASE_DIR,'static','image','1 ...

  3. 布隆过滤器 zz

    布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元 ...

  4. LeetCode239. Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  5. 今天开始学模式识别与机器学习(PRML),章节5.1,Neural Networks神经网络-前向网络。

    今天开始学模式识别与机器学习Pattern Recognition and Machine Learning (PRML),章节5.1,Neural Networks神经网络-前向网络. 话说上一次写 ...

  6. 自动选择profile

    cobbler system list cobbler profile list 方式一:自动选择profile cobbler system add --name="linux-node1 ...

  7. Apache配置文件相关命令

    转:http://www.365mini.com/page/apache-options-directive.htm Options指令是Apache配置文件中一个比较常见也比较重要的指令,Optio ...

  8. AndroidManifest.xml文件详解(permission-group)

    http://blog.csdn.net/think_soft/article/details/7578760 语法(SYNTAX): <permission-groupandroid:desc ...

  9. SSL压力测试工具THC-SSL-DOS

    SSL压力测试工具THC-SSL-DOS   SSL广泛应用安全加密和认证领域,如HTTPS.POP等服务.使用SSL,会加重服务器的负担.例如,在协商阶段,服务器的CPU开销是客户端的15倍.Kal ...

  10. 批量更新带有命名空间的XML文件的多个节点值

    /// <summary> /// 批量修改节点值 /// </summary> /// <param name="filePath">路径&l ...