私は画像プラグイン(image:^ 2.0.4)を使用しているので、画像に何かを書き込んで、後で新しい画像をデバイスに保存したり、メールで送信したりできます。 "new File"を使用して画像を読み込もうとしましたが、Flutterでエラーが発生しました。質問して検索すると、rootBundleを使用してFlutterに画像を読み込むことができるというヒントが得られました。私はそうしました、そして私はこれを以下のエラーで受け取りました。
[エラー:topaz/lib/tonic/logging/Dart_error.cc(16)]未処理の例外:アセットを読み込めません:packages/myAppName/assets/images/ReceiptRaw_1.jpg
プラグインは、単純なDartコンソールアプリを作成すると機能しますが、フラッターを使用してロードできませんでした。助けてください、
これはフラッターコードです:
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);
}
これはダートコンソールコードです:
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);
}
pdate-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());
pdate-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
を含める必要があります
///アセットセクションで指定します:
///
///アセット:/// --packages/fancy_backgrounds/backgrounds/background1.png ///
///lib/
が暗示されますなので、アセットパスに含めないでください。
@GünterZöchbauerの助けを借りて、私はついにそれを作りました。 StackOverflowメンバーへの私の小さな貢献。
// TODO:1-すべてをロード
Future _loadEverything() async {
await _requestAppDocumentsDirectory(); // TODO: 2 - GET APP DOCUMENTS DIRECTORY
_dekontExist = await makeReceiptImage(); // TODO: 3 - MAKE A RECEIPT
// Show the writen image
if (_dekontExist == true) {
setState(() {
newDekontImage = _appDocumentsDirectory + "/" + widget._currentUserReceiptNo + ".jpg";
imageOkay = true; // FOR - 4 - MAIN WIDGET BUILD
});
}
}
// TODO:2-アプリドキュメントディレクトリを取得
Future _requestAppDocumentsDirectory() async {
// I choose temp dir because I don’t want to write twice same Receipt
// Also when user close the app it will destroys the images
final _directory =
await getTemporaryDirectory(); //getApplicationDocumentsDirectory();
setState(() {
_appDocumentsDirectory = _directory.path;
});
}
// TODO:3-領収書を作成
Future<bool> makeReceiptImage() async {
// I use this as a template:
// 'packages/mayApp/assets/images/CapitalReceipt.jpg'
ByteData imageData = await rootBundle.load('packages/mayApp/assets/images/CapitalReceipt.jpg');
List<int> bytes = Uint8List.view(imageData.buffer);
Image _receiptImage = decodeImage(bytes);
// TODO: WRITE ON TO THE IMAGE
drawString(_receiptImage, arial_48, 440, 30, “Customer Receipt - Customer Name”, color: 0xFF000000);
// Write it to disk as a different jpeg
var new_jpeg = await encodeJpg(_receiptImage);
String newDekontImage = _appDocumentsDirectory + "/" + "${_currentUserReceiptNo}" + ".jpg";
await new File(newDekontImage).writeAsBytesSync(new_jpeg);
return true;
}
// TODO:4-メインウィジェットビルド
@override
Widget build(BuildContext context) {
capitalHeight = MediaQuery.of(context).size.height;
capitalWidth = MediaQuery.of(context).size.width;
if (imageOkay == true) {
return new Scaffold(
resizeToAvoidBottomPadding: true,
appBar: new AppBar(
title: new Text("Customer Receipt"),
backgroundColor: const Color(0xFF7CB342),
elevation: 0.0,
actions: <Widget>[
new Container(
padding: EdgeInsets.only(right: 10.0),
child: new Icon(Icons.mail),
)
],
),
body: new Column(
children: <Widget>[
new Padding(
padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),
child: new Center(
child: new Container(
width: capitalWidth,
height: capitalHeight / 2.3,
color: Colors.black54, //capitalLightGreen,
child: new Container(
width: capitalWidth - 20.0,
height: capitalHeight / 2.3,
child: Image.file(File('$newDekontImage')),
)
),
)
),
],
),
);
} else {
return new Scaffold(
resizeToAvoidBottomPadding: true,
appBar: new AppBar(
title: new Text("Customer Receipt"),
backgroundColor: const Color(0xFF7CB342),
elevation: 0.0,
actions: <Widget>[
new Container(
padding: EdgeInsets.only(right: 10.0),
child: new Icon(Icons.mail),
)
],
),
body: new Center(
child: new CircularProgressIndicator(),
));
}
}