如何在Dart/Flutter中读取本地图像文件的字节?

Cha*_* Jr 4 base64 byte image dart flutter

我想使用我添加到我的代码中的占位符图像文件"assets/placeholder.png",但是我收到了一个找不到文件的错误.这就是我从dartlang文档中做到的...

var bytes = await new File('assets/placeholder.png').readAsBytes();
String base64 = CryptoUtils.bytesToBase64(bytes);
Run Code Online (Sandbox Code Playgroud)

bytes变量错误每次.如何保存本地保存的图像文件的字节?

Waj*_*han 14

在 dart 中 Uint8List 等于 byte[]。

  1. 创建一个函数并传递文件路径,它将返回字节。

    Future<Uint8List> _readFileByte(String filePath) async {
        Uri myUri = Uri.parse(filePath);
        File audioFile = new File.fromUri(myUri);
        Uint8List bytes;
        await audioFile.readAsBytes().then((value) {
        bytes = Uint8List.fromList(value); 
        print('reading of bytes is completed');
      }).catchError((onError) {
          print('Exception Error while reading audio from path:' +
          onError.toString());
      });
      return bytes;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在调用该函数以获取文件的字节数。

    try{
      Uint8List audioByte;
      String myPath= 'MyPath/abc.png';
      _readFileByte(myPath).then((bytesData) {
        audioByte = bytesData;
      //do your task here 
      });
    } catch (e) {
       // if path invalid or not able to read
      print(e);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果你想要 base64String 然后使用下面的代码:

    String audioString = base64.encode(audioByte);

对于 base64 导入 'dart:convert';

我希望它会有所帮助!

  • 被否决是因为建议的解决方案只会对问题(“File('...').readAsBytes()”)中基本上已经正确陈述的内容添加噪音,并且添加的内容与问题无关。对于那些以这个建议答案为例的人,要从 Future 读取和映射(然后)数据,您可以将 wait ... then() 的结果直接分配给变量,例如 `var result = wait someFunc() .then(...)`,因此您不需要在回调范围之外声明变量,然后分配给它。 (4认同)
  • futures 可以返回错误,可以使用 myFunc().then(processValue).catchError(handleError)` 进行处理,请参阅 https://dart.dev/guides/libraries/futures-error-handling :-) (2认同)

Had*_*ard 10

使用Flutter环境时,AssetBundle如果要访问资产,则必须使用(https://flutter.io/assets-and-images/).

import 'package:flutter/services.dart' show rootBundle;


ByteData bytes = await rootBundle.load('assets/placeholder.png');
Run Code Online (Sandbox Code Playgroud)

  • 请问如果文件来自本地存储怎么办? (2认同)

Coa*_*edi 9

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

...

ByteData byteData = await rootBundle.load('assets/image.png');

Uint8List bytes = byteData.buffer.asUint8List();

String base64Image = base64.encode(bytes);

Run Code Online (Sandbox Code Playgroud)