关于图片加载框架

接上篇,这篇开始对现在比较的流行的第三方图片加载框架做一个对比总结。

这篇文章介绍内容如下:

  1、目前流行的图片加载框架有什么?

  2、各自的使用方法

  3、各自的优缺点

  4、优化问题

一、目前流行的图片加载框架有什么?

  ImageLoader   Glide  Picasso  Fresso(2015年)

  注:由于现在ImageLoader使用较少,本篇博文将不再对它进行阐述。主要以其它三个框架为主,有兴趣的同学可以自行学习。

二、各自的使用方法

  Picasso:    

      Picasso
                .with(this)
                .load("图片地址")
                //转换图片大小
                .resize(100,100)
                //类似于scaleType属性
                .centerCrop()
                //占位图
                .placeholder(R.mipmap.ic_launcher)
                //错误提示图
                .error(R.mipmap.ic_launcher)
                .into(ImageView);

  

   Glide:(使用方法与Picasso基本一致)

  Fresco:

  <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/my_image_view"
        android:layout_width="20dp"
        android:layout_height="20dp"
        fresco:fadeDuration="300"
        fresco:actualImageScaleType="focusCrop"
        fresco:placeholderImage="@color/colorPrimary"
        fresco:placeholderImageScaleType="fitCenter"
        fresco:failureImage="@mipmap/ic_launcher"
        fresco:failureImageScaleType="centerInside"
        fresco:retryImage="@mipmap/ic_launcher"
        fresco:retryImageScaleType="centerCrop"
        fresco:progressBarImage="@mipmap/ic_launcher"
        fresco:progressBarImageScaleType="centerInside"
        fresco:progressBarAutoRotateInterval="1000"
        fresco:backgroundImage="@color/colorPrimary"
        fresco:overlayImage="@mipmap/ic_launcher"
        fresco:pressedStateOverlayImage="@color/colorPrimary"
        fresco:roundAsCircle="false"
        fresco:roundedCornerRadius="1dp"
        fresco:roundTopLeft="true"
        fresco:roundTopRight="false"
        fresco:roundBottomLeft="false"
        fresco:roundBottomRight="true"
        fresco:roundWithOverlayColor="@color/colorPrimary"
        fresco:roundingBorderWidth="2dp"
        fresco:roundingBorderColor="@color/colorPrimary"
        />

 fresco属性介绍:

   1、必须设置width和Height属性,并且这两个属性不知吹wrap_content,必须强制设置宽高。

   2、支持宽高比,通过viewAspectRatio属性指定宽高比,固定宽或高,另一个可以设置为wrap_content

   3、placeholderImage及placeholderImageScaleType,设置占位图及占位图的缩放类型

    4、roundAsCircle = true设置为圆型图

   5、roundedCornerRadius圆角

   6、roundWithOverlayColor背景固定成指定的颜色

   

在使用fresco加载图片时先初始化(推荐在application中初始化)

      Fresco.initialize(this); 加载图片只需通过setImageURI就可以实现:
     draweeView.setImageURI(uri);

fresco所有属性几乎都支持在代码中进行修改,如果有需要,具体需要方法可以去看官方提供文档,写的很详细。
 (注:上面的所有是官方列举出来的,只对部分常用属性作解释。我的demo是在0.12.0版本下运行的,我在做的时候,版本低造成部分属性不支持,注意版本问题哦。  要想让fresco支持webp格式图片,必须引入相关依赖)

三、各自的优缺点

首先说,任何一种框架都不会是绝对完美的,只要是适合你的,就是最好的。所以,选择使用框架的时候,一定要明白它的优缺点,结合你要做的项目进行选择。

Picasso:

优点:

  1、Picasso默认加载图片的格式是ARGB_8888,图片清晰度高。

  2、在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题

  3、使用复杂的图片压缩转换来尽可能的减少内存消耗

4、自带内存和硬盘二级缓存功能

缺点:

  1、每次缓存的时候,不管imageview的大小是什么,它都会默认缓存整张图片,当显示的时候总是需要调整大小

  2、不能加载gif图,加载出来的也是不可以动的

3、圆角图需要自定义转换器,然后通过transform 方法指定,且显示效果不好,或有毛边

Glide:

  优点:

  1、Picasso的with方法只能传入context对象,而Glide可以传context、Activity、FragmentActivity、Fragment等。

    这样做的好处是:可以让图片的加载与Activity或Fragment的声明周期保持一致。在Activity或Fragment销毁的时候停止加载。

  2、Glide默认加载的格式是RGB_565,它占用内存仅为ARGB_8888的一半

  3、它会根据imageview图片大小不同缓存多张图片,加载速度快,优于Picasso,相当于用空间来换取时间

  4、支持gif图(耗内存,慎用)

  5、圆角图效果比Picasso好

  6、还有一个特性是你可以配置图片显示的动画,而Picasso只有一种动画:fading in。

  7、可以使用thumbnail()产生一个你所加载图片的thumbnail。

  缺点:

  1、加载格式是RGB_565,没有Picasso的图片效果好(但是肉眼并不能分辨,可以选择用这种方法来优化你的项目,减少内存占用)

    。。。。

(Picasso和Glide的方法个数分别是840和2678个。必须指出,对于DEX文件65535个方法的限制来说,2678是一个相当大的数字了。建议在使用Glide的时候开启ProGuard。)

总结:Glide和Picasso都不是完美的,从某些方面来说,Glide在图片的缓存上来说是比较不错的,因为它的速度比较快,另外,它
也可以有效的防止OOM错误,而加载gif图片也是Glide的一大优势,但是默认情况下picasso的图片质量是很高的。
另外的一点小建议是,使用Glide的时候把图片的格式改为ARGB8888并且缓存全尺寸和其他尺寸的图片,这样使用可以让加载图片更好。

Fresco

  号称是迄今为止安卓最强大的图片加载框架,相对与其它几个框架,他的主要优点就是能够更好的内存管理和更强大的功能。
优点:
  1、内存管理,实现了真正意义上的三级缓存,两级内存缓存和一个磁盘缓存。两级内存缓存分别是bitmap缓存和未解码图片的缓存,加快了图片的加载速度。同时值得一提的是,在app切换到后台时,fresco
会自动清理两级的内存缓存,无需手动,
  2、支持流式,可以类似网页上模糊渐进式显示图片
  3、对多帧动画图片支持的更好,如gif和webp(引导界面的大图用智图压成webp放在drawable中,用fresco加载就可以)

(注:今日对图片加载问题的总结主要是为了webp的引入,它是一种新的图片格式,目前许多网站都有应用,有兴趣的可以继续关注)
缺点:
  体积相比其它的框架都大,通常引入后会导致应用的apk增加1.5M到2M

  (其实我觉得,相对与fresco的优点,这个缺点不算什么的~当然,如果你的项目仅仅的图片展示,我觉的Glide或Picasso稍微做一些优化也足够了)

四、优化问题

仅提供几种优化方法,根据自己需要进行选择:

 1、需要高质量的图片,不满足与Glide的RGB_565

  

 public class GlideConfiguration implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}

  

然后在AndroidManifest.xml中将GlideModule定义为meta-data

<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration"   android:value="GlideModule"/>

 2、关于Glide

  上面提到Glide会缓存不同尺寸图片的大小,当你的页面imageView发生改变时,它会再去请求一张相应尺寸的图片,并进行缓存,加载。这样,根据imageView大小不同,同一张

图片会缓存多次,但是这样加载速度会大大提高,这就是用空间换取时间。而Picasso只会缓存一张全尺寸的,然后根据imageView的大小不同,进行大小调整后进行加载,这样速度就会慢很多。

为避免Glide多次访问网络下载的问题,可以缓存一张全尺寸大图,然后出现不同尺寸的时候,通过调整全尺寸图进行缓存加载。

Glide.with(this)
     .load("")
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .into();

  Picasso通过调整大小进行显示,所以有一些延迟,可以通过设置让其立即显示(效果不明显)

Picasso.noFade();

  3、Picasso和Glide都可以配置图片缓存控件的大小!可以根据自己的需要进行适当调整。

最后,推荐一篇关于Picasso源码解析的文章,写的很棒

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1639.html

时间: 2024-08-09 10:23:35

关于图片加载框架的相关文章

常用图片加载框架

我们在项目中使用的是Picasso.其实现在的主流图片加载框架除了Picasso还有ImageLoader,Glide,以及Fresco.ImageLoader是比较老的框架了,稳定, 加载速度适中, 缺点在于不支持GIF图片加载, 使用稍微繁琐, 并且缓存机制没有和http的缓存很好的结合, 完全是自己的一套缓存机制.Glide是谷歌的一位工程师开发的,它可以说是Picasso的升级版, 有Picasso的优点, 并且支持GIF图片加载显示, 图片缓存也会自动缩放, 默认使用RGB_565格式

iOS图片加载框架学习之FlyImage

在iOS开发中,其图片加载新框架FlyImage 整合了SDWebImage,FastImageCache,AFNetworking的优点,是一个新的性能高效.接口简单的图片加载框架,下面小编就和大家一起来扒一扒这个框架. 特点 高效 可将多张小图解码后存储到同一张大图上,在同屏渲染多图时,效率极高: 支持 mmap 内存映射,高效的I/O操作,减少一次文件拷贝操作,同时减少内存占用: 支持 Byte Alignment 字节对其,渲染过程中,避免执行 CA::Render::copy_imag

Android中常见的图片加载框架

图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行图片加载. 开源框架的源码还是挺复杂的,但使用较为简单.大部分框架其实都差不多,配置稍微麻烦点,但是使用时一般只需要一行,显示方法一般会提供多个重载方法,支持不同需要.这样会减少很不必要的麻烦.同时,第三方框架的使用较为方便,这大大的减少了工作量.提高了开发效率.本文主要介绍四种常用的图片加载框架,

Universal-Image-Loader(UIL)图片加载框架使用简单介绍

这个也是最近项目中使用到的第三方图片加载框架,在这里也自己总结一下,简单的介绍一些使用的方式. UIL图片加载框架特点 简介: 项目地址:https://github.com/nostra13/Android-Universal-Image-Loader 异步加载图片或者加载大量图片经常会遇到图片错乱或者OOM等相关问题.UIL图片缓存,目前使用最广泛的图片缓存,支持主流图片缓存的绝大多数特性. 我们看下该图片加载的三级缓存原理 特点: 1.多线程下载图片,图片可以来源于网络,文件系统,项目文件

【光速使用开源框架系列】图片加载框架ImageLoader

[关于本系列] 最近看了不少开源框架,网上的资料也非常多,但是我认为了解一个框架最好的方法就是实际使用.本系列博文就是带领大家快速的上手一些常用的开源框架,体会到其作用. 由于作者水平有限,本系列只会描述如何快速的使用框架的基本功能,更多的详细设置大家可以在这些项目的页面上找到. [介绍]: ImageLoader作为一款开源的异步图片加载框架,在Android开发中经常被使用到,该控件可以加载和显示图片.并且对其进行缓存,提供了很多方便的选项帮助开发者们快速达到开发需求. [GitHub页面]

图片加载框架之ImageLoader

Android开发中,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于这些问题解决起来会比较吃力,比较著名的就是Universal-Image-Loader,该项目可以在于Github搜索到. 特征: 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 支持图

图片加载框架之Glide和Picasso

Glide介绍 Glide是一个加载图片的库,作者是bumptech,它是在泰国举行的google 开发者论坛上google为我们介绍的,这个库被广泛的运用在google的开源项目中. Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内部封装了非常好的缓存机制并且在处理图片的时候能保持一个低的内存消耗. Picasso介绍(毕加索) picasso是Square公司开源的一个Android图形缓存库,地址http://square.github

主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---图片加载速度比较

图片加载这种实现繁琐,可复用性又极强的东西,自然是选择使用图片加载框架来快速实现. 像是Android-Universal-Image-Loader.Glide.Picasso.Fresco之类, 但是这时候的烦恼在于,这么多图片加载框架到底谁最实用? 有说Fresco,因为支持WebP,还是用了NDK来加载图片,减少JavaHeap的使用 有Picasso,简洁高效 有说Glide,Picasso升级,可以加载Gif,在Picasso基础上扩展了很多方法 ImageLoader 使用最广,因为

Android中图片加载框架Glide解析2----从源码的角度理解Glide的执行流程

转载地址:http://blog.csdn.net/guolin_blog/article/details/53939176 在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),Glide的基本用法 . 在多数情况下,我们想要在界面上加载并展示一张图片只需要一行代码就能实现,如下所示: Glide.with(this).load(url).into(i