You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Coil、Glide、Fresco无法解码JPEG图片问题求助

问题:Jetpack Compose中Coil/Glide/Fresco加载图片均解码失败

在Jetpack Compose中尝试用Coil、Glide、Fresco加载某图片时,三个库均因解码或格式错误加载失败。

各库报错信息

Coil错误

java.lang.IllegalStateException: BitmapFactory returned a null bitmap. Often this means BitmapFactory could not decode the image data read from the input source (e.g. network, disk, or memory) as it's not encoded as a valid image format.

Glide错误

Load failed for [目标图片] with dimensions [1080x722]
    class com.bumptech.glide.load.engine.GlideException: Failed to load resource
      Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Failed LoadPath{->Object->Drawable}, REMOTE
        Cause (1 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{->Drawable->Drawable}
        Cause (2 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{->GifDrawable->Drawable}
        Cause (3 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{->Bitmap->BitmapDrawable}
        Cause (4 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{->BitmapDrawable->Drawable}

Fresco错误

ProgressiveDecoder: unknown image format, {uri: 目标图片, firstEncodedBytes: 15BE1C006400E7B69FCA, length: 7279}

补充信息

该图片后缀为jpg,但实际为WebP格式,且可能存在编码异常或头部标识问题,导致三个库都无法正常识别并解码。

测试代码

Column(
    modifier = Modifier.fillMaxSize()
) {
    AsyncImage(
        model = ImageRequest.Builder(this@MainActivity)
            .data(link)
            .diskCachePolicy(CachePolicy.DISABLED)
            .build(),
        contentDescription = null,
        modifier = Modifier
            .weight(1f)
            .fillMaxSize()
    )
    FrescoImage(
        imageUrl = link,
        contentDescription = null,
        modifier = Modifier
            .weight(1f)
            .fillMaxSize()
    )
    GlideImage(
        model = link,
        contentDescription = null,
        modifier = Modifier
            .weight(1f)
            .fillMaxSize()
    ) {
        it.diskCacheStrategy(DiskCacheStrategy.NONE)
    }
}

可行解决方案

1. 强制指定解码格式

由于服务器返回的图片存在格式标识与实际内容不匹配的情况(jpg后缀实际为WebP),可以在请求时强制指定解码格式:

  • Coil:在ImageRequest中添加WebP解码器配置(需确保依赖包含WebP支持):
    ImageRequest.Builder(this@MainActivity)
        .data(link)
        .diskCachePolicy(CachePolicy.DISABLED)
        .decoder(ImageDecoderDecoder(this)) // 强制使用ImageDecoder解码WebP
        .build()
    
  • Glide:在请求选项中指定解码WebP格式:
    GlideImage(
        model = link,
        contentDescription = null,
        modifier = Modifier.weight(1f).fillMaxSize()
    ) {
        it.diskCacheStrategy(DiskCacheStrategy.NONE)
           .decode(WebpDrawable::class.java)
    }
    
  • Fresco:确保集成WebP解码器,并在请求时配置:
    val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(link))
        .setAutoRotateEnabled(true)
        .build()
    // 使用FrescoImage加载该request
    

2. 手动处理网络响应解码

通过OkHttp等网络库直接获取图片字节流,再强制按WebP格式解码:

val client = OkHttpClient()
val request = Request.Builder().url(link).build()
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) { /* 处理失败逻辑 */ }
    override fun onResponse(call: Call, response: Response) {
        response.body?.byteStream()?.use { inputStream ->
            val bytes = inputStream.readBytes()
            val options = BitmapFactory.Options().apply {
                inPreferredConfig = Bitmap.Config.ARGB_8888
                inFormat = BitmapFactory.Options.IN_FORMAT_WEBP
            }
            val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options)
            // 在主线程更新UI展示bitmap
            runOnUiThread { /* 处理bitmap展示逻辑 */ }
        }
    }
})

3. 更新库版本

确保使用的Coil、Glide、Fresco为最新稳定版本,旧版本可能存在WebP解码的兼容性问题,无法识别部分特殊编码的WebP文件。

4. 验证图片合法性

如果上述方法都无效,可能是图片本身编码损坏,可以尝试重新获取图片资源,或者用图片编辑工具重新保存为标准WebP/JPG格式后再测试。


内容的提问来源于stack exchange,提问作者Dmitry Klekchyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:55:05