Flutter头像裁剪插件head_image_cropper的使用
Flutter头像裁剪插件head_image_cropper的使用
使用基于canvas撸的一个 Flutter头像裁剪控件。
待办事项
- TODO: 单指移动,双指移动、缩放、旋转
- TODO: 左键移动
- TODO: 滚轮旋转
- TODO: 左键+滚轮缩放
属性
backBoxSize
背景方格大小,默认值:10backBoxColor0
背景方格颜色0,默认值:Colors.grey
backBoxColor1
背景方格颜色1,默认值:Colors.white
outWidth
输出图片宽度,默认值:256outHeight
输出图片高度,默认值:256maskColor
蒙板颜色,默认值:#00000080
maskPadding
蒙板内边距,默认值:20lineWidth
预览框线宽,默认值:3lineColor
预览框颜色,默认值:Colors.white
isArc
是否是圆形,默认值:trueround
预览框圆角,默认值:8limitations
限制位置和尺寸,默认值:falseimage
输入图片源
方法
outImage()
返回裁剪后的图片
使用
在pubspec.yaml
文件中添加:
dependencies:
head_image_cropper: ^3.0.0
样例
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:head_image_cropper/head_image_cropper.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
);
}
}
class Home extends StatefulWidget {
[@override](/user/override)
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
var _controller = CropperController();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: <Widget>[
FlatButton(
child: Text("保存"),
onPressed: () {
_controller.outImage()?.then((image) async {
// 保存或上传代码
var bytes = (await (image.toByteData(format: ImageByteFormat.png)))!.buffer.asUint8List();
Navigator.of(context).push(MaterialPageRoute(builder: (context) {
return ShowImage(
data: bytes,
);
}));
// 保存到文件
// File("path").writeAsBytesSync(bytes);
});
},
)
],
),
body: Container(
padding: EdgeInsets.all(50),
child: CropperImage(
AssetImage("images/test.webp"), // 替换为你的图片路径
controller: _controller,
),
),
);
}
}
class ShowImage extends StatefulWidget {
final Uint8List data;
const ShowImage({Key key, this.data}) : super(key: key);
[@override](/user/override)
_ShowImageState createState() => _ShowImageState();
}
class _ShowImageState extends State<ShowImage> {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("裁剪效果"),
),
body: Image.memory(widget.data),
);
}
}
更多关于Flutter头像裁剪插件head_image_cropper的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter头像裁剪插件head_image_cropper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
head_image_cropper
是一个用于 Flutter 的头像裁剪插件,它允许用户从图库中选择图片或拍摄新照片,并进行裁剪以作为头像。以下是使用 head_image_cropper
插件的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 head_image_cropper
插件的依赖:
dependencies:
flutter:
sdk: flutter
head_image_cropper: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 head_image_cropper
插件:
import 'package:head_image_cropper/head_image_cropper.dart';
3. 使用插件进行头像裁剪
你可以使用 HeadImageCropper.cropImage
方法来裁剪图片。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:head_image_cropper/head_image_cropper.dart';
import 'package:image_picker/image_picker.dart';
class AvatarCropPage extends StatefulWidget {
[@override](/user/override)
_AvatarCropPageState createState() => _AvatarCropPageState();
}
class _AvatarCropPageState extends State<AvatarCropPage> {
ImageProvider? _image;
Future<void> _cropImage() async {
final ImagePicker _picker = ImagePicker();
final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);
if (pickedFile != null) {
// 使用 head_image_cropper 进行裁剪
final croppedFile = await HeadImageCropper.cropImage(
filePath: pickedFile.path,
circularShape: true, // 是否裁剪为圆形
);
if (croppedFile != null) {
setState(() {
_image = FileImage(croppedFile);
});
}
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('头像裁剪'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_image != null)
CircleAvatar(
backgroundImage: _image,
radius: 50,
)
else
Text('未选择图片'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _cropImage,
child: Text('选择并裁剪图片'),
),
],
),
),
);
}
}