博客: 安卓之家
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917

理论


Bitmap 的高效加载会利用 BitmapFactory.Options 来加载所需尺寸的图片,也就是可以按一定的采样率来加载所需图片(一般就是缩小后的图片)。采样率的设置就是 BitmapFactory.Options 的inSampleSize 参数。

  • inSampleSize 小于1时,无缩放效果,相当于 inSampleSize = 1;
  • inSampleSize 为1时,采样后图片为原始图片大小
  • inSampleSize 为2时,采样后图片的宽高均为原始图片的一半,那么像素值为原始图片的1/4, 占内存大小也是原图的1/4,也就是说缩放比例是 1/(inSampleSize 的2次方),比如inSampleSize 为 4, 缩放比例就是 1/16
  • 最新官方文档指出,inSampleSize 的取值应该是2的指数,比如1,2,4,8,16…如果inSampleSize不为2的指数,会向下取整选择一个最接近的2的指数来代替,比如3,系统会选择2来代替,但是验证发现该结论并非所有的安卓系统版本都成立,因此这只是一个开发建议咯。

步骤


  1. 把 BitmapFactory.Options 的inJustDecodeBounds 参数设置为 true,此时BitmapFactory 只会解析原始图片的宽高信息,不会真正加载图片
  2. 从 BitmapFactory.Options 中取出图片宽高信息,它们对应于outWidth 和 outHeight 参数
  3. 根据采样率的规则并结合目标View所需大小计算采样率 inSampleSize
  4. 把 BitmapFactory.Options 的inJustDecodeBounds 参数设置为 false, 重新加载图片

具体代码实现


计算分辨率

public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) {// Raw height and width of image final int height = options.outHeight;final int width = options.outWidth;int inSampleSize = 1;if (height > reqHeight || width > reqWidth) {final int halfHeight = height / 2;final int halfWidth = width / 2;// Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight&& (halfWidth / inSampleSize) > reqWidth) {inSampleSize *= 2;} } return inSampleSize;
} 

加载图片

public static Bitmap decodeBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {// First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(res, resId, options);// Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// Decode bitmap with inSampleSize set options.inJustDecodeBounds = false;return BitmapFactory.decodeResource(res, resId, options);
} 

我写到了这个 Gist

使用


mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

参考内容:
任书记的《Android 开发艺术探索》第 12 章
google开发指南

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐^_^

欢迎交流,转载请注明出处,谢谢!

安卓 Bitmap 高效加载相关推荐

  1. Android开发-自己动手写Bitmap高效加载 跟OOM说再见

    Bitmap 前言 BitmapFactory.Options BitmapFactory 高效加载Bitmap inDensity,inTargetDensity,inScaled inSample ...

  2. Bitmap高效加载

    1.Bitmap的基础概念 Bitmap是Android系统中的图像处理的最重要类之,Bitmap可以获取图片的信息,可以将信息进行缩放,裁剪等操作,提供了图片文件的操作支持. 2.Bitmap加载方 ...

  3. Connor学Android - Bitmap的加载和缓存策略

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

  4. 《Android开发艺术探索》第12章- Bitmap 的加载和 Cache 读书笔记

    目录 1. 前言 2. 正文 2.1 Bitmap 的高效加载 2.1.1 说一下对于Android 中的 Bitmap 的理解 2.1.2 内存中存储的 Bitmap 对象和本地图片有什么区别? 2 ...

  5. Bitmap如何高效加载图片

    如何高效加载Bitmap? 核心思想:利用BitmapFactory.Obtions来加载所需尺寸的图片. BitmapFactory.Obtions主要用到它的inSampleSize参数(采样率) ...

  6. Android进阶知识(二十五):Bitmap简介及其高效加载

    Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap   Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...

  7. Android高效加载大图、多图解决方案,有效避免程序OOM

    高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...

  8. Android高效加载大图、多图解决方案_LruCache,有效避免程序OOM

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying ...

  9. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象

    好久没有写博客了,今天就先写一个小的关于在Android中加载大图如何避免内存溢出的问题. 后面会写如何使用缓存技术的核心类,android.support.v4.util.LruCache来加载图片 ...

最新文章

  1. Windows Phone APP中禁用截图
  2. java 圆 继承_java 类的继承(转)
  3. 没有bug队——加贝——Python 练习实例 9,10
  4. java+读取source资源_如何从JavaJAR文件中读取资源文件?
  5. useEffect和useLayoutEffect区别
  6. 软件性能测试——负载测试的最佳实践
  7. Sql Server 指定列的乘积
  8. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
  9. Jupyter Notebook从入门到精通
  10. arcmap新手教程_ArcMap 入门
  11. 《软件创富----共享软件创业之道》读后感
  12. 如何简单地将工资单发给员工?
  13. mysql查询出现ambiguous的问题
  14. 鸿蒙系统学习笔记(一) 鸿蒙系统介绍
  15. SpringBoot使用EasyExcel 模板填充数据并导出,以及Excel导入解析入库
  16. 硬件-5-长虹电视55A1U
  17. 文本生成图像工作简述2--常用数据集分析与汇总
  18. 什么是系统架构师,系统架构师应具备哪些能力?
  19. html简单个人网页制作 出行网站设计——凤阳旅游(6页) HTML5期末考核大作业,网站——旅行网站
  20. Android输入法挤乱布局问题

热门文章

  1. 根据财务指标的量化交易策略
  2. 浪潮之巅读书笔记(三)
  3. iphone OS、Android、Blackberry OS与Palm OS的比较
  4. 英勇的战士——斯巴达
  5. 空间分析 | 莫兰指数的计算
  6. 组件绑定事件与源生事件
  7. 学习笔记(01):【孙伟老师UID课堂】设计师也能会的-WEB前端入门基础HTML+CSS视频教程-09综合表单标签讲解-1...
  8. 9款高质量学习软件,原来学霸都是这么炼成的!
  9. git-删除fork的项目
  10. 中国Linux与微软斗法北京谋变,从水火不容到共生(转)