Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-06-05:Android 中的图片优化方案?

Moosphan opened this issue · comments

2019-06-05:Android 中的图片优化方案?

首先我们可以对图片进行二次采样,从本质上减少图片的内存占用。就是将大图片缩小之后放入到内存中,以实现减小内存的目的
2.其次就是采用三层缓存架构,提高图片的访问速度。三层缓存架构是内存-文件-网络。

内存是访问速度最快的部分但是分配的空间有限,所以不可能占用太多。其中内存缓存可以采用LRU算法(最近最少使用算法),来确定要删除内存中的那些图片,保存那 些图片。

文件就是将图片保存到本地,可以使SD卡中,也可以是手机内部存储中。

网络就是访问网络下载图片,进行图片的加载。
3.常见的png,JPG,webp等格式的图片在设置到UI上之前需要经过解码过程,而图片采用不同的码率,也会造成对内存的占用不同。
4.最后一点,也是图片优化最重要的一点。重用Bitmap.
5.不使用bitmap要记得实时回收,减小内存的开销

as自带压缩高清图片;
1.对于本地图片可以将.png和.jpeg格式转化为.webp格式。可以对apk进行瘦身。
2.对于网络图片,可以采用图片进行二次采样,从本质减少图片的内存占有。就是将大图片缩小之后放入到内存中,
3可以使用采用使用.svg格式;可以减少内存占用。
4.可以采用上面楼主说的,三层缓存架构,提高图片的访问速度内存+文件+网络方式。

不懂帮顶 目前除了涉及了一点三级缓存 其他的并没有优化
路漫漫其修远兮

打卡,不太懂,一般使用的是 第三方库

图片压缩:

  1. 对于 minAPI>19,可以将资源文件下的 png 转化为 webp(有些 png 转化为 webp 体积会变大)
  2. 利用 TinyPng 插件批量压缩资源文件下的 png 图片

图片去重:
利用 HAHA 库分析内存中的 Bitmap,找到不同模块中引入的相同的图片,这个还待实践。

commented
    1,针对长图和超大图:采用局部加载 + option的配合
    2,针对大图:设定option,增大采样率 + 减少单个像素占用的内存
    3,针对大量的图:设置cache,内存读取 -> 磁盘读取 -> 网络读取的缓存顺序
    4,其它:采用webp的文件格式,占用磁盘大小更小

1.在不同的环境下采用不同的魔图规则(不同尺寸的缩略图)
2.可以考虑将图片有损转换为webp
3.可以把图片转为rgb565
4.加在大图可以考虑局部加载 防止oom
5.在application中监听内存告警的时候及时释放内存
6.及时做好图片缓存,避免每次都去网络图片取
7.做好lru缓存策略,避免一直缓存的用不到的图片
8.可把一些切图用 xml图形表示 或者.9png
9.使用tinypng对图片进行压缩
10.在gradle中配置 去除无用资源

1.使用合适的图片,tinyPng进行压缩,.9图,minApi > 19的时候png转化为webp
2.图片位置的合理分配。mdpi hdpi
3.一般来说使用Glide等第三方图片加载器,了解其三级缓存,图片生命周期
4.对于只有颜色不同的图片,可以只添加一张图片使用附着色改变图片颜色,如白色箭头和灰色箭头
5.兜底策略,在合适的地方启动定时内存检测,报警时清理图片内存,页面退出及时清理不需要的图片

图片优化方案
1,大小 可根据指定大小对图片宽高进行比例压缩
2,质量 可根据质量对图片进行压缩
3,缓存 使用第三方缓存
图片压缩使用第三方tiny 图片缓存使用glide

1.去除业务已经不再使用的图片
2.图片压缩 业务敏感的做无损压缩 不敏感的可以做有损压缩
3.升级 min Sdk 转换 web
4.对大图片做在线下发

简单图像用svg