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

本文介绍了解决Glide加载图片出现颜色混乱的问题。通过调整Glide的色彩模式为ARGB_8888,并将缓存策略设为DiskCacheStrategy.SOURCE,避免了图片被裁剪和颜色混乱的情况。

一、问题概述

在使用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框架为了节省内存引起的图片牺牲。通过这个案例也收获了很多,解决问题的同时也学习了两个流行图片加载框架区别。

Android 开发中,使用 Glide 加载图片出现旋转问题,通常是由 EXIF 信息导致的,以下是相应的解决办法: ### 自动处理 EXIF 旋转问题 Glide 可自动处理 EXIF 旋转问题,以此解决图片显示方向异常的问题。当使用 Android 设备拍摄的照片在应用中显示出现旋转情况时,往往是 EXIF(Exchangeable Image File Format,可交换像文件格式)信息在起作用。Glide 能对这类问题进行深入解析与处理,帮助开发者解决图片显示方向异常的痛点[^2]。 ### 手动旋转图片 借助 Glide 强大的图片变换功能,也能够手动旋转图片。示例代码如下: ```java private void loadImageRotated() { Glide .with( context ) .load( eatFoodyImages[0] ) .transform( new RotateTransformation( context, 90f )) .into( imageView3 ); } ``` 在上述代码里,`RotateTransformation` 可将图片旋转指定的角度(这里是 90 度)[^1][^4]。 ### 实现图片旋转动画 若需要在图片加载完成后实现旋转效果,可在 Glide 加载完成回调中触发 View 动画。通过 `RequestListener` 监听加载状态,在 `onResourceReady` 回调中执行旋转动画。核心实现涉及 Glide 请求监听 Android 原生 `RotateAnimation`。示例代码如下: ```java Glide.with(context) .load(R.drawable.dog) .listener(new RequestListener<Drawable>() { @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { RotateAnimation rotate = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotate.setDuration(2000); rotate.setRepeatCount(Animation.INFINITE); imageView.startAnimation(rotate); return false; } @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { return false; } }) .into(imageView); ``` 上述代码在图片加载完成后,让图片进行 360 度旋转动画,且无限循环[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值