颤振与振动;Firebase:上传图像前压缩
我想将用户在我的应用程序中选择的照片发送到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 = "
\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