• 关于如何避免Android中Bitmap引起的OutOfMemoryError


      在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值。其动态算法可参考下面的:

     

        public int getSampleSize(int resourceId, int requiredWidth, int requiredHeight) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(getResources(), resourceId, options);
    
            int imageHeight = options.outHeight;
            int imageWidth = options.outWidth;
            int inSampleSize = 1;
    
            while (imageHeight > requiredHeight || imageWidth > requiredHeight) {
                inSampleSize *= 2;
                imageHeight /= inSampleSize;
                imageWidth /= inSampleSize;
            }
    
            return inSampleSize;
        }

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

  • 相关阅读:
    JSON学习笔记-5
    JSON学习笔记-4
    JSON学习笔记-3
    JSON学习笔记-2
    JSON学习笔记-1
    stm32f103各个型号芯片之间程序移植(stm32的兼容问题)
    如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李
    git常用命令
    304 怎么办 怎么解决 缓存解决
    微信小程序 CSS border-radius元素 overflow:hidden失效问题 iPhone ios 苹果兼容问题 伪类元素
  • 原文地址:https://www.cnblogs.com/wytings/p/5427745.html
Copyright © 2020-2023  润新知