Flutter图片裁剪插件image_cropper_custom的使用

简介

image_cropper_custom 是一个支持 Android、iOS 和 Web 的 Flutter 插件,用于裁剪图片。该插件基于三个不同的原生库(uCropTOCropViewControllercroppie),因此在不同平台上会呈现出不同的用户界面。

Image Cropper 并不直接在 Dart 代码中处理图片,而是通过平台通道(Platform Channel)暴露 Dart API,让 Flutter 应用程序可以与这三个强大的原生库通信以实现图片裁剪和旋转功能。因此,所有功劳归功于这些原生库。


使用步骤

以下是一个完整的示例,展示如何使用 image_cropper_custom 插件来裁剪图片。

1. 添加依赖

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

dependencies:
  image_cropper_custom: ^版本号

运行 flutter pub get 安装依赖。


2. 导入必要的包

在需要使用插件的文件中导入以下包:

import 'package:image_cropper_custom/image_cropper_custom.dart';
import 'package:image_picker/image_picker.dart';

3. 初始化图片选择器和裁剪器

创建一个按钮,点击后弹出图片选择器,并允许用户裁剪所选图片。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImageCropperExample(),
    );
  }
}

class ImageCropperExample extends StatefulWidget {
  [@override](/user/override)
  _ImageCropperExampleState createState() => _ImageCropperExampleState();
}

class _ImageCropperExampleState extends State<ImageCropperExample> {
  XFile? _imageFile;

  Future<void> _pickAndCropImage() async {
    // 打开相册或相机选择图片
    final XFile? pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery);
    
    if (pickedFile == null) return; // 用户取消了选择

    // 裁剪图片
    final croppedFile = await ImageCropper.cropImage(
      sourcePath: pickedFile.path,
      aspectRatioPresets: [
        CropAspectRatioPreset.square,
        CropAspectRatioPreset.ratio3x2,
        CropAspectRatioPreset.original,
      ],
      androidUiSettings: AndroidUiSettings(
        toolbarTitle: '裁剪图片',
        toolbarColor: Colors.deepOrange,
        toolbarWidgetColor: Colors.white,
        initAspectRatio: CropAspectRatioPreset.original,
        lockAspectRatio: false,
      ),
      iosUiSettings: IOSUiSettings(
        minimumAspectRatio: 1.0,
      ),
    );

    if (croppedFile != null) {
      setState(() {
        _imageFile = croppedFile;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Cropper Example'),
      ),
      body: Center(
        child: _imageFile != null
            ? Image.file(
                File(_imageFile!.path),
                width: 300,
                height: 300,
                fit: BoxFit.cover,
              )
            : Text('请选择并裁剪一张图片'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _pickAndCropImage,
        tooltip: '选择图片',
        child: Icon(Icons.add_a_photo),
      ),
    );
  }
}

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

1 回复

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


image_cropper_custom 是一个用于 Flutter 的图片裁剪插件,它允许用户从图库或相机中选择图片,并进行裁剪。这个插件是 image_cropper 的一个自定义版本,可能包含了一些额外的功能或修复。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  image_cropper_custom: ^1.0.0  # 请根据实际版本号进行替换

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

使用插件

  1. 导入插件

    在你的 Dart 文件中导入 image_cropper_custom 插件:

    import 'package:image_cropper_custom/image_cropper_custom.dart';
    
  2. 选择图片并进行裁剪

    你可以使用 ImageCropper.cropImage 方法来裁剪图片。以下是一个简单的示例:

    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    import 'package:image_cropper_custom/image_cropper_custom.dart';
    
    class ImageCropExample extends StatefulWidget {
      @override
      _ImageCropExampleState createState() => _ImageCropExampleState();
    }
    
    class _ImageCropExampleState extends State<ImageCropExample> {
      File? _imageFile;
    
      Future<void> _pickAndCropImage() async {
        final picker = ImagePicker();
        final pickedFile = await picker.getImage(source: ImageSource.gallery);
    
        if (pickedFile != null) {
          final croppedFile = await ImageCropper.cropImage(
            sourcePath: pickedFile.path,
            aspectRatioPresets: [
              CropAspectRatioPreset.square,
              CropAspectRatioPreset.ratio3x2,
              CropAspectRatioPreset.original,
              CropAspectRatioPreset.ratio4x3,
              CropAspectRatioPreset.ratio16x9,
            ],
            androidUiSettings: AndroidUiSettings(
              toolbarTitle: '裁剪图片',
              toolbarColor: Colors.deepOrange,
              toolbarWidgetColor: Colors.white,
              initAspectRatio: CropAspectRatioPreset.original,
              lockAspectRatio: false,
            ),
            iosUiSettings: IOSUiSettings(
              title: '裁剪图片',
            ),
          );
    
          if (croppedFile != null) {
            setState(() {
              _imageFile = croppedFile;
            });
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('图片裁剪示例'),
          ),
          body: Center(
            child: _imageFile != null
                ? Image.file(_imageFile!)
                : Text('未选择图片'),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _pickAndCropImage,
            tooltip: '选择图片',
            child: Icon(Icons.crop),
          ),
        );
      }
    }
    
    void main() => runApp(MaterialApp(
      home: ImageCropExample(),
    ));
    
  3. 配置 Android 和 iOS

    • Android:在 android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      
    • iOS:在 ios/Runner/Info.plist 文件中添加以下权限:

      <key>NSPhotoLibraryUsageDescription</key>
      <string>我们需要访问您的相册以选择图片</string>
      <key>NSCameraUsageDescription</key>
      <string>我们需要访问您的相机以拍摄图片</string>
回到顶部