Android性能优化---图片优化

274 阅读4分钟

##为什么要进行图片优化

  • 因为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; 将其设置为trueinJustDecodeBounds=true), 就可以在不加载图片进内存的情况下,就获取图片的宽高和MINE类型;


##图片加载优化