这是原始图像:
这是使用 ImageView 渲染的图像:
但是,有时候当图片在轮播中的时候,刷回图片可能会导致图片正确渲染,这就更诡异了……
在 LG G3 (Android 5.1) 和 Genymotion (Android 4.4.4) 上都观察到了这种行为。我正在使用 Glide 库加载图像,使用ARGB_8888
解码格式:
new GlideBuilder(this).setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
这是原始图像:
这是使用 ImageView 渲染的图像:
但是,有时候当图片在轮播中的时候,刷回图片可能会导致图片正确渲染,这就更诡异了……
在 LG G3 (Android 5.1) 和 Genymotion (Android 4.4.4) 上都观察到了这种行为。我正在使用 Glide 库加载图像,使用ARGB_8888
解码格式:
new GlideBuilder(this).setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
这是已解决的问题305。这是一个快速回顾:
此问题仅出现在 JPEG 格式的图像上(与质量无关)。看起来它的影响RGB_565
比 大得多ARGB_8888
,因此您可能需要将 DecodeFormat 切换为ARGB_8888
(清除应用数据以检查问题是否已解决)。但它甚至可以出现ARGB_8888
,因此请使用以下解决方案之一:
使用DiskCacheStrategy.NONE
(对于本地图像) 或DiskCacheStrategy.SOURCE
(对于远程图像) 来防止 Glide 重新压缩图像:
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
使用 asBitmap() 和自定义 BitmapEncoder 始终将受影响的图像压缩为 PNG:
Glide.with(this)
.fromResource()
.asBitmap()
.encoder(new BitmapEncoder(Bitmap.CompressFormat.PNG,100))
.load(R.drawable.testimg)
.into(imageView);
以防万一有人尝试了上面列出的所有方法但都没有奏效(就像我的情况一样),还有另一种解决方法。由于在转换过程中会出现绿色,我们可以避免转换。
Glide.with(context)
.load(url)
.dontTransform()
.into(holder.productImage);
This issue may happen on few devices not all like one plus 3 or 3T and some LG devices when fetching imageUrl from server to your android project.
public static void loadImageWith(Context context, String imageUrl, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.dontTransform()
.placeholder(R.drawable.empty_photo)
.into(imageView);
}
centerCrop() may create issue, so avoid to use centerCrop().