颤振与振动;Firebase:上传图像前压缩

颤振与振动;Firebase:上传图像前压缩,firebase,dart,firebase-storage,flutter,Firebase,Dart,Firebase Storage,Flutter,我想将用户在我的应用程序中选择的照片发送到Firebase存储。我有一个属性为\u imageFile的简单类,其设置如下: File _imageFile; _getImage() async { var fileName = await ImagePicker.pickImage(); setState(() { _imageFile = fileName; }); } 之后,我发送类似以下代码的照片: final String rand1 = "

我想将用户在我的应用程序中选择的照片发送到Firebase存储。我有一个属性为
\u 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);
问题是照片往往很大。在上传前,在颤振/省道中是否有压缩和调整照片大小的方法?我可以接受质量损失。

该插件目前非常简单。添加一个选项来指定所选图像的所需大小/质量是很简单的。如果您这样做,请向我们发送拉取请求

2020年6月5日-更新 该插件现在支持
imageQuality
参数。你可以这样做

ImagePicker imagePicker = ImagePicker();
PickedFile compressedImage = await imagePicker.getImage(
  source: ImageSource.camera,
  imageQuality: 85,
);
旧答案 或者,如果要压缩图像而不使用
ImagePicker
我遇到了这个问题,并且能够用Dart和其他工具完成压缩/调整大小。您可以查看dart和其他方法以及更多帮助

以下是我所做的:

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)


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

以下代码是我使用相机拍摄图像并进行压缩的代码:

import 'dart:async' show Future;
import 'dart:io' show File;
import 'package:flutter/foundation.dart' show compute;
import 'package:flutter/material.dart' show BuildContext;
import 'package:image/image.dart' as Im;
import 'dart:math' as Math;
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart' show getTemporaryDirectory;

Future<File> takeCompressedPicture(BuildContext context) async {
  var _imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
  if (_imageFile == null) {
    return null;
  }

  // You can have a loading dialog here but don't forget to pop before return file;

  final tempDir = await getTemporaryDirectory();
  final rand = Math.Random().nextInt(10000);
  _CompressObject compressObject =
      _CompressObject(_imageFile, tempDir.path, rand);
  String filePath = await _compressImage(compressObject);
  print('new path: ' + filePath);
  File file = File(filePath);

  // Pop loading

  return file;
}

Future<String> _compressImage(_CompressObject object) async {
  return compute(_decodeImage, object);
}

String _decodeImage(_CompressObject object) {
  Im.Image image = Im.decodeImage(object.imageFile.readAsBytesSync());
  Im.Image smallerImage = Im.copyResize(
      image, 1024); // choose the size here, it will maintain aspect ratio
  var decodedImageFile = File(object.path + '/img_${object.rand}.jpg');
  decodedImageFile.writeAsBytesSync(Im.encodeJpg(smallerImage, quality: 85));
  return decodedImageFile.path;
}

class _CompressObject {
  File imageFile;
  String path;
  int rand;

  _CompressObject(this.imageFile, this.path, this.rand);
}

除了提到本机
库之外:

这是一个完全基于dart的压缩程序,带有隔离区,可以使压缩与多核CPU中的UI线程并行

您可能希望使用compute函数,这使使用隔离变得更简单:

使用插件并调用pick image函数作为

Future imageFile=ImagePicker.pickImage(来源:ImageSource.gallery,最大高度:200,最大宽度:200)

将maxHeight和maxWidth更改为所需的图像大小。

当我使用

软件包:image/image.dart

面临以下问题

  • 转换图像时显示空白页(压缩图像时可能需要很多过程)
  • 压缩后图像被拉伸,看起来不太好
然后使用下面的插件,同样工作良好,没有任何问题,甚至更快,我所期望的

https://github.com/btastic/flutter_native_image.git

上述链接中提供的步骤和方法。

您可以使用名为

//活动图像文件
文件imageFile;
//通过多媒体资料或照相机选择图像
Future\u pickImage(ImageSource)异步{
所选文件=等待ImagePicker.pickImage(源:源);
//压缩插件
File compressedImage=wait-imagecompress.compressAndGetFile(
选定的路径,
选定的路径,
质量:50,
);
设置状态(){
_图像文件=压缩图像;
打印('compressedimagesize:${u imageFile.lengthSync()}');
});
}

瞧!压缩文件图像

由于您使用的是Firebase,一个选项是使用扩展名-调整图像大小。它为您提供了保留或删除原始映像的选项,并且非常易于安装和使用。

Update 2020“pickImage”已被弃用,不应使用。改用imagePicker.getImage()方法**

  ImagePicker picker = ImagePicker();
   PickedFile compressedImage = await imagePicker.getImage(
  source: ImageSource.camera,
  imageQuality: 80,
);
图像质量文档:

返回包装已拾取图像的PickedFile对象。这个 返回的PickedFile用于单个应用程序中 一场不要保存文件路径并跨会话使用它。这个 源参数控制图像的来源。这可能是 ImageSource.camera或ImageSource.gallery。iOS支持的地方 安卓8及以下版本的HEIC图像则不然。仅限Android 9及以上版本 支持HEIC图像(如果在尺寸修改之外使用),为 其用法解释如下。如果指定,图像将位于 最大宽度最宽,最大高度最高。否则图像将被删除 以其原始宽度和高度返回。imageQuality参数 修改图像的质量,范围为0-100,其中100是 原始/最高质量。如果imageQuality为null,则具有 原质量将被退回。压缩仅在以下情况下受支持: 某些图像类型,如JPEG和Android PNG和WebP上的图像。如果 拾取的图像不支持压缩,警告 消息将被记录。使用preferredCameraDevice指定 源为ImageSource.camera时要使用的相机。这个 当源为ImageSource.gallery时,将忽略preferredCameraDevice。 如果屏幕上不支持所选相机,则也会忽略此选项 装置。默认为CameraDevice.rear。请注意,Android没有 文件化参数,用于指定是前部还是后部 摄像头应打开,但此功能不能保证在 安卓设备。在安卓系统中,主活动可以被销毁 各种原因。如果发生这种情况,结果将在这方面失去 呼叫然后,当应用程序重新启动到时,您可以调用getLostData 找回丢失的数据


有很多解决方案:

Image.asset('assets/kab1.png', filterQuality: FilterQuality.high,), 
使用软件包: 您可以使用ImagePicker的内置
imageQuality
属性来压缩图像。此属性的值介于
0
100
之间,表示原始图像质量的百分比

首先,在pubspec.yaml文件中添加
image\u picker
作为依赖项

用法

  File _image;

  Future getImage() async {
    var image = await ImagePicker.pickImage(
        source: ImageSource.gallery,  
                imageQuality: 25,
    );

    setState(() {
      _image = image;
    });
  }
这种方法的优点是它嵌入到 image_picker软件包,因此非常易于使用

您还可以通过图像小部件调整质量。 使用
filterQuality
设置图像的
filterQuality

示例:

Image.asset('assets/kab1.png', filterQuality: FilterQuality.high,), 
这些属性存在于
AssetImage
NetworkImage
FileImage
MemoryImage

您也可以简单地调整图像大小(调整图像大小)
  ImagePicker picker = ImagePicker();
   PickedFile compressedImage = await imagePicker.getImage(
  source: ImageSource.camera,
  imageQuality: 80,
);
  File _image;

  Future getImage() async {
    var image = await ImagePicker.pickImage(
        source: ImageSource.gallery,  
                imageQuality: 25,
    );

    setState(() {
      _image = image;
    });
  }
Image.asset('assets/kab1.png', filterQuality: FilterQuality.high,), 
//Compressing Image
    File compressedImg = await FlutterNativeImage.compressImage(
      _image.path,
      quality: 70,
    );
//Compressing Image