如今,市面上有各种各样的图片加载库,选择一个适合自己使用的图片加载库已经成为了每一个 Android 开发者的必经之路,现在市面上知名的图片加载库有 Universal ImageLoader、Volley ImageLoader、Picasso、Glide 以及最近的 Fresco。他们各有千秋,不能评定谁比谁好,只能说哪一个更适合你。
比较Picasso、Glide 和 Fresco 三种图片加载库
比较 Picasso 与 Glide
总体来说二者极为相似,有着近乎相同的 API 的使用风格,但 Glide 在缓存策略和加载 gif 方面略胜一筹。
基础
Glide 和 Picasso 非常相似,Glide 加载图片的方式和 Picasso 如出一辙。
虽然两者看起来一样,但 Glide 更易用,因为 Glide 的 with 方法不光接受 Context,还接受 Activity 和 Fragment,Context 会自动的从他们获取,同时将 Activity/Fragment 作为 with()参数的好处是:图片加载会和 Activity/Fragment 的生命周期保持一致,比如 Paused 状态在暂停加载,在 Resumed 的时候又自动重新加载。
图像和内存
同样将 1920×1080 像素的图片加载到 768×432 的 ImageView 中,Glide 加载的图片质量要差于Picasso,这是因为 Glide 默认的 Bitmap 格式是 RGB-565 ,比 ARGB-8888 格式的内存开销要小一半。想要提高 Glide 的图片效果,可以创建一个新的 GlideModule 将 Bitmap 格式转换到 ARGB-8888。同时在 AndroidManifest.xml 中将 GlideModule 定义为 meta-data。
修改了 Bitmap 格式后,Glide 将花费两倍于上次的内存,但是仍远远小于 Picasso 的内存开销,原因在于 Picasso 是加载了全尺寸的图片到内存,然后让 GPU 来实时重绘大小。而 Glide 加载的大小和 ImageView 的大小是一致的,当然,Picasso 也是可以指定加载图片大小的,但是问题在于你需要主动计算 ImageView 的大小,或者说你的 ImageView 大小是具体的值(而不是 wrap_content )
在加载图片这个问题上 Glide 完胜 Picasso,因为 Glide 可以自动计算出任意情况下的 ImageView 大小。
Image质量的细节
将 ImageView 还原到真实大小时,Glide 加载的图片没有 Picasso 那么平滑。
磁盘缓存
Picasso 和 Glide 在磁盘缓存策略上有很大的不同。Picasso 缓存的是全尺寸的,而 Glide 缓存的是跟 ImageView 尺寸相同的。我们可以将 ImageView 调整成不同大小,但不管大小如何 Picasso 只缓存一个全尺寸的。Glide 则不同,它会为每种大小的 ImageView 缓存 一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。具体说来就是:假如在第一个页面有一个 200×200 的 ImageView,在第二个页面有一个 100×100 的 ImageView,这两个 ImageView 本来是要显示同一张图片,却需要下载两次。不过,你可以通过代码改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸,
这样就使得下次在任何 ImageView 中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。
Glide 的这种方式优点是加载显示非常快。而 Picasso 的方式则因为需要在显示之前重新调整大小而导致一些延迟。不过 Glide 比 Picasso 需要更大的空间来缓存。
特性
Glide 可以做到和 Picasso 几乎一样多的事,代码也几乎一样。但 Glide 可以加载 GIF 动态图,而 Picasso 不能,但是 Glide 动画会消费太多的内存,因此谨慎使用。除了 gif 动画之外,Glide 还可以将任何的本地视频解码成一张静态图片。还有一个特性是你可以配置图片显示的动画,而 Picasso 只有一种动画:fading in,最后一个是可以使用 thumbnail()产生一个你所加载图片的 thumbnail。其实还有一些特性,不过不是非常重要,比如将图像转换成字节数组等。
总结
Glide 和 Picasso 都是非常完美的库。Glide 加载图像以及磁盘缓存的方式都要优于 Picasso,速度更快,并且 Glide 更有利于减少 OutOfMemoryError 的发生,GIF 动画是 Glide 的杀手锏。不过Picasso 的图片质量更高。如果使用 Glide,建议将 Bitmap 格式换成 ARGB_8888、让 Glide 缓存同时缓存全尺寸和改变尺寸两种。
Fresco
内存管理
Fresco 的最大亮点在于它的内存管理。解压后的图片,即 Android 中的 Bitmap ,占用大量的内存,在 Android 5.0以下系统中,这会显著地引发界面卡顿。而使用 Fresco 将很好地解决这个问题,Fresco 会将图片放到一个特别的内存区域,当图片不再显示的时候,占用的内存会自动被释放,这会使得 APP 更流畅,减少因图片内存占用而引发的 OOM。当 APP 包含的图片较多时,这个效果尤其明显。
图像
Fresco 支持图像的渐进式呈现,渐进式的图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,逐渐呈现清晰的图片,这在低网速情况下浏览图片十分有帮助,可以带来更好地用户体验。另外,Fresco 支持加载 gif 图,支持 WebP 格式。
最后总结
Picasso 所能实现的功能 Glide 都能做到,只是所需设置不同。两者的区别是 Picasso 比 Glide 体积小很多且图像质量比 Glide 高,但Glide 的速度比 Picasso 更快,Glide 的长处是处理大型的图片流,如 gif、video,如果要制作视频类应用,Glide 当为首选。
Fresco 可以说是综合了之前图片加载库的优点,其在5.0以下的内存优化非常好,但它的不足是体积太大,按体积进行比较:Fresco>Glide>Picasso,所以 Fresco 在图片较多的应用中更能凸显其价值,如果应用没有太多图片需求,不推荐使用 Fresco。