Picasso、Imageloader、Fresco、Glide和Coil之间的比较

367

发现:

  1. Picasso v/s ImageLoader的区别在于...
  2. 关于GLIDE库的信息...
  3. Facebook有自己的库Fresco...
  4. 列表中最新的添加是Coil

问题:

  1. Picasso、Imageloader、Fresco和Coil之间的区别是什么?
  2. 哪个库是最好使用的?
  3. 如果每个库都有自己的意义,那它们是什么?
6个回答

195

我是Fresco项目的一名工程师,所以很明显我有偏见。

但你不必听我的。我们发布了一个示例应用程序,可以让您并排比较五个库的性能-Fresco、Picasso、UIL、Glide和Volley Image Loader。您可以在我们的 GitHub 存储库中获取它。

我还应指出,Fresco可在Maven Central上使用,名称为com.facebook.fresco:fresco

Fresco提供了Picasso、UIL和Glide尚未具备的功能:

  1. 图像不存储在Java堆中,而是存储在ashmem堆中。 中间缓冲区也存储在本地堆中。这使得更多内存可供应用程序使用。减少了OutOfMemoryErrors的风险。 这也减少了应用程序必须执行的垃圾回收量,从而提高性能。
  2. 渐进式JPEG图像可以像在Web浏览器中一样进行流式传输。
  3. 图像可以围绕任何点裁剪,而不仅仅是中心。
  4. JPEG图像可以在本地调整大小。 这避免了在尝试缩小图像时OOM的问题。

还有许多其他功能(请参阅我们的文档),但这些是最重要的。


2
谢谢,你可以把“我们已经发布了一个示例应用程序,它允许您比较五个库的性能”结果以表格形式附加到你的答案中吗? - mmlooloo
1
Fresco拥有比其他库更多的功能,但也更加庞大。 - ligi
4
他们在链接末尾添加了一个“s”。 https://github.com/facebook/fresco/tree/master/samples - JR Tan
@GmloMalo 是的,它确实可以。 - tyronen
1
@wedi 是的,没错。 - tyronen
显示剩余7条评论

139

请注意,这是一个高度基于个人观点的问题,因此我停止制造峡湾并制作了一个快速表格

enter image description here

现在,库的比较很困难,因为在许多参数上,这四个库几乎都可以做同样的事情,除了Fresco可能有一整套新的内存级别优化。因此,请告诉我您想看到基于我的经验进行比较的特定参数。

由于我使用Fresco最少,所以答案可能会随着我继续使用和理解它的当前漏洞而发展。 个人使用 是指至少在完成的应用程序中使用过该库一次。

* 注意-Fresco现在支持GIF以及WebP动画


1
我对Fresco的“可定制性”、“网络图片使用”和“易用性”评级较低感到好奇。这些评级的依据是什么? - tyronen
1
主要是第一次使用,会更多地使用Fresco来理解,这个答案可能会不断演变 :) - Vrashabh Irde
1
@Slartibartfast,你有机会尝试Fresco和最新的Glide 3.0版本了吗?你还会给它们相同的评价吗? - Shobhit Puri
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Codeversed
3
他个人使用过的那些。 - Pierre
显示剩余3条评论

124

Fresco 源码 | 官网

(-)

  • 库体积太大
  • 不能在回调中使用View、Bitmap参数
  • SimpleDraweeView不支持wrap_content属性
  • 缓存占用空间较大

(+)

  • 对小型和中型图片进行快速加载
  • 提供了许多功能(流式传输、绘图工具、内存管理等)
  • 可以直接在xml文件中设置一些属性,例如圆角等
  • 支持GIF格式
  • 支持WebP和动画Webp格式

Picasso 源码 | 官网

(-)

  • 加载大型网络图片到ListView中比较慢

(+)

  • 库很小
  • 缓存占用空间小
  • 易于使用
  • UI界面不会冻结
  • 支持WebP格式

Glide 源码

(-)

  • 库体积较大

(+)

  • 缓存占用空间小
  • 易于使用
  • 支持GIF格式
  • 支持WebP格式
  • 可以快速加载大型网络图片到ListView中,且UI界面不会冻结
  • BitmapPool可以重新使用内存,减少GC事件次数

通用图像加载器 源代码

(-)

  • 功能有限(图像处理受限)
  • 项目支持已于2015年11月27日停止

(+)

  • 库文件非常小巧
  • 易于使用

我在SGS2(Android 4.1)上进行了测试(WiFi 8.43 Mbps) 官方版本适用于Java,不适用于Xamarin! 2015年10月19日 我更喜欢使用Glide。 阅读更多信息,请单击此处 如何使用Glide将缓存写入外部存储(SD卡)


4
“Pretty fast image loader” 似乎与 Fresco 的 “应用程序冻结” 相矛盾。 - TWiStErRob
2
我在一个Xamarin项目中使用了Picasso,内存使用量非常大(用于将图像加载到回收视图中)。一直出现“OutOfMemory”错误... - Vahid Amiri
1
作为 Glide 的负面用户,我经历了很多闪烁问题。已加载的图片会在不知何故的情况下被“重置”。 - frankelot
不错的回答!但是,我可能不同意你认为Glide是一个“小型库”的想法。 - shoheikawano
1
@RJFares 我最近尝试了最新版本,你可以使用 ImagePipelineConfig.setDownsampleEnabled(true) 来防止它冻结。但是有时会跳过 GIF 的帧。如果你的应用程序只显示静态图像,我认为你可以试一试。 - Kimi Chiu
显示剩余7条评论

115

这些答案完全是我的个人看法。

答案

  1. Picasso是一个易于使用的图像加载器,同样适用于Imageloader。Fresco采用了一种不同的图像加载方法,我还没有使用它,但它看起来更像是从网络获取并缓存图像,然后显示图像,而不是像Picasso/Imageloader/Glide等其他方式,这些方式更多地显示屏幕上的图像,也可以从网络获取和缓存它们。

  2. Glide试图与Picasso有点可互换。我认为当它们被创建时,Picasso的想法是遵循HTTP规范,让服务器决定缓存策略并缓存全尺寸图像并按需调整大小。 Glide也是遵循HTTP规范,但尝试通过做出一些不同的假设来拥有较小的内存占用量,例如缓存调整大小的图像而不是全尺寸图像,并使用RGB_565而不是RGB_8888显示图像。这两个库都提供默认设置的完全自定义。

  3. 哪个库是最好使用的确实很难说。Picasso、Glide和Imageloader都是备受尊敬和经过充分测试的库,所有这些库在默认设置下都很容易使用。Picasso和Glide只需要一行代码即可加载图像并具有占位符和错误图像。自定义行为也不需要太多的工作。Imageloader也是一个比Picasso和Glide还要老的库,然而我没有使用它,所以无法对性能/内存使用/自定义等方面做出评价,但看github上的readme给我的印象是它也相对容易使用和设置。因此,在选择这3个库中的任何一个时,你都不会做出错误的决定,更多的是个人口味问题。对于Fresco,我的看法是它是另一个Facebook库,所以我们必须看看它将如何为他们工作,迄今为止,他们的记录并不好。就像Facebook SDK仍未正式发布在mavenCentral上我自2014年9月以来就没有使用过Facebook SDK,看起来他们在2014年10月将第一个版本放在了mavenCentral上。因此,我们需要一些时间才能得出关于它的好意见。

  4. 在这三个知名库之间,我认为它们之间没有显著的区别。唯一突出的是Fresco,因为它采用了不同的方法,并且是新的还没有经过实战检验。


3
细节问题:看起来Facebook SDK在Maven Central已经作为AAR文件正式提供了一段时间。https://developers.facebook.com/docs/android/getting-started#androidstudio - orip
1
谢谢纠正。我有一段时间没用 Facebook SDK 了,所以没有检查过。他们把它放上去的时间确实太长了。 - Aegis
1
一年过去了,我仍然在思考是否应该使用Fresco,而且我仍然看不出为什么要使用它。虽然Glide和Picasso可以直接使用,但是Fresco需要你做很多事情,看起来并不值得,而且还有大小的问题... - frostymarvelous
我想指出Fresco存在内存问题:https://github.com/facebook/react-native/issues/8711 - Fabian Zeindl
我也遇到了Fresco的内存问题,不幸的是,如果你需要动画GIF支持,似乎只能选择Fresco或Glide。另外,这里有一个链接,提供一些额外的比较细节(http://codix.io/c?repos=484%2C711%2C392%2C373)。 - Nick
你如何在Picasso上自定义缓存大小? - f.khantsis

65

无论是Glide还是Picasso都不是完美的。Glide将图像加载到内存并进行缓存的方式比Picasso更好,这使得图像加载速度更快。此外,它还有助于防止应用程序出现常见的OutOfMemoryError。GIF动画加载是Glide提供的一个杀手级功能。然而,Picasso解码图像的质量比Glide更好。

我更喜欢哪个?虽然我使用Picasso很长时间了,但我必须承认我现在更喜欢Glide。但我建议您将位图格式更改为ARGB_8888,并让Glide首先缓存完整大小的图像和缩小后的图像。剩下的就能很好地完成您的工作!

  • Picasso和Glide的方法数分别为840和2678。
  • Picasso(v2.5.1)的大小约为118KB,而Glide(v3.5.2)的大小约为430KB。
  • Glide会针对每个大小创建缓存图像,而Picasso会保存完整图像并进行处理,因此Glide在加载时显示更快,但使用的内存更多。
  • Glide默认使用RGB_565来减少内存使用。

+1 对于Picasso Palette Helper

有一篇关于Picasso与Glide的文章文章


很棒的文章。我现在要转用Glide了。比Picasso还好,这不是我想象中的。 :) - Sufian
1
我看到的一个问题是Glide需要API 10。这有点麻烦,因为我不能从我的应用中删除API 9支持。否则肯定有更好的方法。 - Sufian
你能解释一下为什么要使用API 9吗?只是好奇... - Daniel Gomez Rico
1
我认为这有点主观。但是支持尽可能多的设备/版本是一件更好的事情。不是吗? :) - Sufian
我在API 9模拟器上运行它,它运行得很好。根据Github上的一个问题,它说如果你不使用视频,它可能与9一起工作。我猜我可以试试。:D - Sufian
显示剩余4条评论

18
我希望与你分享我在Picasso、Universal Image Loader和Glide之间进行的基准测试

由于项目中使用了Drawee视图,所以Fresco没有参加基准测试。

我的建议是选择Universal Image Loader,因为它可以自定义、内存消耗低,并且在大小和方法之间保持平衡。

如果你有一个小项目,我会选择Glide(或者尝试一下Fresco)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接