Flutter图片裁剪插件flutter_flappy_crop的使用

Flutter图片裁剪插件flutter_flappy_crop的使用

特性

  • 按比例裁剪图像。
  • 通过手势缩放裁剪区域。
  • 可拖动的裁剪区域。

开始使用

pubspec.yaml 文件中添加 flutter_flappy_crop 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_flappy_crop: ^版本号

然后运行 flutter pub get 来安装依赖。

使用方法

创建控制器

首先创建一个 CropImageViewController 控制器,并加载要裁剪的图像。

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  CropImageViewController? _controller;
  Uint8List? croppedImage;

  @override
  void initState() {
    loadImageFromAssets("assets/bg-hero-01.jpg").then((value) {
      _controller = CropImageViewController(image: value);
      if (mounted) {
        setState(() {});
      }
    });
    super.initState();
  }

  // 加载图像资源
  static Future<ui.Image?> loadImageFromAssets(String path) async {
    assets.ImageStream stream = assets.AssetImage(path, bundle: getAssetBundle()).resolve(assets.ImageConfiguration.empty);
    Completer<ui.Image?> completer = Completer<ui.Image?>();
    assets.ImageStreamListener listener = assets.ImageStreamListener(
      (assets.ImageInfo frame, bool synchronousCall) {
        final ui.Image image = frame.image;
        if (!completer.isCompleted) {
          completer.complete(image);
        }
      },
      onError: (Object exception, StackTrace? stackTrace) {
        if (!completer.isCompleted) {
          completer.complete(null);
        }
      },
    );
    completer.future.then((value) {
      stream.removeListener(listener);
    });
    stream.addListener(listener);
    return completer.future;
  }

  @override
  Widget build(BuildContext context) {
    return Material(
      color: Colors.black,
      child: Stack(
        children: [
          _controller == null
              ? const SizedBox()
              : CropImageView(
                  controller: _controller!,
                  ratio: 1.0,
                ),
          Align(
            alignment: Alignment.topCenter,
            child: croppedImage != null
                ? Image.memory(
                    croppedImage!,
                    width: 200,
                    height: 200,
                    fit: BoxFit.contain,
                  )
                : const SizedBox(),
          ),
          Align(
            alignment: Alignment.bottomCenter,
            child: GestureDetector(
              behavior: HitTestBehavior.translucent,
              onTap: () {
                _controller?.cropImage().then((value) {
                  croppedImage = value;
                  setState(() {});
                });
              },
              child: Container(
                width: 100,
                height: 30,
                margin: const EdgeInsets.fromLTRB(0, 0, 0, 50),
                decoration: BoxDecoration(
                    color: Colors.red, borderRadius: BorderRadius.circular(15)),
                alignment: Alignment.center,
                child: const Text(
                  'Crop',
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 15,
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

创建裁剪视图

使用 CropImageView 将裁剪控制器传递给视图。

CropImageView(
  controller: _controller!,
  ratio: 1.0,
)

裁剪图像

点击按钮触发裁剪操作并获取裁剪后的图像数据。

GestureDetector(
  behavior: HitTestBehavior.translucent,
  onTap: () {
    _controller?.cropImage().then((value) {
      croppedImage = value;
      setState(() {});
    });
  },
  child: Container(
    width: 100,
    height: 30,
    margin: const EdgeInsets.fromLTRB(0, 0, 0, 50),
    decoration: BoxDecoration(
        color: Colors.red, borderRadius: BorderRadius.circular(15)),
    alignment: Alignment.center,
    child: const Text(
      'Crop',
      style: TextStyle(
        color: Colors.white,
        fontSize: 15,
      ),
    ),
  ),
)

更多关于Flutter图片裁剪插件flutter_flappy_crop的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片裁剪插件flutter_flappy_crop的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter图片裁剪插件flutter_flappy_crop的代码示例。这个示例将展示如何集成和使用这个插件来进行图片裁剪。

首先,你需要在pubspec.yaml文件中添加flutter_flappy_crop依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_flappy_crop: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

接下来是代码示例:

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:flutter_flappy_crop/flutter_flappy_crop.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Image Crop Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  File? _imageFile;
  CroppedFile? _croppedImageFile;

  final ImagePicker _picker = ImagePicker();

  Future<void> _pickImage(ImageSource source) async {
    final pickedFile = await _picker.pickImage(source: source);

    if (pickedFile != null) {
      setState(() {
        _imageFile = File(pickedFile.path);
      });

      // 打开裁剪页面
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => CropPage(image: _imageFile!),
        ),
      ).then((value) {
        // 获取裁剪后的图片
        setState(() {
          _croppedImageFile = value;
        });
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Crop Example'),
      ),
      body: Center(
        child: _imageFile == null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('No image selected.'),
                  SizedBox(height: 20),
                  ElevatedButton(
                    onPressed: () => _pickImage(ImageSource.gallery),
                    child: Text('Pick Image from Gallery'),
                  ),
                  SizedBox(height: 10),
                  ElevatedButton(
                    onPressed: () => _pickImage(ImageSource.camera),
                    child: Text('Pick Image from Camera'),
                  ),
                ],
              )
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Image.file(_imageFile!),
                  SizedBox(height: 20),
                  _croppedImageFile == null
                      ? Text('No cropped image available.')
                      : Image.file(_croppedImageFile!.file),
                ],
              ),
      ),
    );
  }
}

class CropPage extends StatefulWidget {
  final File image;

  CropPage({required this.image});

  @override
  _CropPageState createState() => _CropPageState();
}

class _CropPageState extends State<CropPage> {
  late CropController _cropController;

  @override
  void initState() {
    super.initState();
    _cropController = CropController(
      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,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Crop Image'),
      ),
      body: Center(
        child: ImageCropper(
          sourcePath: widget.image.path,
          cropperController: _cropController,
          onCroppedImage: (CroppedFile croppedFile) {
            Navigator.pop(context, croppedFile);
          },
        ),
      ),
    );
  }
}

说明

  1. 依赖添加:首先在pubspec.yaml中添加flutter_flappy_cropimage_picker依赖。
  2. 主应用MyAppMyHomePage是主应用和主页,包含选择图片和显示图片的逻辑。
  3. 图片选择_pickImage方法用于从相册或相机选择图片,并在选择后打开裁剪页面。
  4. 裁剪页面CropPage是一个新的页面,使用ImageCropper小部件进行图片裁剪。
  5. 裁剪控制器CropController用于配置裁剪器的UI和行为,如预设的长宽比、工具栏颜色等。

这个示例展示了如何集成和使用flutter_flappy_crop插件进行图片裁剪。你可以根据需要进一步自定义和扩展这个示例。

回到顶部