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

Posted

技术标签:

【中文标题】如何在 Dart/Flutter 中读取本地图像文件的字节数?【英文标题】:How to read bytes of a local image file in Dart/Flutter? 【发布时间】:2018-04-17 21:47:07 【问题描述】:

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

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

bytes 变量每次都会出错。如何保存本地保存的图像文件的字节数?

【问题讨论】:

你可能想使用`Image.asset("assets/placeholder.png") 来代替 【参考方案1】:

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

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


ByteData bytes = await rootBundle.load('assets/placeholder.png');

【讨论】:

关于如何将字节转换为 BASE64 字符串的任何想法?我上面的 CryptoUtils 扩展不起作用。 是的,抱歉,您应该使用来自 "dart:convert" 的 BASE64,api.dartlang.org/stable/1.24.2/dart-convert/… 如果文件来自本地存储怎么办? 正如@X09 提到的,此实现不适用于从本地存储加载图像。我使用了它并且首先它可以工作,但是如果您从路径上有空格的文件夹中加载图像,它将无法工作。所以要小心【参考方案2】:

在 dart 中 Uint8List 等于 byte[]。

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

    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;
    
    

    现在调用函数来获取文件的字节数。

    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);
    
    

    如果您想要 base64String,请使用以下代码:

    String audiostring = base64.encode(audioByte);

对于 base64 导入 'dart:convert';

希望对你有帮助!

【讨论】:

投了反对票,因为建议的解决方案只会给问题 (File('...').readAsBytes()) 中已经正确陈述的内容添加噪音,而添加的内容与问题无关。对于那些以这个建议的答案为例,要从 Future 读取和映射(然后)数据,您可以将 await ... then() 的结果直接分配给一个变量,例如var result = await someFunc().then(...),所以你不要'需要在回调范围之外声明变量,然后赋值给它。 我在外面声明了这个变量,因为如果我们以后可以在 catch 块之前使用它。 futures 会返回错误,可以用myFunc().then(processValue).catchError(handleError) 处理,见dart.dev/guides/libraries/futures-error-handling :-)【参考方案3】:

这是一个逐字节读取文件的示例:

import 'dart:io';

void main(List<String> arguments) 
  readFileByteByByte().then((done) 
    print('done');
  );
  print('waiting...');
  print('do something else while waiting...');


Future<bool> readFileByteByByte() async 
  //final fileName = 'C:\\code\\test\\file_test\\bin\\main.dart'; // use your image file name here
  final fileName = Platform.script.toFilePath(); //this will read this text file as an example
  final script = File(fileName);
  final file = await script.open(mode: FileMode.read);

  var byte;
  while (byte != -1) 
    byte = await file.readByte();
    if (byte == ';'.codeUnitAt(0))  //check if byte is semicolon
      print(byte);
    
  
  await file.close();
  return (true);

【讨论】:

【参考方案4】:

如果需要读取一些字节,使用这个

Future<Uint8List> readFileBytes(String path, int len) async 
    final File file = File(path);
    RandomAccessFile fileOpen = await file.open(mode: FileMode.read);

    int count = 0;
    List<int> bytes = [];
    int byte;

    while (byte != -1 && count < len) 
      byte = fileOpen.readByteSync();
      bytes.add(byte);
      count++;
    

    await fileOpen.close();
    return Uint8List.fromList(bytes);
  

【讨论】:

以上是关于如何在 Dart/Flutter 中读取本地图像文件的字节数?的主要内容,如果未能解决你的问题,请参考以下文章

Dart // Flutter - 如何连接图像和音频以渲染静态视频

如何在Dart / Flutter中使用Flask Server API将图像作为请求发布?

如何在 Dart/Flutter 中获取设备 IP

如何在 Dart/flutter 中将视频文件分割成小块?

如何在Dart / flutter中映射和显示嵌套的JSON?

是否可以用Dart / Flutter绘制图像?