《Android开发艺术探索》笔记之Bitmap的加载和Cache<一>

我放暑假前,就在图书馆借了一本《Android开发艺术探索》,这也是我看到很多人推荐的。之前我看的Android入门的书是郭婶的《第一行代码》,确实适合入门。进阶的书就选择了《Android开发艺术探索》,其实还有一本进阶的书也有很多人推荐,叫《Android群英传》。我之所以首先选择《Android开发艺术探索》,是因为这本书的作者是任玉刚,硕士毕业于中科大,而我在合肥上学。好吧,废话说的有点多。下面进入正题。

《Android开发艺术探索》总共有十五章,今天记的笔记是第12章Bitmap的加载和Cache,之所以先记这章是因为我刚好在学习图片处理和缓存,在写这篇博客之前,我也在网上看了其他人的讲解,各有侧重点。下面是我自己的理解。

Bitmap的高效加载

通过BitmapFactory.Options的inSampleSize参数(即采样率)来缩放图片。当inSampleSize大于1时,比如为2,那么采样后的图片的宽/高均为原图大小的1/2,像素数为原图的1/4.

官方给出代码是:

/**
* 获取压缩后的图片
* @param res
* @param resId
* @param reqWidth            所需图片压缩尺寸最小宽度
* @param reqHeight           所需图片压缩尺寸最小高度
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 首先不加载图片,仅获取图片尺寸
final BitmapFactory.Options options = new BitmapFactory.Options();
// 当inJustDecodeBounds设为true时,不会加载图片仅获取图片尺寸信息
options.inJustDecodeBounds = true;
// 此时仅会将图片信息会保存至options对象内,decode方法不会返回bitmap对象
BitmapFactory.decodeResource(res, resId, options);
// 计算压缩比例,如inSampleSize=4时,图片会压缩成原图的1/4
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 当inJustDecodeBounds设为false时,BitmapFactory.decode...就会返回图片对象了
options. inJustDecodeBounds = false;
// 利用计算的比例值获取压缩后的图片对象
return BitmapFactory.decodeResource(res, resId, options);
}
/**
* 计算压缩比例值
* @param options       解析图片的配置信息
* @param reqWidth            所需图片压缩尺寸最小宽度
* @param reqHeight           所需图片压缩尺寸最小高度
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 保存图片原宽高值
final int height = options. outHeight;
final int width = options. outWidth;
// 初始化压缩比例为1
int inSampleSize = 1;
// 当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统
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;
}  

inJustDecodeBounds参数:为true时,BitmapFactory只会解析图片的原始宽/高信息,并不会去真正的加载图片,这个操作是轻量级的;为false时,则会完全加载图片。

总结一下四种色彩样式:
ALPHA_8每个像素只要1字节,只能代表透明度,没有颜色属性
ARGB_4444每个像素要2字节,带透明的颜色
ARGB_8888 每个像素要4字节,带透明的颜色,默认色样
RGB_565每个像素要2字节,不带透明的颜色
例如:假定一张1024*1024像素的图片采用ARGB_8888格式存储,那么它占有的内存大小为1024*1024*4,即4MB,如果inSampleSize为2,那么采样后的图片其内存为512*512*4,即1MB。
今天就写这么多,想吐槽的是段落首行缩进竟然没用

《android开发艺术探索》笔记之Bitmap的加载和Cache相关推荐

  1. Android开发艺术探索笔记

    <Android开发艺术探索>这本书在几年前就已经买了,陆陆续续看过几次,都没有看完,没有理解透. 最近重读<Android开发艺术探索>,读了两次,第一次读完感觉还有大量的知 ...

  2. Android开发艺术探索笔记(一) Activity的生命周期和启动模式(1)

    Activity作为Android开发中最常用的一个组件,是Android开发人员必须熟悉且掌握的重要内容.同时Activity也是在面试中经常被问到的一个方向.因此,掌握Activity的重要性也不 ...

  3. Android 开发艺术探索笔记(17),android开发艺术探索

    垃圾回收的相关工作,比如清楚数据 调用onDeatchFromWindow方法,在这个方法里结束进程.终止动画等 通过Session的remove方法删除Winodow,最终会调用WindowMana ...

  4. ViewRoot,DecorView,MeasureSpec和View的工作原理——Android开发艺术探索笔记

    原文链接 http://sparkyuan.me/ 转载请注明出处 View的绘制流程是从ViewRoot的performTraversals方法開始的.它经过measure.layout和draw三 ...

  5. Android 开发艺术探索笔记(21),阿里P7级别面试经验总结

    Looper的工作原理 就是Looper一直查看MessageQueue中是否有新消息,没有就一直阻塞,否则取出新消息. 在它的构造方法中它会先创建一个MessageQueue,然后将当前线程的对象保 ...

  6. 《Android开发艺术探索》完结篇

    笔记链接: <Android开发艺术探索>之Activity的生命周期和启动模式(一) <Android开发艺术探索>之IPC机制上(二) <Android开发艺术探索& ...

  7. 《Android开发艺术探索》

    序 昨晚准备参考一下 <Android 开发艺术探索>这本书写一个博客 ,但是在家里找了好长时间也找不见 .所以就找了网上的文章 .这本书强烈推荐大家好好读几遍 . <Android ...

  8. Android开发艺术探索完结篇——天道酬勤

    这片文章发布,代表着我已经把本书和看完并且笔记也发布完成了,回忆了一下我看Android群英传,只用了两个月,但是看本书却花了2016年05月04日 - 2018年07月16日,整整两年多,真是惭愧 ...

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

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

最新文章

  1. python调用gitlab api自动合并分支_Python3 如何使用 GitLab API 进行批量的合并分支
  2. ftp服务器新建虚拟目录,ftp服务器 虚拟目录
  3. [Redis6]常用数据结构_Hash哈希
  4. idea 如何隐藏/展示不想看到的文件
  5. 2017.10.11 network 网络扩容 思考记录
  6. 查看服务器的性能和使用状态(top,free,df)
  7. 合成器插件Serum 1.23b7绿化版亲测有效
  8. W3CSchool CHM API 帮助文档(全)
  9. Chrome恐龙小游戏“开挂“跑分
  10. 灵飞经5龙生九子 第二十一章 危机四伏 3
  11. 大四学生的前端实习记录
  12. Spring Boot 2.1.2配置文件参考配置项官方谷歌翻译版本
  13. 派森学python_2019 年 1月 26 日 随笔档案 - 派森学python - 博客园
  14. 你长痘吗?留下痘印吗?民间秘方
  15. 走在路上能被识别人脸,该为高科技而喜还是为隐私而忧?
  16. CentOS7设置共享文件夹
  17. python 月球上物体的体重,1.重量计算。月球上物体体重是在地球上的16.5%,假如你在地球上每年增长0.5KG,输出未来十年你在地球和月球上的体重状况...
  18. winrar分卷压缩和解压
  19. 基于阿里云 Serverless 函数计算开发的疫情数据统计推送机器人
  20. 复习笔记5-nginx、rabbitmq、redis、jenkins、Docker、ELK、日志、Hadoop

热门文章

  1. H5唤起手机电话功能
  2. linux 带ifdef运行程序_Linux内核分析——可执行程序的装载
  3. 学习大数据方向_李孟_新浪博客
  4. 电子秤c语言编程,基于AT89C51的数字电子秤的设计最终版(样例3)
  5. 格灵深瞳:人脸识别工业级大规模人脸识别实践探讨 | 百万人学AI
  6. [呼吁]用奶粉代替母乳是误区
  7. 掌纹识别python 预处理-提取ROI
  8. plantuml 依赖_Plantuml的基本使用
  9. Vue项目使用Cookie,以Json格式存入与读取Cookie,设置过期时间以及删除操作
  10. 蓝牙模块:使用问题集锦