web-dev-qa-db-ja.com

フラッターでrootBundleを使用して画像をロードする方法は?

私は画像プラグイン(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.jpglib/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/が暗示されますなので、アセットパスに含めないでください。

3
Nick

@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(),
          ));
    }
  }
1
Nick