Android 图片处理的那些事

Android 图片处理的那些事

一、基础知识

图片加载在Android中一直是一个头疼的问题,用的不好经常会出现OOM,特别是5.0以下的设备(5.0开始Java Heap中单独开辟了一块区域用来存放大型对象其中包含bitmap对象,所以会好点)

庆幸我们在开源的年代,如今大多的图片加载问题都可以通过开源图片加载库得到处理。图片加载不推荐重复造轮子,还是用人家第三方的好。

1、图片开源框架的选择

  1. Glide:Google官方推荐的方式

    • 优点 轻量级、体积小;速度非常快;易学习
    • 缺点:图片质量有所下降
  2. Glide github官网:https://github.com/bumptech/glide

    全方位使用讲解的使用: http://mrfu.me/2016/02/27/GlideGettingStarted/

  3. Fresco:FaceBook的良心巨作(有官方中文文档 QAQ..)

    • 优点:高性能;内存处理方法无人能及
    • 缺点:体积大(上次集成APK增加2M);学习成本高;依赖so文件
  4. Fresco官网:https://github.com/facebook/fresco

  5. Universal-Imager-Loader:几年前最火图片加载框架,可惜停止维护了

  6. Picasso: 图像质量比Glide好、不支持gif

总结:如果对图片质量要求不是太高的话,个人推荐Glide (很难看出图片质量差,除非是大图并认真细看),其次推荐Fresco

2、图片资源的的来源分为三大类:

  • 网络资源图片
  • 手机图片
  • APK资源图片APK资源图片

关于对于前2中图片资源来说正式那些图片加载框架所擅长的,交给它们去处理就行了。最好别自己去处理那些图片,要不即使自己被图片问题折腾死别人也会骂你蠢。

3、 关于APK资源图片有3个特征:

  1. 资源图片基本都是在xml中引用 ,在Java中也是通过资源ID查找 。
  2. 资源图片一般不使用异步记载,不会出现loading图这些中间状态。
  3. 资源图片不会加载失败,如果失败了那么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网站推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值