【问题标题】:How to get a Uint8List from a Network image by url in Flutter?如何通过 Flutter 中的 url 从网络图像中获取 Uint8List?
【发布时间】:2020-05-10 16:31:36
【问题描述】:

我有图像的网络 url,我需要获取 Uint8List。我怎样才能转换它? 我检查类似问题的答案,但这些方法不起作用。 How to get a Flutter Uint8List from a Network Image?

【问题讨论】:

  • “不工作”是什么意思?
  • 这意味着,该代码对于最新版本的 Flutter 是不实际的。 var load = sunImage.load(val);方法加载需要两个必填参数NetworkImageKey和DecoderCallback
  • final DecoderCallback callback = (Uint8List bytes, {int cacheWidth, int cacheHeight}) { print(bytes.length); return instantiateImageCodec(bytes, targetWidth: cacheWidth, targetHeight: cacheHeight); }; ImageProvider provider = AssetImage('images/bg.png'); provider.obtainKey(createLocalImageConfiguration(context)).then((key) { provider.load(key, callback); }); 我用AssetImage 测试过,但它应该适用于任何ImageProvider
  • 没什么,provider.load(key, callback) 被调用了
  • 什么时候必须调用print(bytes.length)

标签: flutter dart


【解决方案1】:

试试这个:

Uint8List bytes = (await NetworkAssetBundle(Uri.parse(url)).load(url))
    .buffer
    .asUint8List();

【讨论】:

  • 您好,我正在尝试在一个块中使用您的代码,而不是使用 http get 下载图像,因为 CORS 策略不允许这样做。当在网上我得到一个BlocError: Unsupported operation: Platform._version。知道为什么吗?非常感谢。
  • 嗨@Vincenzo,我已经在移动设备上而不是在网络上进行了测试,但如果它是关于 cors 政策的,你应该考虑使用相同的域、allow-origin 标头或 jsonp。
  • 嗨@kaya,我昨天真的解决了,我确实必须为我的谷歌存储桶定义核心标题。现在我可以像以前一样下载它们了。非常感谢您的回答。
【解决方案2】:
Uint8List yourVar;
final DecoderCallback callback = (Uint8List bytes, {int cacheWidth, int cacheHeight}) {
        yourVar = bytes.buffer.asUint8List();
        return instantiateImageCodec(bytes, targetWidth: cacheWidth, targetHeight: cacheHeight);
      };
ImageProvider provider = NetworkImage(yourImageUrl);
    provider.obtainKey(createLocalImageConfiguration(context)).then((key) {
      provider.load(key, callback);
    });

【讨论】:

  • 但你没有addListener() - 你不打算解码ui.Image 对象吗?
  • 我想获取图片的字节数
  • 但你也说过:“我会尝试在它之后获取图像” - 所以它不再是真的了吗?
  • 我的意思是字节,因为我使用字节来保存我的图像。
  • 好的,我现在明白了 - 但实际上如果你使用 httpdirectly 会更好吗?
【解决方案3】:

这对我有用:

import 'dart:typed_data';
import 'package:flutter/services.dart';

//Get the image from the URL and then convert it to Uint8List
Uint8List bytes = (await NetworkAssetBundle(Uri.parse('https://some_image_url.png'))
            .load('https://some_image_url.png'))
            .buffer
            .asUint8List();

【讨论】:

    【解决方案4】:

    这适用于我(使用颤振网络)与库 file_saver

    Uri uri = Uri.parse(url);
    
    Uint8List bytes = await readBytes(uri);
    await FileSaver.instance.saveFile(filename, bytes, 'jpg',
        mimeType: MimeType.JPEG); // specify your vars
    

    【讨论】:

      【解决方案5】:

      我在 Flutter web 中遇到了同样的问题,我不得不使用 extended_image 库,我在您的示例中发现有一个方法可以让您将 ImageProvider 转换为字节。

      https://github.com/fluttercandies/extended_image/blob/master/example/lib/pages/simple/image_editor_demo.dart.

      /// it may be failed, due to Cross-domain
      Future<Uint8List> _loadNetwork(ExtendedNetworkImageProvider key) async {
        try {
          final Response response = await HttpClientHelper.get(Uri.parse(key.url),
              headers: key.headers,
              timeLimit: key.timeLimit,
              timeRetry: key.timeRetry,
              retries: key.retries,
              cancelToken: key.cancelToken);
          return response.bodyBytes;
        } on OperationCanceledError catch (_) {
          print('User cancel request ${key.url}.');
          return Future<Uint8List>.error(
              StateError('User cancel request ${key.url}.'));
        } catch (e) {
          return Future<Uint8List>.error(StateError('failed load ${key.url}. \n $e'));
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-10
        • 2012-05-29
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        相关资源
        最近更新 更多