Flutter图片压缩插件flutter_image_compression的使用
Flutter图片压缩插件flutter_image_compression的使用
本项目是一个用于Flutter的插件项目,它包含针对Android和/或iOS平台的特定实现代码。
开始使用
对于希望开始进行Flutter开发的开发者,可以查看官方文档,其中提供了教程、示例、移动开发指导以及完整的API参考。
使用示例
以下是flutter_image_compression
插件的基本使用示例。该示例展示了如何从相册选择一张图片并对其进行压缩。
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_image_compression/flutter_image_compression.dart';
void main() {
runApp(const MaterialApp(home: MainPage()));
}
class MainPage extends StatefulWidget {
const MainPage({super.key});
[@override](/user/override)
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
Configuration config = const Configuration();
ImageFile? image;
ImageFile? imageOutput;
bool processing = false;
[@override](/user/override)
Widget build(BuildContext context) {
final buttonGallery = ElevatedButton.icon(
onPressed: handleOpenGallery,
icon: const Icon(Icons.photo_outlined),
label: const Text('Pick an Image'),
);
final buttonCompress = Padding(
padding: const EdgeInsets.all(16),
child: ElevatedButton.icon(
onPressed: handleCompressImage,
icon: const Icon(Icons.compress),
label: const Text('Compress Image'),
),
);
Widget body = Center(child: buttonGallery);
if (image != null) {
final inputImage = Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Image.memory(image!.rawBytes),
);
final inputImageSizeType = ListTile(
title: const Text('Image size-type :'),
subtitle: Text(
'${(image!.sizeInBytes / 1024 / 1024).toStringAsFixed(2)} MB - (${image!.width} x ${image!.height})'),
trailing: Text(image!.extension),
);
final inputImageName = ListTile(
title: const Text('Image name :'),
subtitle: Text(image!.fileName),
);
body = SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 0),
child: buttonGallery,
),
const ListTile(title: Text('INPUT IMAGE')),
inputImage,
inputImageSizeType,
inputImageName,
const Divider(),
const ListTile(title: Text('OUTPUT IMAGE')),
configOutputType,
configQuality,
nativeCompressorCheckBox,
buttonCompress,
processing
? const Padding(
padding: EdgeInsets.all(16.0),
child: LinearProgressIndicator(),
)
: const SizedBox.shrink(),
if (imageOutput != null && !processing)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Image.memory(imageOutput!.rawBytes),
),
if (imageOutput != null && !processing)
ListTile(
title: const Text('Image size-type :'),
subtitle: Text(
'${(imageOutput!.sizeInBytes / 1024 / 1024).toStringAsFixed(2)} MB - (${imageOutput!.width} x ${imageOutput!.height})'),
trailing: Text(imageOutput!.contentType ?? '-'),
),
],
),
);
}
return Scaffold(
appBar: AppBar(
title: const Text('Image Compression'),
),
body: body,
);
}
Widget get nativeCompressorCheckBox {
return CheckboxListTile(
title: const Text('Native compressor for JPG/PNG'),
value: config.useJpgPngNativeCompressor,
onChanged: (flag) {
setState(() {
config = Configuration(
outputType: config.outputType,
useJpgPngNativeCompressor: flag ?? false,
quality: config.quality,
);
});
},
);
}
Widget get configOutputType {
return ListTile(
title: const Text('Select output type'),
subtitle: Text(config.outputType.toString()),
trailing: PopupMenuButton<ImageOutputType>(
itemBuilder: (context) {
return ImageOutputType.values
.map((e) => PopupMenuItem(
value: e,
child: Text(e.toString()),
))
.toList();
},
onSelected: (outputType) {
setState(() {
config = Configuration(
outputType: outputType,
useJpgPngNativeCompressor: config.useJpgPngNativeCompressor,
quality: config.quality,
);
});
},
),
);
}
Widget get configQuality {
return ListTile(
title: Text('Select quality (${config.quality})'),
subtitle: Slider.adaptive(
value: config.quality.toDouble(),
divisions: 100,
min: 0,
max: 100,
label: config.quality.toString(),
onChanged: (value) {
setState(() {
config = Configuration(
outputType: config.outputType,
useJpgPngNativeCompressor: config.useJpgPngNativeCompressor,
quality: value.toInt(),
);
});
},
),
);
}
handleOpenGallery() async {
// final xFile = await flimer.pickImage(source: ImageSource.gallery);
// if (xFile != null) {
// final image = await xFile.asImageFile;
// setState(() {
// this.image = image;
// });
// }
}
handleCompressImage() async {
setState(() {
processing = true;
});
final param = ImageFileConfiguration(input: image!, config: config);
final output = await compressor.compress(param);
setState(() {
imageOutput = output;
processing = false;
});
}
}
更多关于Flutter图片压缩插件flutter_image_compression的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图片压缩插件flutter_image_compression的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_image_compression
是一个用于在 Flutter 应用中压缩图片的插件。它可以帮助你减少图片文件的大小,从而优化应用的性能,特别是在需要上传图片到服务器或存储到本地设备时。
以下是如何使用 flutter_image_compression
插件的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 flutter_image_compression
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_image_compression: ^2.0.0 # 请确保使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 flutter_image_compression
插件:
import 'package:flutter_image_compression/flutter_image_compression.dart';
3. 使用插件压缩图片
你可以使用 flutter_image_compression
来压缩图片。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:flutter_image_compression/flutter_image_compression.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
class ImageCompressionExample extends StatefulWidget {
@override
_ImageCompressionExampleState createState() => _ImageCompressionExampleState();
}
class _ImageCompressionExampleState extends State<ImageCompressionExample> {
File? _compressedImage;
Future<void> _pickAndCompressImage() async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(source: ImageSource.gallery);
if (pickedFile != null) {
final file = File(pickedFile.path);
// 压缩图片
final compressedFile = await FlutterImageCompression.compressAndGetFile(
file.absolute.path,
file.absolute.path + '_compressed.jpg', // 压缩后的文件路径
quality: 50, // 压缩质量,0-100
);
setState(() {
_compressedImage = compressedFile;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Image Compression Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (_compressedImage != null)
Image.file(_compressedImage!),
ElevatedButton(
onPressed: _pickAndCompressImage,
child: Text('Pick and Compress Image'),
),
],
),
),
);
}
}
void main() => runApp(MaterialApp(
home: ImageCompressionExample(),
));
4. 解释代码
- ImagePicker: 用于从设备中选择图片。
- FlutterImageCompression.compressAndGetFile: 这是
flutter_image_compression
插件的主要方法,用于压缩图片并返回压缩后的文件。- 第一个参数是原始图片的路径。
- 第二个参数是压缩后图片的保存路径。
quality
参数用于设置压缩质量,范围是 0 到 100,100 表示最高质量。
5. 运行应用
运行你的应用,点击按钮选择图片并查看压缩后的效果。
6. 其他功能
flutter_image_compression
还提供了其他一些功能,例如:
- 压缩为字节数组: 你可以使用
FlutterImageCompression.compressWithFile
将图片压缩为字节数组。 - 设置图片尺寸: 你可以通过
width
和height
参数来调整压缩后图片的尺寸。
final compressedFile = await FlutterImageCompression.compressAndGetFile(
file.absolute.path,
file.absolute.path + '_compressed.jpg',
quality: 50,
minWidth: 600, // 最小宽度
minHeight: 600, // 最小高度
);