如何在 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将图像作为请求发布?