Flutter图片裁剪插件crop_image的使用

发布于 1周前 作者 sinazl 来自 Flutter

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

1 回复

更多关于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

配置ImagePickerCropImage实例:

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和裁剪设置。

回到顶部