主流图片加载框架?

1> Picasso

2> Glide

3> Fresco

4> ImageLoader

介绍:

Picasso:和Square的网络库一起能发挥最大作用,因为Picasso可以选择将网络请求的缓存部分交给了okhttp实现

Glide:模仿了Picasso的API,而且在他的基础上加了很多的扩展(比如gif等支持),Glide默认的Bitmap格式是RGB_565,比 Picasso默认的ARGB_8888格式的内存开销要小一半;Picasso缓存的是全尺寸的(只缓存一中),而Glide缓存的是跟ImageView尺寸相同的(即56*56和128*128是两个缓存)。

Fresco:最大的又是在于5.0以下(最低2.3)的Bitmap加载。在5.0以下系统,Fresco将图片放到一个特别的内存区域(Ashmem区)。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。为什么说5.0以下呢?因为在5.0系统以后系统默认就是存储在Ashmem区了。

ImageLoader:旨在为图像加载,缓存和显示提供强大,灵活可定制的工具。他提供了大量的配置选项和良好的控制图像加载和缓存过程。

下面简单说一说这些框架的使用:

Picasso的基本使用:

将Picasso添加进项目后,只需一行就搞定:

Picasso.with(context).load(imageUrl).into(imageView);

1.自动将图像缓存在本地;

2.通过图片压缩转换以减少内存消耗

3.自动处理了ImageView的回收,即自动取消不在事业范围内的ImageView视图资源的加载;

Picasso裁剪:

Picasso.with(context).load(imageUrl).resize(50,50).centerCrop.info(imageView);

自定义格式转换:

为了实现更多想要转换的效果,可以自己实现一个Transformation接口的类,然后将其对象传递给transform()方法:

public class myTransformation implements Transformation{

@Override

public Bitmap transform(Bitmap source){

//对source实现自定义裁剪

}

@Override

public String key(){

return "square()"

}

}

占位符图片:

所谓的占位符图像即当图片为正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误是显示的默认图片,通过error()设置

Picasso.with(context).load(imageUrl).placeholder(R.drawable.image_placeholder).error(R.drawable.image).into(imageView);

载入本地资源:

除了通过网络下载图片,Picasso也可以载入本地图片资源:

Picasso.with(context).load(R.deawable.icon).into(imageView);

Picasso.with(context).load("file://android_asset/Android.png").into(imageView);

Picasso.with(context).load(new File(...)).into(imageView);

调试:为了方便调试,你可以通过测试Picasso的setIndicatiorEnabled(true);可以让不同来源的图片显示一个不同的色彩标记

2.Glide最火图片加载开源框架加载Gif资源到ImageView中

通常ImageView不能加载Gif图片,如果不做任何处理的话,加载到ImageView中的Gif只显示第一帧。网上大多方案都是借助Android的Movie,把gif图片作为流,解析成Android Movie显示,这些定制的基本思想就是线检测图片资源是否为Gif图片,若是,则按照Android Movie解析之。

Glide,本身在图片加载和缓存方面做得比较优秀,同时架子啊Gif图也很方便,把需要加载的Gif图片放到drawable目录下,然后就和普通的ImageView设置一个图片资源R.drawable.xx 一样,很简单。或者从网络URL加载一个图片,开发者不用关心这个图片资源是否是gif还是其他jpg还是png等等格式,直接将其当做一个普通的图片加载即可,

使用:

Glide.with(this).load(R.drawable.loading).into(imageView);

3.Fresco让图片的渐进式呈现的强大框架

Fresco中有个 image pipeline 的模块,负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和cpu时间,他含有3级缓存设计(2级内存,1级文件)

Fresco中设计有一个叫做Drawees模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。

Fresco支持Android2.3及以上系统

特性

内存管理:

解压后的图片,即Bitmap,占用大量的内存。大的内存占用势必会引发更加频繁的GC。在5.0以下,GC将会显著的引发界面卡顿。在5.0以下系统,Fresco将图片放到一个热别的内存区域。当然,在图片不显示的时候,占用的内存会自动释放。这会使得APP更加流畅,减少因为图片内存占用而引发的OOM。

Fresco在低端机器是上一样出色,你再也不用因图片内存占用而思前想后。

图片的渐进式呈现:

渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后UI随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是网络有几大的利好,可带来更好的用户体验。

Android本身的图片库不支持次格式,但是Fresco支持,使用是,和往常一样仅仅需要提供一个图片的URL即可.

GIF图和WebP格式:

支持GIF,支持WebP格式

图像的呈现:

Fresco的Drawees设计,带来一些有用的特性:

自定义居中焦点(对人脸等图片显示非常有帮助)

元教徒,当然圆圈也行。

下载失败后,点击重新下载

自定义占位图,自定义overlay,或者进度条

指定用户按压式的overlay

图像的加载

Fresco的 image pipeline 设计,允许用户在多方面控制图片的加载:为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片先显示一个低解析度的图片,等高清图下载完之后在现实高清图

加载完成回调通知

对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图

缩放或者旋转图片

处理已下载的图片

WebP支持

4.ImageLoader

特性:

多线程图像加载(异步或者同步);

ImageLoader配置的广泛定制(线程池,下载器,解码器,内存和磁盘缓存策略,显示图像选项等);

每个显示图像调用的许多自定义选项(存根图像,缓存开关,解码选项,位图处理和显示等);

内存和/或磁盘上的图像缓存(设备的文件系统或SD卡);

监听加载过程(包括下载进度)

根据控件的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存

较好的控制图片的加载过程,例如暂停图片加载,重新开始加载,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片

提供在较慢的网络下对图片进行加载

5.Picasso,Fresco,Glide,ImageLoader优劣

Fresco:

优点:

1.图片存储在安卓系统的匿名共享内存,而不是虚拟机的堆内存中,图片的中间缓冲数据也存放在本地堆内存,所以,应用程序有更多的内存使用,不会因为图片加载而导致oom,同时也减少垃圾回收器频繁回收Bitmap导致的界面卡顿,性能更高。

2.渐进式加载JPEG图片,支持图片从模糊到清晰加载

3.图片可以以任意的中心店显示在ImageView,而不仅仅是图片的中心

4.JPEG图片改变大小也是在native进行的,不是在虚拟机的堆内存,同样减少OOM

5.很少的支持GIF图片的显示

缺点:

框架较大,影响APK体积

使用较繁琐

ImageLoader,Picasso,Glide:这三者实现机制都差不多

ImageLoader:

比较老的框架,稳定,加载速度适中,缺点在于不支持GIF图片加载,使用稍微繁琐,并且缓存机制没有和http的缓存很好的结合,完全是自己的一套缓存机制

Picasso:

使用方便,一行代码完成加载图片显示,框架体积小

缺点在于不支持GIF,并且他可能是想让服务器去处理图片的缩放,他缓存的图片是未缩放的,并且默认使用ARGB_8888格式缓存图片,缓存体积大

Glide:

可以说是Picasso的升级版,有Picasso的优点,并且支持GIF图片的加载,图片缓存也会自动缩放,默认使用RGB_565格式缓存图片,是Picasso缓存体积的一半

总结:

Picasso所能实现的功能,Glide都能做,无非是所需的设置不同。但是Picasso体积比起Glide小太多,如果项目中网络请求本身用的就是okhttp或者retrofit(本质还是okhttp),那么建议用Picasso,体积会小很多。Glide的好处就是处理大型的图片流,比如gif、Video,如果你们是做美拍、爱拍这种视频类应用的话,建议使用Glide。

Freaso在5.0以下的内存优化非常好,代价就是体积也非常大,按体积算Fresco > Glide > Picasso

不过在使用起来也有些不便(建议:他只能用内置的一个ImageView来实现这些功能,用起来比较麻烦,我们通常是根据Fresco自己改改,直接使用它的Bitmap层)

安卓加载图片四大框架相关推荐

  1. Android框架之路——Glide加载图片(结合RecyclerView、CardView)

    Android框架之路--Glide加载图片 一.简介: 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开 ...

  2. 安卓 加载服务器图片不显示图片,android 从服务器加载.9图

    问题描述: APP启动时, 广告页的图片是从服务器上获取, 这个图片一般需要全屏显示, 这个怎么适配呢? 解决方法1: 如果使用android:scaleType="fitXY"属 ...

  3. android studio 加载图片,Android Studio 加载网络图片

    Android Studio是基于gradle的一个Android开发软件,在引用网络图片的时候需要连接第三方库,这里介绍 引用glide的方法. 一.在github页面搜索glide,点击第一个 二 ...

  4. 使用Glide加载图片时出现条纹和颜色混乱

    一.问题概述 在使用Glide加载图片时,出现了条纹断裂和色块混乱的情况. 这是原图: 这是通过Glide加载出来的图片: 对比可以看出有明显的条纹和颜色的混乱,但是尝试另一个框架Picasso进行加 ...

  5. 使用Fresco加载图片

    Fresco是facebook推出的一款强大的图片加载的框架,我们都知道,在手机上,每一个像素的R.G.B和alpha通道总共要占用4byte的空间,而Fresco可以最大限度节省空间和CPU时间,它 ...

  6. android多种方式实现异步加载图片

    记得之前做安卓应用时都是在2.2以下的版本,如果在UI线程中进行耗时操作,比如http,socket等 会产生android.os.NetworkOnMainThreadException 如果异步加 ...

  7. VC从文件中加载图片

    用MFC做GDI开发的朋友肯定熟悉CBitmap类,该类封装了HBITMAP对象,简化了关于HBITMAP的API操作,如LoadBitmap方法可直接加载资源中指定ID的图片,但是很多情况下我们需要 ...

  8. canny算法的实现(android加载图片,数组写入文件换行)

    Canny边缘检测首先要对图像进行高斯去噪,前面讲到了高斯去噪处理,这里从对图像灰度进行微分运算讲起吧.微分运算常用的方法是利用模板算子,把模板中心对应到图像的每一个像素位置,然后按照模板对应的公式对 ...

  9. ios加载本地html懒加载图片方案,IOS开发中加载大量网络图片优化方法

    IOS开发中加载大量网络图片如何优化 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过一段类似流的方式去加载网络图片,接着 ...

最新文章

  1. linux mysql 升级_linux升级mysql
  2. linux环境安装部署mark
  3. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(一)
  4. html文档定义层标记是,HTML文档定义层的标记是()
  5. sql分割以逗号隔开的字符串
  6. gradle tool升级到3.0注意事项
  7. 温故而知新_C语言_define_宏
  8. 添加ClearWindow.py文件实现IDLE的清屏功能
  9. EXCEL——处理大批量数据
  10. linux温度监控软件,PSensor:Linux下硬件温度监控软件
  11. Part 2 如何进行埋点(内附埋点文档模板)
  12. 安装软件,python安装,node.js安装,pycharm安装,vscode安装,PR, PS, LR.AE Windows开关机等,雪崩的时候没有一片雪花儿是无辜的
  13. 极客时间限时免费开放全部课程!别纠结了选这几门!
  14. 数据只有被交换共享,才能创造价值 | 推荐收藏
  15. 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】
  16. Python Matplotlib散点图
  17. FX5U和je-C伺服通讯案例和学习资料
  18. java filebody bitmap对象_处理 | 保利威帮助中心 - Part 5
  19. 【XMind】如何用XMind8绘制流程图?
  20. Google Earth Engine(GEE)——上传数据和数据下载详解

热门文章

  1. 谨以此篇献给正在迷茫的人生 浅谈网络时代各种骗局
  2. php实现微博话题 功能,PHP实现微博的@好友和话题功能
  3. 开源库UniTask笔记
  4. 【华为OD机试真题 python】 5键键盘【2022 Q4 | 100分】
  5. 抖音xlog算法分析
  6. 手机摄影 -参数ISO
  7. 通信(服务器客户端的群聊与网络画板)
  8. 5G差异化业务场景需求及网络切片(1)
  9. sae wpa3加密方式_WPA3:四大安全新特性技术分析
  10. ros rviz显示rosbag中的图像和imu数据