Bitmap高效加载

简介: 我们在编程中,如果要插入一张图片,大部分直接使用ImageView直接加载,但在实际编程当中,有时候图片的原始尺寸并不符合ImageView。使用BitmapFactory类中的四个方法:decodeFile,decodeResource,decodeStream,decodeByteArray(文件,资源,IO流,字节数组)中加载Bitmap对象,可以使用InSampleSize采样率来缩小图片,还可以缩小图片内存大小,一定程度避免OOM。


将inJustDecodeBounds设置为true,用于获取原始图片的高/宽

 options.inJustDecodeBounds = true;


采样率为1时,即代表不缩放,默认大小。比如一张图片大小为102410244,内存占4MB。当它的采样率为2时,它的内存占5125124,1MB。相比较原图,它的大小为之前的1/2,内存为之前的1/4。缩放比例为4。

int InSampleSize = 1;


获取原始图片的高/宽

 int Height = options.outHeight;
 int Width = options.outWidth;
 private Bitmap LoadBitmapFromResource(Resources resources,int Res,int HopeHeight,int HopeWidth){
        final BitmapFactory.Options options = new BitmapFactory.Options();
        //用于解析图片的宽/高,并不会加载图片
        options.inJustDecodeBounds = true;
        //从resources里面加载图片
        BitmapFactory.decodeResource( resources,Res,options );
        //计算采样率
        options.inSampleSize = CalculateInSampleSize( options,HopeHeight,HopeWidth );
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource( resources,Res,options );
    }
    public static int CalculateInSampleSize(BitmapFactory.Options options,int HopeHeight,int HopeWidth){
    //获取原始图片的宽/高
        int Height = options.outHeight;
        int Width = options.outWidth;
        //采样率为1,即图片大小为原始尺寸
        int InSampleSize = 1;
        //如果获取图片的原始高度大小你所期望的图片大小才有缩放的意义。
        //如果大于的话,第一次获取它们的一般,然后除了采样率如果还大于期望的宽/高
        //表示还可以继续缩小。采样率累乘2,InSampleSize的取值为1,2,4,8,16,32...其值为2的指数。
        if (Height > HopeHeight && Width > HopeWidth){
            int HalfHeight = Height / 2;
            int HalfWidth = Width / 2;
            while ((HalfHeight / InSampleSize ) >= HopeHeight && (HalfWidth / InSampleSize) >= HopeWidth){
                InSampleSize *= 2;
            }
        }
        return InSampleSize;
    }


在需要的地方直接调用即可

 UseBitmapFactory.setImageBitmap( LoadBitmapFromResource( getResources(), R.drawable.background,200,200) );
目录
打赏
0
0
0
0
2
分享
相关文章
|
2月前
|
Bitmap位图(Java实现)
本文介绍了使用Java实现一个简单的Bitmap,通过自定义byte数组存储数据,提供put和exist方法分别用于插入数据和查询数据是否存在。Bitmap利用位操作高效地管理大量布尔值,适用于空间优化的场景。代码中详细解释了位图的核心原理、方法实现及边界检查。后续计划探讨位图在海量数据去重中的应用及JDK BitSet源码分析。
193 7
详细解读Bitmap的优化
详细解读Bitmap的优化
50 0
内存优化 | Bitmap优化
在内存优化中,优化 Bitmap 占用的内存效果最为明显,在 Android 里面,大部分 OOM,都是 bitmap 占用资源过大导致的,那么问题来了 如何防止 bitmap 占用资源过大导致 OOM?Android 系统何时会发生 OOM?怎样搭建线上线下一体化内存监控体系?Drump 文件过大,我们线上如何查看?线下监控那些工具你会用吗?关于 Native 层的内存泄漏该如何解决?图片监控你做过哪些努力?内存抖动为什么会引起 OOM?内存监控里面采集方式有哪些? 看完本文,希望可以以本文为索引,然后依次排雷解决上述问题,这样你也是这个领域的专家了
508 0
内存优化 | Bitmap优化
浅谈性能优化之图片压缩、加载和格式选择
目前市场上优化图片资源的方式有很多,如压缩图片、选择正确格式、 CDN 加速、懒加载等。
294 0
浅谈性能优化之图片压缩、加载和格式选择
Android内存优化-Bitmap内存优化
在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。
197 0
Android内存优化-Bitmap内存优化
【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
334 0
【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )(一)
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )(一)
333 0
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )(一)
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
436 0
【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
447 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等