【发布时间】:2019-01-07 14:47:35
【问题描述】:
我使用图像插件 (image: ^2.0.4),所以我可以在图像上写一些东西,然后将新图像保存到设备或通过邮件发送。我尝试使用“new File”加载图像,但在 Flutter 上出现错误。我询问并搜索并得到提示,我可以使用 rootBundle 在 Flutter 中加载图像。我做到了,我得到了以下错误。
[ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] 未处理的异常: 无法加载资产:packages/myAppName/assets/images/ReceiptRaw_1.jpg
当我创建一个简单的 dart 控制台应用程序时,该插件可以工作,但无法使用颤振加载。请帮忙,
这是 Flutter 代码:
Future<bool> makeReceiptImage() async {
// UPDATE ****************************************
// load the receipt jpeg
var imageData = await rootBundle.load('packages/myAppName/dekonts/ReceiptRaw_1.jpg');
print("imageData: $imageData"); // Prints as imageData: Instance of
'_ByteDataView'
// UPDATE ****************************************
Image _receiptImage = await decodeImage(new File(imageData).readAsBytesSync());
drawString(_receiptImage, arial_48, 440, 30, “Customer Name”, color: 0xFF000000);
// Write it to disk as a different jpeg
var new_jpeg = await encodeJpg(_receiptImage);
String newImagePath = await rootBundle.loadString('packages/myAppName/assets/images/ReceiptRaw_2.jpg');
await new File(‘$newImagePath’).writeAsBytesSync(new_jpeg);
}
这是 Dart 控制台代码:
import 'dart:io';
import 'dart:convert';
import 'dart:async';
import 'package:image/image.dart';
void main() async {
// load the receipt jpeg
String mImagePath = 'images/ReceiptRaw_1.jpg';
Image _receiptImage = decodeImage(new File(mImagePath).readAsBytesSync());
drawString(_receiptImage, arial_48, 440, 30, “Customer Name”, color: 0xFF000000);
// Write it to disk as a different jpeg
var new_jpeg = encodeJpg(_receiptImage);
new File('images/ReceiptRaw_1.jpg').writeAsBytesSync(new_jpeg);
}
更新 1: 当我使用下面的代码时,我收到以下错误:
在 pubspec.yaml 中检测到错误: 找不到资产的文件或变体:packages/myAppName/assets/images/ReceiptRaw_1.jpg
String imageData = await rootBundle.loadString('packages/myAppName/assets/images/ReceiptRaw_1.jpg');
Image _receiptImage = await decodeImage(new File(imageData).readAsBytesSync());
更新 2:
如果我使用rootBundle.load,则会出现以下错误。
错误:“dart.typed_data::ByteData”类型的值无法分配给“dart.core::String”类型的变量。
var imageData = await rootBundle.load('packages/myAppName/assets/images/ReceiptRaw_1.jpg');
Image _receiptImage = await decodeImage(new File(imageData).readAsBytesSync());
新更新:
第 1 步:
移动到ReceiptRaw_1.jpg 进入lib/dekonts/ 文件夹
改为:
assets:
- packages/myAppName/dekonts/ReceiptRaw_1.jpg
改为:
var imageData = await rootBundle.load('packages/myAppName/dekonts/ReceiptRaw_1.jpg');
print("imageData: $imageData");
结果: 打印为
imageData:“_ByteDataView”的实例
第 2 步:
移动到 /lib/assets/images/ReceiptRaw_1.jpg 文件夹
改为:
assets:
- packages/myAppName/lib/assets/images/ReceiptRaw_1.jpg
改为:
var imageData = await rootBundle.load('packages/myAppName/lib/assets/images/ReceiptRaw_1.jpg');
print("imageData: $imageData");
结果:错误如下:
解决依赖关系... 运行“gradlew assembleDebug”... 在 pubspec.yaml 中检测到错误: 未找到资产的文件或变体:packages/myAppName/lib/assets/images/ReceiptRaw_1.jpg
更新:
/// 要包括第一张图片,应用程序的
pubspec.yaml应该
/// 在资产部分指定它:
///
/// 资产: /// - 包/fancy_backgrounds/backgrounds/background1.png ///
///lib/是隐含的,因此它不应包含在资产路径中。
【问题讨论】:
-
imageData已经是图像数据。new File(...).readAsBytesSync()是多余的。 -
“找不到资产的文件或变体:packages/capitalbankmobile/assets/images/ReceiptRaw_1.jpg”你在哪里有这个文件?