Как использовать средство выбора нескольких изображений с Flutter Image Compress?

#firebase #flutter

# #firebase #флаттер

Вопрос:

Я успешно внедрил средство выбора нескольких изображений flutter. Но я хочу снизить его качество. Я видел потоки, в которых говорилось, что используется библиотека flutter_Image_compress. Но я, похоже, не понимаю, как это реализовать с помощью средства выбора нескольких изображений.

Средство выбора нескольких изображений

 Future<List<Asset>> loadAssets() async {
List<Asset> resultList = List<Asset>();
String error = "No error Detected";

try {
  resultList = await MultiImagePicker.pickImages(
    maxImages: 10,
    enableCamera: true,
    selectedAssets: images,
    cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
    materialOptions: MaterialOptions(
      actionBarColor: "#abcdef",
      actionBarTitle: "Upload Image",
      allViewTitle: "All Photos",
      useDetailsView: false,
      selectCircleStrokeColor: "#000000",
    ),
  );

  showInSnackBar("loading images");
  print(resultList.length);
  print((await resultList[0].getThumbByteData(122, 100)));
  print((await resultList[0].getByteData()));
  print((await resultList[0].metadata));
  print("loadAssets is called");

} on Exception catch (e) {
  error = e.toString();
  print(error);
}



if (!mounted){
  print("Not mounted");
}
else {
  setState(() {
    images = resultList;
    _error = error;
  });
}

return images;
 

}

Сжатие флаттерных изображений

   void compressImage(File file) async {
    final filePath = file.absolute.path;
    final lastIndex = filePath.lastIndexOf(new RegExp(r'.jp'));
    final splitted = filePath.substring(0, (lastIndex));
    final outPath = "${splitted}_out${filePath.substring(lastIndex)}";

    final compressedImage = await FlutterImageCompress.compressAndGetFile(
        filePath,
        outPath,
        minWidth: 1000,
        minHeight: 1000,
        quality: 70);
  }
 

Это то, что я сделал

 Future<List<Asset>> loadAssets() async {
    List<Asset> resultList = List<Asset>();
    List<File> fileImageArray=[];
    String error = "No error Detected";

    try {

      resultList = await MultiImagePicker.pickImages(
        maxImages: 10,
        enableCamera: true,
        selectedAssets: images,
        cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
        materialOptions: MaterialOptions(
          actionBarColor: "#abcdef",
          actionBarTitle: "Upload Image",
          allViewTitle: "All Photos",
          useDetailsView: false,
          selectCircleStrokeColor: "#000000",
        ),

      );
      resultList.forEach((imageAsset) async {
        final filePath = await FlutterAbsolutePath.getAbsolutePath(imageAsset.identifier);

        File tempFile = File(filePath);
        if (tempFile.existsSync()) {
          fileImageArray.add(tempFile);
        }
      });
compressImage(fileImageArray);

      showInSnackBar("loading images");
      print(resultList.length);
      print((await resultList[0].getThumbByteData(122, 100)));
      print((await resultList[0].getByteData()));
      print((await resultList[0].metadata));
      print("loadAssets is called");

    } on Exception catch (e) {
      error = e.toString();
      print(error);
    }
    if (!mounted){
      print("Not mounted");
    }
    else {
      setState(() {
        print('Presed1');
        images = resultList;
        _error = error;
      });
    }

    return images;
  }

  void compressImage(fileImageArray) async {
    for(var i in fileImageArray){
      final filePath = i.absolute.path;
      final lastIndex = i.lastIndexOf(new RegExp(r'.jp'));
      final splitted = i.substring(0, (lastIndex));
      final outPath = "${splitted}_out${filePath.substring(lastIndex)}";

      final compressedImage = await FlutterImageCompress.compressAndGetFile(
          filePath,
          outPath,
          minWidth: 240,
          minHeight: 240,
          quality: 5);
      setState(() {
   print('pressed2');
        fileImageArray= compressedImage;
      });
    }
 

}

 onPressed: () async {
                        List<Asset> asst = await loadAssets();
                        if (asst.length == 0) {
                          showAlert("No images selected");
                        }
                        SizedBox(height: 10,);

                        showInSnackBar('Images Successfully loaded');
                        //                 SnackBar snackbar = SnackBar(content: Text('Please wait, we are uploading'));
                        //_scaffoldKey.currentState.showSnackBar(new SnackBar(content: new Text(value)));
                      }
 

Комментарии:

1. сначала возьмите изображение с помощью средства выбора нескольких изображений. затем вам нужно преобразовать ресурс в файл.

2. Затем предоставьте это вашей функции compressedImage

3. пожалуйста, @AbhishekGhaskata проверьте это сейчас. Я обновил код. Он по-прежнему не сжимает размер изображения. Что я делаю не так, сэр?

4. вам нужно выполнить итерацию fileImageArray через цикл for

5. @AbhishekGhaskata Бхай. Пожалуйста, помогите мне. Не знаю, как его повторить: ( Пытаюсь со вчерашнего дня:(

Ответ №1:

Пожалуйста, используйте это для преобразования списка в список

 List<File> fileImageArray=[];
...
resultList.forEach((imageAsset) async {
    final filePath = await FlutterAbsolutePath.getAbsolutePath(imageAsset.identifier);
    
    File tempFile = File(filePath);
    if (tempFile.existsSync()) {
        fileImageArray.add(tempFile);
    }
});

 

Дайте fileImageArray методу compressImage.
и повторите его с помощью цикла for

  void compressImage(fileImageArray) async {
    for(var i in fileImageArray){
    final filePath = i.absolute.path;
    final lastIndex = i.lastIndexOf(new RegExp(r'.jp'));
    final splitted = i.substring(0, (lastIndex));
    final outPath = "${splitted}_out${filePath.substring(lastIndex)}";

    final compressedImage = await FlutterImageCompress.compressAndGetFile(
        filePath,
        outPath,
        minWidth: 240,
        minHeight: 240,
        quality: 5);
    setState(() {
      fileImageArray= compressedImage;
    });
   }
  }
 

Комментарии:

1. Сначала вам нужно преобразовать List<Asset> в List<File>, а затем предоставить метод compressImage

2. можете ли вы, пожалуйста, сказать мне, каким должен быть srcPath и целевой путь, если я загружу все свои файлы в firebase?

3. Здесь есть очень хорошие документы из firebase firebase.flutter.dev/docs/storage/ usage , которые могут вам помочь