firebase - flutter 和 Firebase : Compression before

我想将用户在我的应用中选择的照片发送到 Firebase 存储。我有一个简单的类,其属性 _imageFile 设置如下:

File _imageFile;

_getImage() async {
    var fileName = await ImagePicker.pickImage();
    setState(() {
        _imageFile = fileName;
    });
}

之后我用这个代码发送照片:

final String rand1 = "${new Random().nextInt(10000)}";
final String rand2 = "${new Random().nextInt(10000)}";
final String rand3 = "${new Random().nextInt(10000)}";
final StorageReference ref = FirebaseStorage.instance.ref().child('${rand1}_${rand2}_${rand3}.jpg');
final StorageUploadTask uploadTask = ref.put(_imageFile);
final Uri downloadUrl = (await uploadTask.future).downloadUrl;
print(downloadUrl);

问题是照片通常非常大。 Flutter/Dart 中是否有任何方法可以在上传前压缩和调整照片大小?我可以接受质量损失。

最佳答案

2020 年 6 月 5 日 - 更新

image_picker插件现在支持 imageQuality 参数。你可以做类似的事情

ImagePicker imagePicker = ImagePicker();
PickedFile compressedImage = await imagePicker.getImage(
  source: ImageSource.camera,
  imageQuality: 85,
);

旧答案

或者如果您想不使用使用 ImagePicker

压缩图像

我遇到了这个问题,并且能够使用 Dart image package 完成压缩/调整大小连同 path provider .你可以看 Dart image api和 examples寻求其他方式和更多帮助。

这就是我所做的:

import 'package:image/image.dart' as Im;
import 'package:path_provider/path_provider.dart';
import 'dart:math' as Math;

void compressImage() async {
  File imageFile = await ImagePicker.pickImage();
  final tempDir = await getTemporaryDirectory();
  final path = tempDir.path;
  int rand = new Math.Random().nextInt(10000);

  Im.Image image = Im.decodeImage(imageFile.readAsBytesSync());
  Im.Image smallerImage = Im.copyResize(image, 500); // choose the size here, it will maintain aspect ratio
  
  var compressedImage = new File('$path/img_$rand.jpg')..writeAsBytesSync(Im.encodeJpg(image, quality: 85));
}

然后我将 compressedImage 上传到 Firebase 存储。您可以使用 quality 属性调整保存 jpg 的质量,在我的例子中,我选择了 85(满分 100)。

希望这会有所帮助!如果您有任何问题,请告诉我。

关于firebase - flutter 和 Firebase : Compression before upload image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46515679/

相关文章:

flutter - 如何检查滚动位置是在 ListView 的顶部还是底部?

dart - 如何在 Flutter 中调度后台任务?

dart - 如何在 ListView 内 flutter 中创建一行可滚动的文本框或小部件?

android - 如何在单击推送通知时打开特定屏幕以进行 flutter

dart - Flutter:是否有可能创建 App Widgets (Android) 和 Tod

mobile - 是否可以在 Linux 虚拟机上使用 Flutter 开发 iOS 应用程序?

flutter - 如何为 flutter 添加自定义颜色?

Flutter - 如何更改 TextField 提示颜色?

dart - 有没有办法在 InitState 方法上加载异步数据?

dart - Flutter 图像预加载