使用Glide加载图片时出现条纹和颜色混乱
一、问题概述
在使用Glide加载图片时,出现了条纹断裂和色块混乱的情况。 这是原图:
这是通过Glide加载出来的图片:
对比可以看出有明显的条纹和颜色的混乱,但是尝试另一个框架Picasso进行加载图片时,图片显示为正常:
二、通过对比来解决问题
Glide 和 Picasso 都是目前 Android 上最流行的图片加载库。大部分安卓应用开发人员都有使用过这两个库在他们的开发工作中。它们之间的差别主要体现在图片的缓存机制和默认色彩模式的差别。
色彩模式的差别
Glide 默认是用的 RGB_555 的设定,Picasso 则是用的 ARGB _8888的设定。这是Glide节省内存的一种策略,这个设定看起来会影响到图片显示,让我们来修改一下Glide的色彩模式。
<meta-data android:name="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框架为了节省内存引起的图片牺牲。通过这个案例也收获了很多,解决问题的同时也学习了两个流行图片加载框架区别。