Android中Bitmap的高效加载

为了避免在ImageView中加载的图片过大而导致程序出现OOM的现象,利用BitmapFactory.Option的有关方法来实现。

主要流程

  1. 创建BitmapFactorty.Options对象设置inJustDecodeBound属性为true并加载图片
  2. 从BitmapFactory.Options 中取出图片的宽高信息,它们对应于outWidth和outHeight参数。
  3. 根据采样率的规则并结合目标View的所需大小计算出采样率inSampleSize。
    4.将BitmapFactory.Options的inJuseDecodeBounds设为false,然后重新加载图片
    /**
     * @return
     * 压缩Bitmap
     */
    private Bitmap compressBitmap() {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.ic, options);
        options.inSampleSize = calculateInSmapleSize(options, 200, 200);
        options.inJustDecodeBounds = false;
        return  BitmapFactory.decodeResource(getResources(), R.drawable,.ic, options);
    }

    /**
     * @param options
     * @param reqWidth
     * @param reqHeight 计算inSmapleSize(采样率)
     */
    private int calculateInSmapleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        final int width = options.outWidth;
        final int height = options.outHeight;

        int inSampleSize = 1;

        if (reqWidth < width || reqHeight < height) {
            int halfWidth = width / 2;
            int halfHeigth = height / 2;

            while ((halfHeigth / inSampleSize > reqWidth) && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,...
    Android进阶与总结阅读 4,411评论 0 2
  • 由于bitmap的特殊性以及Android对应用所施加的内存限制,导致加载bitmap的时候很容易出现内存溢出。下...
    Liuuuuuuzi阅读 455评论 0 1
  • 一直以来Bitmap都是开发中很棘手的问题,这个问题就是传说中的OOM(java.lang.OutofMemory...
    M悇芐冋忆阅读 4,904评论 0 11
  • 关于图片的加载,现在已经有很多主流的框架,如Glide,Volley等帮我们快速实现。其实这其中都包含了图片高效加...
    Ruheng阅读 3,681评论 11 32
  • 其实 我们的关系早就变了 只是我们都固执的相信只要我们不走一切都不会变 有人跟我说 羡慕我们的友谊 但是冷暖自知 ...
    CXLX萧晓阅读 357评论 0 0