Flutter图片裁剪插件crop_image的使用
Flutter图片裁剪插件crop_image
的使用
crop_image
是一个用于Flutter的图片裁剪插件,它提供了经典的移动和桌面图像裁剪器的用户体验,并且完全用Dart编写,因此不依赖于任何特定平台的包。这意味着它可以运行在所有支持Flutter的平台上:移动端、Web端和桌面端。
以下是关于如何使用这个插件的详细指南和一个完整的示例demo。
设置与配置
首先,在你的项目中添加crop_image
依赖:
dependencies:
crop_image: ^1.0.0 # 确保使用最新版本
然后运行flutter pub get
来安装依赖。
示例代码
下面是一个完整的示例代码,展示了如何使用CropImage
widget进行图片裁剪。
import 'package:crop_image/crop_image.dart';
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Crop Image Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const MyHomePage(title: 'Crop Image Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
final String title;
const MyHomePage({Key? key, required this.title}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final controller = CropController(
aspectRatio: 0.7,
defaultCrop: const Rect.fromLTRB(0.1, 0.1, 0.9, 0.9),
);
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: CropImage(
controller: controller,
image: Image.asset('assets/08272011229.jpg'),
paddingSize: 25.0,
alwaysMove: true,
minimumImageSize: 500,
maximumImageSize: 500,
),
),
bottomNavigationBar: _buildButtons(),
);
Widget _buildButtons() => Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
IconButton(
icon: const Icon(Icons.close),
onPressed: () {
controller.rotation = CropRotation.up;
controller.crop = const Rect.fromLTRB(0.1, 0.1, 0.9, 0.9);
controller.aspectRatio = 1.0;
},
),
IconButton(
icon: const Icon(Icons.aspect_ratio),
onPressed: _aspectRatios,
),
IconButton(
icon: const Icon(Icons.rotate_90_degrees_ccw_outlined),
onPressed: _rotateLeft,
),
IconButton(
icon: const Icon(Icons.rotate_90_degrees_cw_outlined),
onPressed: _rotateRight,
),
TextButton(
onPressed: _finished,
child: const Text('Done'),
),
],
);
Future<void> _aspectRatios() async {
final value = await showDialog<double>(
context: context,
builder: (context) {
return SimpleDialog(
title: const Text('Select aspect ratio'),
children: [
// 特殊情况:无宽高比
SimpleDialogOption(
onPressed: () => Navigator.pop(context, -1.0),
child: const Text('free'),
),
SimpleDialogOption(
onPressed: () => Navigator.pop(context, 1.0),
child: const Text('square'),
),
SimpleDialogOption(
onPressed: () => Navigator.pop(context, 2.0),
child: const Text('2:1'),
),
SimpleDialogOption(
onPressed: () => Navigator.pop(context, 1 / 2),
child: const Text('1:2'),
),
SimpleDialogOption(
onPressed: () => Navigator.pop(context, 4.0 / 3.0),
child: const Text('4:3'),
),
SimpleDialogOption(
onPressed: () => Navigator.pop(context, 16.0 / 9.0),
child: const Text('16:9'),
),
],
);
},
);
if (value != null) {
controller.aspectRatio = value == -1 ? null : value;
controller.crop = const Rect.fromLTRB(0.1, 0.1, 0.9, 0.9);
}
}
Future<void> _rotateLeft() async => controller.rotateLeft();
Future<void> _rotateRight() async => controller.rotateRight();
Future<void> _finished() async {
final image = await controller.croppedImage();
if (mounted)
await showDialog<bool>(
context: context,
builder: (context) {
return SimpleDialog(
contentPadding: const EdgeInsets.all(6.0),
titlePadding: const EdgeInsets.all(8.0),
title: const Text('Cropped image'),
children: [
Text('relative: ${controller.crop}'),
Text('pixels: ${controller.cropSize}'),
const SizedBox(height: 5),
image,
TextButton(
onPressed: () => Navigator.pop(context, true),
child: const Text('OK'),
),
],
);
},
);
}
}
关键点说明
- 控制器 (
CropController
):用于设置初始值如宽高比 (aspectRatio
) 和默认裁剪区域 (defaultCrop
)。 - 裁剪区域 (
Rect
):表示裁剪区域的位置和大小,值在0到1之间。 - 旋转功能:通过
controller.rotateLeft()
和controller.rotateRight()
方法实现图片的旋转。 - 结果获取:可以通过
controller.croppedBitmap()
或controller.croppedImage()
方法获取裁剪后的图片。
以上就是关于Flutter插件crop_image
的基本介绍和使用示例。希望这些信息对你有所帮助!
更多关于Flutter图片裁剪插件crop_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图片裁剪插件crop_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用crop_image
插件进行图片裁剪的详细代码示例。
首先,你需要在pubspec.yaml
文件中添加crop_image
依赖:
dependencies:
flutter:
sdk: flutter
crop_image: ^0.1.0 # 请注意版本号,根据实际情况更新到最新版本
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤实现图片裁剪功能。
1. 导入必要的包
在你的Dart文件中,导入crop_image
包:
import 'package:crop_image/crop_image.dart';
import 'package:image_picker/image_picker.dart'; // 通常与crop_image一起使用,用于选择图片
2. 配置ImagePicker和CropImage
配置ImagePicker
和CropImage
实例:
final ImagePicker _picker = ImagePicker();
final CropImage _cropImage = CropImage();
3. 选择图片并裁剪
实现一个函数来选择图片并进行裁剪:
Future<void> _pickAndCropImage() async {
// 选择图片
final PickedFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);
if (pickedFile == null) return;
// 裁剪图片
final File? croppedFile = await _cropImage.cropImage(
sourcePath: pickedFile.path,
aspectRatioPresets: [
CropAspectRatioPreset.square,
CropAspectRatioPreset.ratio3x2,
CropAspectRatioPreset.original,
CropAspectRatioPreset.ratio4x3,
CropAspectRatioPreset.ratio16x9
],
androidUiSettings: AndroidUiSettings(
toolbarTitle: 'Cropper',
toolbarColor: Colors.deepOrange,
toolbarWidgetColor: Colors.white,
initAspectRatio: CropAspectRatioPreset.original,
lockAspectRatio: false,
),
iosUiSettings: IOSUiSettings(
minimumAspectRatio: 1.0,
),
);
if (croppedFile == null) return;
// 显示裁剪后的图片
// 这里假设你有一个Image.file()组件来显示图片
setState(() {
_croppedImagePath = croppedFile.path;
});
}
4. 在UI中调用该函数
在你的UI组件中,比如一个按钮,调用_pickAndCropImage
函数:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? _croppedImagePath;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Image Crop Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextButton(
onPressed: _pickAndCropImage,
child: Text('Pick and Crop Image'),
),
if (_croppedImagePath != null)
Image.file(File(_croppedImagePath!)),
],
),
),
);
}
}
5. 运行你的应用
现在,你可以运行你的Flutter应用,点击按钮选择图片并进行裁剪,然后显示裁剪后的图片。
这个示例演示了如何使用crop_image
插件来选择和裁剪图片,并展示裁剪后的结果。你可以根据需要调整UI和裁剪设置。