Android 图片处理的那些事
一、基础知识
图片加载在Android中一直是一个头疼的问题,用的不好经常会出现OOM,特别是5.0以下的设备(5.0开始Java Heap中单独开辟了一块区域用来存放大型对象其中包含bitmap对象,所以会好点)
庆幸我们在开源的年代,如今大多的图片加载问题都可以通过开源图片加载库得到处理。图片加载不推荐重复造轮子,还是用人家第三方的好。
1、图片开源框架的选择
-
Glide:Google官方推荐的方式
- 优点 轻量级、体积小;速度非常快;易学习
- 缺点:图片质量有所下降
-
Glide github官网:https://github.com/bumptech/glide
全方位使用讲解的使用: http://mrfu.me/2016/02/27/GlideGettingStarted/
-
Fresco:FaceBook的良心巨作(有官方中文文档 QAQ..)
- 优点:高性能;内存处理方法无人能及
- 缺点:体积大(上次集成APK增加2M);学习成本高;依赖so文件
-
Fresco官网:https://github.com/facebook/fresco
-
Universal-Imager-Loader:几年前最火图片加载框架,可惜停止维护了
- Picasso: 图像质量比Glide好、不支持gif
总结:如果对图片质量要求不是太高的话,个人推荐Glide (很难看出图片质量差,除非是大图并认真细看),其次推荐Fresco
2、图片资源的的来源分为三大类:
- 网络资源图片
- 手机图片
- APK资源图片APK资源图片
关于对于前2中图片资源来说正式那些图片加载框架所擅长的,交给它们去处理就行了。最好别自己去处理那些图片,要不即使自己被图片问题折腾死别人也会骂你蠢。
3、 关于APK资源图片有3个特征:
- 资源图片基本都是在xml中引用 ,在Java中也是通过资源ID查找 。
- 资源图片一般不使用异步记载,不会出现loading图这些中间状态。
- 资源图片不会加载失败,如果失败了那么APP也挂掉了。
好了,以上是Android图片加载的那些事。。。。
二、APK图片资源的处理
喂、喂、喂,老司机你先别走,APK资源图片怎么处理你还没说呢。
肯定是没说完的。
APK图片资源的问题主要分为三大类:
- APK的体积
- 程序OOM
- 图片的屏幕适配
我们从以下几个角度去解决以上三个问题:
-
删除无用的图片资源(废话,但是很多真没这么去做,由于项目的迭代我自己也经常忘记)
Android Studio的菜单中选择Analyze->Inspecting Code、分析完成后你们发现项目中所有未被引用的资源
-
图片压缩
网上图片压缩的工具五花八门、自行百度,这里就不多说了
-
将传统的png、jpeg格式图片转换成webp格式
JPEG、PNG 和 GIF 这些图片格式的优化几乎已经达到了极致,若想改变现状开辟新局面,便要有釜底抽薪的胆量和气魄,而 Google 给了我们一个新选择:WebP。它从流量、体积方面取得巨大优势。
WebP:Google在2010推出的一种图片格式,此图片格式可以比jpeg有更小的体积,同时支持无损压缩和透明。Android4.0开始支持WebP格式图片、4.2 以上设备稳定支持
jpeg/png到webp的互转官方已经提供了转化工具 这个官方提供了相互转化的工具,以及具体的使用方式,可以参考https://developers.google.com/speed/webp/docs/cwebp
附:鸿洋大神关于webp的文章Android Webp 完全解析 快来缩小apk的大小吧
-
用shape去替换一些背景图片
Shape可以定义各种各样的形状。这种通过XML的方式绘制替换图片的方式可以减少APK大小、提高性能而且放大拉伸也不会失真。
-
大背景图乱发导致OOM
尽量适配多分辨率的图片、如果只能提供一张图片推荐放在drawable-xhdpi文件夹下。如果设备的DPI只有一种那放在对应的文件夹下即可。 岑今做过测试在高DPI的设备下加载drawable-mdpi下1M的图片、程序内存开销多了10M,对、你没看错是10M。
三、欣喜而又失望的SVG
SVG的详细这里就不科普了。简单的说,SVG矢量图像用点和线来描述物体,所以文件会比较小,同时也能提供高清晰的画面.SVG诸多的优势是位图所无法比拟的。
然而SVG一个问题就是SVG的本地运行环境下的厂家支持程度。 Android5.0开始支持SVG、一直以为它向下兼容,直到写这篇文章时做测试才知道,目前Android5.0以下并不支持SVG。网上有人通过java层和so层分别对Android5.0以下SVG兼容做的也不是很好
总结:
- 1、对于图片质量要求不是太高的app推荐用Glide去加载网络和手机图片
- 2、对于比较大的背景图可以在线转换成webp格式(Android4.0开始支持WebP格式图片、4.2 以上设备稳定支持)
- 3、对于一些小图标、icon 5.0以后设备采用svg,5.0以前系统还是用png格式的吧
一些icon网站推荐
- 1.生成shape
- 2.生成logo
- 3.Material Design配色工具
- 4.图标素材
- 5.easyicon