Flutter:无法解码图像 - 无法创建图像解码器,并显示消息“无效输入”输入包含错误

问题描述 投票:0回答:1

我试图在 Flutter 应用程序中显示来自

NetworkImage
内的 URL 的图像,但发生错误导致图像无法显示,这是记录的异常:

D/HeifDecoderImpl(11496): No valid image or sequence available
E/FlutterJNI(11496): Failed to decode image
E/FlutterJNI(11496): android.graphics.ImageDecoder$DecodeException: Failed to create image decoder with message 'invalid input'Input contained an error.
E/FlutterJNI(11496):    at android.graphics.ImageDecoder.nCreate(Native Method)
E/FlutterJNI(11496):    at android.graphics.ImageDecoder.access$200(ImageDecoder.java:173)
E/FlutterJNI(11496):    at android.graphics.ImageDecoder$ByteBufferSource.createImageDecoder(ImageDecoder.java:250)
E/FlutterJNI(11496):    at android.graphics.ImageDecoder.decodeBitmapImpl(ImageDecoder.java:1862)
E/FlutterJNI(11496):    at android.graphics.ImageDecoder.decodeBitmap(ImageDecoder.java:1855)
E/FlutterJNI(11496):    at io.flutter.embedding.engine.FlutterJNI.decodeImage(FlutterJNI.java:559)

════════ Exception caught by image resource service ════════════════════════════
The following _Exception was thrown resolving an image codec:
Exception: Invalid image data

When the exception was thrown, this was the stack:
#0      _futurize (dart:ui/painting.dart:6966:5)
painting.dart:6966
#1      ImageDescriptor.encoded (dart:ui/painting.dart:6775:12)
painting.dart:6775
#2      instantiateImageCodecWithSize (dart:ui/painting.dart:2287:60)
painting.dart:2287
#3      PaintingBinding.instantiateImageCodecWithSize (package:flutter/src/painting/binding.dart:141:15)
binding.dart:141
#4      NetworkImage._loadAsync (package:flutter/src/painting/_network_image_io.dart:131:20)
_network_image_io.dart:131
<asynchronous suspension>
#5      MultiFrameImageStreamCompleter._handleCodecReady (package:flutter/src/painting/image_stream.dart:985:3)
image_stream.dart:985
<asynchronous suspension>

Image provider: NetworkImage("https://mega-store.s3.eu-west-2.amazonaws.com/shelly/0.2782753988222566.png", scale: 1.0)
Image key: NetworkImage("https://mega-store.s3.eu-west-2.amazonaws.com/shelly/0.2782753988222566.png", scale: 1.0)
════════════════════════════════════════════════════════════════════════════════

这是图像的URL:https://mega-store.s3.eu-west-2.amazonaws.com/shelly/0.2782753988222566.png

该错误仅发生在Android 11设备中根据我的测试,我已经在Android 12和IOS 17.4中使用相同的代码测试了相同的图像,一切正常。

android flutter image encoding networkimageview
1个回答
0
投票

问题是 URL 中的图像保存在

.png
文件扩展名中,但它的 Encoding 实际上是 AV1 图像文件格式 (AVIF),当您从 URL 下载图像并检查时,这一点很明显文件信息中的文件编码:

enter image description here

图像无法在 Android 11 设备中工作的原因是,

AV1
文件格式仅从 Android 12 开始在 Android 中受支持,这里是 来自官方 Android 文档的片段

AVIF

Android 12(API 级别 31)及更高版本支持使用 AV1 的映像 图像文件格式 (AVIF)。 AVIF 是图像和图像的容器格式 使用 AV1 编码的图像序列。 AVIF 利用 来自视频压缩的帧内编码内容。这戏剧性地 与旧版本相比,提高了相同文件大小的图像质量 图像格式,例如 JPEG。深入了解其优点 这种格式,请参阅 Jake Archibald 的博客文章。

因此,如果您继续在Android 11以下的Android版本中进行测试,它也将无法工作。

✅ 建议的解决方案:

  1. 您可以将图像转换为其他熟悉的格式,例如
    PNG
    JPEG
    ,这在所有Android和IOS版本中都没有问题。
  2. 您可以使用 flutter_avif 包来显示
    AV1
    图像,但您必须先检查文件类型以了解是否确实
    AV1
    才能使用该包提供的小部件,因为您可能会还有其他文件格式的其他图像。
© www.soinside.com 2019 - 2024. All rights reserved.