Android图片性能优化详解

所属分类: 软件编程 / Android 阅读数: 41
收藏 0 赞 0 分享

1. 图片的格式

目前移动端Android平台原生支持的图片格式主要有:JPEG、PNG、GIF、BMP、和WebP(自从Android 4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有三种:JPEG、PNG、WebP,图片格式可以通过查看Bitmap类的CompressFormat枚举值来确定。

public static enum CompressFormat {
  JPEG、
  PNG、
  WebP;

  private CompressFormat() {

  }
}

如果要在应用层使用GIF格式图片,那么需要自己引用第三方函数库进行支持。

1.1 JPEG

JPEG是一种广泛使用的有损压缩图像标准格式,它不支持透明和多帧动画,一般摄像类作品最终都是以JPEG格式展示。通过控制压缩比,可以调整图片的大小。

1.2 PNG

PNG是一种无损压缩图片格式,它支持完整的透明通道,从图像处理领域将,JPEG只有RGB三个通道,而PNG有ARGB四个通道。由于是无损压缩,因此PNG图片占用空间一般比较大,会无形中增加最终APP的大小,在做APP瘦身时一般都要对PNG图片进行处理以减小其占用的体积。

1.3 GIF

GIF是一种古老的图片格式,它诞生于1987年,它的特点是支持多帧动画。

1.4 WebP

WebP由Google在2010年发布,它支持有损和无损压缩、支持完整的透明通道、也支持多帧动画,是一种比较理想的图片格式。在既保证图片质量又要限制图片大小的需求下,WebP应该是首选。

2. 图片的压缩

目前大多数APP都是PNG格式图片资源,我们可以通过几个工具对PNG图片进行压缩来达到瘦身的目的。

2.1 无损压缩ImageOptim

ImageOptim是一个无损的压缩工具,它通过优化PNG压缩参数,移除冗余元数据以及非必需的颜色配置文件等方式,在不牺牲图片质量的前提下,既减少了PNG图片占用的空间,又提高了加载的速度。

2.2 有损压缩ImageAlpha

ImageAlpha是ImageOptim作者开发的一个有损的PNG压缩工具,相比较而言,图片大小得到极大的降低,当然图片质量同事也会受到一定程度的影响,经过该工具压缩的图片,需要经过设计师的确认才能最终上线,否则可能回影响整个APP的视觉效果。

2.3 有损压缩TinyPNG

TinyPNG也是比较知名的有损PNG压缩工具,它以Web站点的形式提供,没有独立的APP安装包,同所有的有损压缩工具一样,经过压缩的图片,需要经过设计师的确认才能最终上线,否则可能回影响整个APP的视觉效果。

还有很多无损压缩工具,例如JPEGMini、MozJPEG等,大家自行选择适合自己项目的一个就行,主要是在图片大小和图片质量之间找到一个折中点。

2.4 PNG/JPEG 转换为WebP

如果你的APP最低支持到Android4.0,那么可以直接使用系统提供的能力来支持WebP,如果是4.0以下的系统,也可以通过在APP中集成第三方函数库例如webp-android-backport来实现对WebP的支持。根据Google测试,无损压缩后的WebP比PNG文件少了45%的文件大小,即使这些PNG文件经过其他压缩工具例如ImageOptim压缩后,WebP依然可以减少约28%的文件大小。

WebP转换的工具可以选择智图和iSparta等

2.5 尽量使用NinePatch格式的PNG图

.9.png图片格式简称NinePatch图,本质上仍然是PNG格式图片,它是针对Android平台的一种特殊PNG格式图片,可以在图片指定位置拉伸或者填充内容。NinePatch图的优点是体积小,拉伸不变形,能够很好地适配Android各种机型。Android SDK自带了NinePatch图的编辑工具,位于sdk/tools/draw9patch,点击即可启动;当然,Android Studio也集成了PNG转NinePatch的功能,我们只需右键点击某个需要转换的PNG图片,在弹出的对话框中选择Create 9-Patch File…即可自动完成转换。

3. 图片的缓存

图片的缓存框架有很多,常见的有四种

  1. Android-Universal-Image-Loader
  2. Picasso
  3. Glide
  4. Fresco

这四种图片加载框架的优劣就不在一一说明,因为随便一搜就可以知道答案,我们可以根据项目来权衡使用哪一个图片加载框架。

更多精彩内容其他人还在看

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享

TextView显示系统时间(时钟功能带秒针变化

用System.currentTimeMillis()可以获取系统当前的时间,我们可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示的系统时间,可以做一个时钟的功能
收藏 0 赞 0 分享

Android用ListView显示SDCard文件列表的小例子

本文简单实现了用ListView显示SDCard文件列表,目录的回退等功能暂不讨论,获取文件列表,files即为所选择目录下的所有文件列表
收藏 0 赞 0 分享

Android拦截外拨电话程序示例

这篇文章主要介绍了Android拦截外拨电话的示例,大家参考使用吧
收藏 0 赞 0 分享

通过Html网页调用本地安卓(android)app程序代码

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式
收藏 0 赞 0 分享

android Textview文字监控(Textview使用方法)

以手机号充值为例,当用户输入最后一位数时候,进行汇率的变换,本文就实现类似这样的功能
收藏 0 赞 0 分享

Android ListView长按弹出菜单二种实现方式示例

这篇文章主要介绍了Android ListView长按弹出菜单的方法,大家参考实现
收藏 0 赞 0 分享
查看更多