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) );
相关文章
|
5月前
|
开发框架 .NET C#
详细解读Bitmap的优化
详细解读Bitmap的优化
35 0
|
存储 缓存 监控
内存优化 | Bitmap优化
在内存优化中,优化 Bitmap 占用的内存效果最为明显,在 Android 里面,大部分 OOM,都是 bitmap 占用资源过大导致的,那么问题来了 如何防止 bitmap 占用资源过大导致 OOM?Android 系统何时会发生 OOM?怎样搭建线上线下一体化内存监控体系?Drump 文件过大,我们线上如何查看?线下监控那些工具你会用吗?关于 Native 层的内存泄漏该如何解决?图片监控你做过哪些努力?内存抖动为什么会引起 OOM?内存监控里面采集方式有哪些? 看完本文,希望可以以本文为索引,然后依次排雷解决上述问题,这样你也是这个领域的专家了
486 0
内存优化 | Bitmap优化
|
编解码 Android开发
性能优化:Android中Bitmap内存大小优化的几种常见方式
性能优化:Android中Bitmap内存大小优化的几种常见方式
|
存储 缓存 前端开发
浅谈性能优化之图片压缩、加载和格式选择
目前市场上优化图片资源的方式有很多,如压缩图片、选择正确格式、 CDN 加速、懒加载等。
264 0
浅谈性能优化之图片压缩、加载和格式选择
|
存储 缓存 Java
图片系列(6)高低版本 Bitmap 内存分配与回收原理对比
图片系列(6)高低版本 Bitmap 内存分配与回收原理对比
288 0
图片系列(6)高低版本 Bitmap 内存分配与回收原理对比
|
API Android开发
【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
311 0
【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
|
存储 缓存 Android开发
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )(一)
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )(一)
309 0
【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )(一)
|
缓存 监控 安全
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
385 0
|
缓存 算法 API
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
255 0
|
存储 编解码 Android开发
【Android 内存优化】Bitmap 内存占用计算 ( Bitmap 图片内存占用分析 | Bitmap 内存占用计算 | Bitmap 不同像素密度间的转换 )
【Android 内存优化】Bitmap 内存占用计算 ( Bitmap 图片内存占用分析 | Bitmap 内存占用计算 | Bitmap 不同像素密度间的转换 )
230 0