##为什么要进行图片优化
-
因为Android应用,尤其是资讯类的应用常运用了大量的图片;
如果可以很好地对图片资源进行优化,可以减少APP的内存消耗;增加APP的流畅度;减少APP的网络流量;减小APK包的大小(图片往往是使APK包增大的主要原因);
是APP有良好的用户体验; -
利用图片加载框架进行图片优化 如: Google推出的Glide; Facebook推出的Fresco;
###关于webp
#####在服务端把下发图片的jpg/png格式改成webp格式,
能够大幅度减少图片内存,实现一定的优化; #####相关文章推荐:png 转 webp 的正确姿势
##笔记目标概述
- 学会图片优化的几种方法
- 解决Android面试中图片优化的相关问题
- 学会写一个Android照片墙
##内容概述
- Android图片存储优化 从
尺寸压缩、质量压缩和内存重用三个方面来讲解图片的存储优化;- 从图片加载方面的优化
内存占用与drawable文件夹(图片资源放置位置)关系 找出图片存放最优目录选择;- 常见的图片优化方法(照片墙制作,帮助理解Android如何处理多图片场景)
- Android内置的超大图片加载方案(BitmapRegionDecoder)
- 使用框架优化图片加载
##图片存储优化
###什么是OOM?(广义)
- Android系统的进程(APP级别)有最大内存限制
超过这个限制,系统就会抛出OOM错误;(这个手机剩余内存是多少没有什么关系)
>###图片OOM问题的产生 >- 一个页面一次加载过多图片 如果多个小图片或者几个大图片一起加载,有可能超过APP的最大内存限制; >- 加载大图片时没有进行压缩(直接```ImageView.setImageResource()```进行加载), 没有控制尺寸和质量等, 需要对图片进行压缩后才能去加载; >- Android列表加载大量bitmap没有使用缓存 **列表通常有大量的ImageView, 对这些ImageView去加载bitmap的时候要使用缓存, 或者使用优秀的第三方框架像Glide等(框架已经帮我们做了缓存)** ---
>###Android支持的图片格式 >- **PNG**:最常见的格式, 它是一种无损压缩的图片格式, 它支持完整的透明通道, **缺点**:占用空间一般比较大; **实际使用**:一般使用时要对它进行压缩; 一般请```UI```设计的同学把压缩后的图片给我们; >- **JPEG**:有损压缩图片格式, 它不支持图片透明通道, **使用**:使用时特别注意以上两点; >- **WEBP**:Google开发的一种旨在加快图片加载速度的图片格式; 支持有损、无损压缩; 支持完整的透明通道; 支持多帧动画; >是一种比较理想的图片格式; **实际使用**: 在既要保持图片质量又要限制图片大小的需求下, **WEBP**是首选; >- **在一些图片优化的task中,拿WEBP去代替PNG是一种很好的优化方法**; >- **GIF**:它支持多帧动画, Android本身图片库不支持这个格式, 可是第三方加载框架**Glide、Fresco**都支持;
###图片占用内存计算
- 如何计算一张图片占用的内存?
图片占用的内存 = 图片宽 X 图片高 X 一个像素占用的内存大小;从这个公式可以看出来,我们可以从尺寸压缩、质量压缩和内存重用三个方面来进行图片存储的优化;- 尺寸压缩:就是减小图片的宽高;
- 质量压缩:改变一个像素占用的内存; 通过优化解码率来实现;
- 内存重用:Android提供了inBitmap属性,它可以实现bitmap的内存重用;
###尺寸压缩
- Bitmap的Option中有一个属性
inJustDecodeBounds; 将其设置为true(inJustDecodeBounds=true), 就可以在不加载图片进内存的情况下,就获取图片的宽高和MINE类型;
##图片加载优化