flutter_image_perspective_crop 0.0.3
flutter_image_perspective_crop: ^0.0.3 copied to clipboard
Flutter perspective crop editor with draggable handles, magnifier, controller, and pure Dart processing.
flutter_image_perspective_crop #
一个支持透视裁剪的 Flutter 组件 #
A Flutter package for perspective crop editing with draggable corner and edge handles, fixed reference guides, magnifier preview, external controller support, and pure Dart perspective crop output. 一个 Flutter 包,提供可拖拽的角点/边中点、固定参考辅助线、拖拽放大镜、外部控制器,以及纯 Dart 实现的透视裁剪输出。
Features #
功能特性 #
- Perspective crop editor based on
Uint8List - 基于
Uint8List的透视裁剪编辑器 - 4 corner handles and 4 edge-center handles
- 4 个角点 + 4 个边中点控制手柄
- Fixed reference guide lines inside the displayed image area
- 显示区域内的固定参考辅助线
- Magnifier preview while dragging
- 拖拽时显示放大镜预览
- External control via
ImagePerspectiveCropController - 通过
ImagePerspectiveCropController支持外部控制 - Customizable handles, overlays, action buttons, and bottom bar
- 控制点、叠加层、动作按钮、底部栏均可自定义
- Streaming completion events (processing/startSend/sending/complete/error) to avoid UI freeze on large images
- 支持流式完成事件(processing/startSend/sending/complete/error),大图时避免 UI 卡顿
Getting started #
快速开始 #
Add the dependency in your pubspec.yaml:
在 pubspec.yaml 中添加依赖:
dependencies:
flutter_image_perspective_crop: ^0.0.3
Then import it: 然后在代码中引入:
import 'package:flutter_image_perspective_crop/flutter_image_perspective_crop.dart';
Usage #
使用方法 #
Basic usage (streaming events) #
最简单用法(流式事件) #
final List<int> sinkBytes = <int>[];
ImagePerspectiveCrop(
image: state.imageBytes, // 必传 only required
onCloseRequested: () {},
onCompleted: (PerspectiveCropResult event) async {
switch (event.status) {
case PerspectiveCropStatus.processing:
// show loading
break;
case PerspectiveCropStatus.startSend:
sinkBytes.clear();
break;
case PerspectiveCropStatus.sending:
if (event.chunk != null) sinkBytes.addAll(event.chunk!);
break;
case PerspectiveCropStatus.complete:
final Uint8List bytes = Uint8List.fromList(sinkBytes);
debugPrint('final bytes: ${bytes.length}, src: ${event.imageWidth}x${event.imageHeight}');
break;
case PerspectiveCropStatus.error:
debugPrint('error: ${event.errorMessage}');
break;
}
},
)
Controller + custom button #
使用 controller + 自定义按钮 #
final ImagePerspectiveCropController _controller = ImagePerspectiveCropController();
final List<int> sinkBytes = <int>[];
@override
void initState() {
super.initState();
_controller.onCompleted((PerspectiveCropResult event) async {
switch (event.status) {
case PerspectiveCropStatus.processing:
break;
case PerspectiveCropStatus.startSend:
sinkBytes.clear();
break;
case PerspectiveCropStatus.sending:
if (event.chunk != null) sinkBytes.addAll(event.chunk!);
break;
case PerspectiveCropStatus.complete:
final Uint8List bytes = Uint8List.fromList(sinkBytes);
debugPrint('controller bytes: ${bytes.length}');
break;
case PerspectiveCropStatus.error:
debugPrint('error: ${event.errorMessage}');
break;
}
});
}
// In your button
await _controller.complete();
// Widget
ImagePerspectiveCrop(
image: state.imageBytes,
controller: _controller,
builders: ImagePerspectiveCropBuilders(
bottomBarWithControllerBuilder: (
BuildContext context,
ImagePerspectiveCropController controller,
Widget closeButton,
Widget switchButton,
Widget completeButton,
) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
closeButton,
switchButton,
ElevatedButton(
onPressed: () async {
await controller.complete();
},
child: const Text('Done'),
),
],
);
},
),
onCompleted: (_) async {}, // 可留空,主监听用 controller
)
Customization #
自定义能力 #
ImagePerspectiveCropBuilders currently supports customizing:
ImagePerspectiveCropBuilders 目前支持自定义:
- Close button
- 关闭按钮
- Switch button
- 切换按钮
- Complete button
- 完成按钮
- Handle widgets
- 控制点样式
- Grid overlay wrapper
- 网格叠加包装
- Line overlay wrapper
- 边框线叠加包装
- Magnifier wrapper
- 放大镜包装
- Bottom bar
- 底部栏
- Bottom bar with controller
- 带 controller 的底部栏
ImagePerspectiveCropStyle can be used to customize colors, handle size, line style, grid style, magnifier style, and action bar style.
ImagePerspectiveCropStyle 可用于自定义颜色、控制点尺寸、边框线样式、网格样式、放大镜样式、底部栏样式。
License #
许可证 #
MIT