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

一、问题概述

在使用Glide加载图片时,出现了条纹断裂和色块混乱的情况。
这是原图:

使用Glide加载图片时出现条纹和颜色混乱_第1张图片

这是通过Glide加载出来的图片:

使用Glide加载图片时出现条纹和颜色混乱_第2张图片

对比可以看出有明显的条纹和颜色的混乱,但是尝试另一个框架Picasso进行加载图片时,图片显示为正常:

使用Glide加载图片时出现条纹和颜色混乱_第3张图片


二、通过对比来解决问题

Glide 和 Picasso 都是目前 Android 上最流行的图片加载库。大部分安卓应用开发人员都有使用过这两个库在他们的开发工作中。它们之间的差别主要体现在图片的缓存机制和默认色彩模式的差别。

色彩模式的差别

Glide 默认是用的 RGB_555 的设定,Picasso 则是用的 ARGB _8888的设定。这是Glide节省内存的一种策略,这个设定看起来会影响到图片显示,让我们来修改一下Glide的色彩模式。

 "com.xxxx.xxxx.GlideConfiguration"
                   android:value="GlideModule"/>
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.
    }
}

非常简单,新建一个GlideConfiguration类去实现GlideModule,在重写的applyOptions方法中加上一行代码,再在配置文件中加上这段代码来指定你新建的类所在的包路径。

缓存机制的差别 ##

Picasso:缓存图片时,是下载图片并且缓存一个完整大小的文件到本地,也就是源文件缓存下来。这是一种比较常见的缓存方式。

Glide:缓存图片时,是先下载图片,然后根据你imageView的大小来改变图片的大小,接下来才缓存这个修改后的缓存文件到本地。所以Glide缓存下来的文件并不是源文件。

Glide提供了四种缓存策略:
- DiskCacheStrategy.NONE :不缓存图片
- DiskCacheStrategy.SOURCE :缓存图片源文件
- DiskCacheStrategy.RESULT:缓存修改过的图片
- DiskCacheStrategy.ALL:缓存所有的图片,默认

在上文中使用的是ALL的缓存方式,将缓存方式改为SOURCE,这样Glide就不会对图片进行修改。

运行查看结果显示为正常:

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

三、总结

以上两个方面缺一个都会引起图片的颜色混乱。这也是Glide框架为了节省内存引起的图片牺牲。通过这个案例也收获了很多,解决问题的同时也学习了两个流行图片加载框架区别。

你可能感兴趣的:(android)