Bitmap的高效加载

如何加载图片?

主要是通过BitmapFactory类提供方法加载图片:

decodeFile:从文件系统中加载
decodeResource:从资源中加载
decodeStream:从输入流中加载
decodeByteArray:从字节数组中加载
如何高效加载Bitmap?

采用BitmapFactory.Options来加载所需尺寸的图片,可以按一定的采样率来加载缩小的图片,将缩小的图片在ImageView中显示。

具体实现流程:

a. 将BitmapFactory.Options中的inJustDecodeBounds参数设置为true并加载图片

b. 从BitmapFactory.Options中获取到图片的原始宽高信息

c. 根据采样率规则并结合目标view的所需大小计算出采样率inSampleSize

d. 将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载

注意:这里设置BitmapFactory.Options为true时,只会获取到图片的宽高信息,这样的操作是轻量级的。

实现代码:

    /**
     * 根据内部资源来压缩图片
     * @param res 传入的资源
     * @param resId 传入对应的id
     * @param reqWidth 所需的宽度
     * @param reqHeight 所需的高度
     * @return
     */
    public Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight){
        final BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true,表示只获取图片的尺寸
        options.inJustDecodeBounds = true;
        //计算压缩比
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        //设置为false,表示获取图片的所有信息
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);

    }

    private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        if (reqHeight == 0 || reqWidth == 0)
            return 1;
        //获取到图片的原始宽高
        final int width = options.outWidth;
        final int height = options.outHeight;
        int inSampleSize = 1;
        //计算压缩比,一般设置为1,2,4等2的次方数
        if (height > reqHeight || width > reqWidth){
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth){
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }

调用方法:

imageView.setImageBitmap(decodeSampledBitmapResource(getResource(), R.id.image,100,100));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,...
    Android进阶与总结阅读 9,857评论 0 2
  • 关于图片的加载,现在已经有很多主流的框架,如Glide,Volley等帮我们快速实现。其实这其中都包含了图片高效加...
    Ruheng阅读 9,036评论 11 32
  • 由于bitmap的特殊性以及Android对应用所施加的内存限制,导致加载bitmap的时候很容易出现内存溢出。下...
    Liuuuuuuzi阅读 3,188评论 0 1
  • 为了避免在ImageView中加载的图片过大而导致程序出现OOM的现象,利用BitmapFactory.Optio...
    码农仔阅读 5,656评论 0 13
  • 故乡是一个很难去提笔书写的命题,总是带给人一种忽明忽暗忽远忽近的迷离感。到现在为止,我对故乡的情感总是有一些淡淡的...
    冬肆阅读 1,792评论 0 0

友情链接更多精彩内容