Flutter图片裁剪插件native_image_cropper_android的使用

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

Flutter图片裁剪插件 native_image_cropper_android 的使用

native_image_cropper_android 是一个用于 Android 平台的图片裁剪插件,它是 native_image_cropper 插件的一部分。该插件提供了在 Android 设备上进行高效图片裁剪的功能。

使用说明

这个插件是被认可的(endorsed),这意味着你可以直接使用 native_image_cropper 插件,并且当你这样做时,native_image_cropper_android 会自动包含在你的应用中。

示例代码

以下是一个完整的示例 demo,展示了如何使用 native_image_cropper_android 插件来裁剪图片:

import 'dart:async';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:native_image_cropper_android/native_image_cropper_android.dart';

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

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

  static const String imageName = 'sail-boat.png';

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _nativeImageCropperAndroidPlugin = NativeImageCropperAndroid();
  ImageFormat _format = ImageFormat.jpg;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Native Image Cropper Android Example'),
        ),
        body: FutureBuilder<Uint8List>(
          future: _getBytes(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              final bytes = snapshot.data!;
              return Column(
                children: [
                  Image(
                    image: MemoryImage(bytes),
                  ),
                  const SizedBox(height: 20),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      DropdownButton<ImageFormat>(
                        value: _format,
                        items: const [
                          DropdownMenuItem(value: ImageFormat.jpg, child: Text('JPG')),
                          DropdownMenuItem(value: ImageFormat.png, child: Text('PNG')),
                        ],
                        onChanged: (value) => setState(() => _format = value!),
                      ),
                      ElevatedButton(
                        onPressed: () => _crop(
                          context: context,
                          bytes: bytes,
                          method: _nativeImageCropperAndroidPlugin.cropRect,
                        ),
                        child: const Icon(Icons.crop),
                      ),
                      ElevatedButton(
                        onPressed: () => _crop(
                          context: context,
                          bytes: bytes,
                          method: _nativeImageCropperAndroidPlugin.cropOval,
                        ),
                        child: const Icon(Icons.crop),
                      ),
                    ],
                  ),
                ],
              );
            }
            return const Center(child: CircularProgressIndicator());
          },
        ),
      ),
    );
  }

  Future<void> _crop({
    required BuildContext context,
    required Uint8List bytes,
    required Future<Uint8List> Function({
      required Uint8List bytes,
      required int x,
      required int y,
      required int width,
      required int height,
      required ImageFormat format,
    }) method,
  }) async {
    final croppedBytes = await method(
      bytes: bytes,
      x: 0,
      y: 0,
      width: 2999,
      height: 1999,
      format: _format,
    );

    if (context.mounted) {
      Navigator.push<void>(
        context,
        MaterialPageRoute<ResultPage>(
          builder: (context) => ResultPage(
            bytes: croppedBytes,
            format: _format,
          ),
        ),
      );
    }
  }

  Future<Uint8List> _getBytes() async {
    final byteData = await rootBundle.load('assets/${MyApp.imageName}');
    return byteData.buffer.asUint8List();
  }
}

class ResultPage extends StatelessWidget {
  final Uint8List bytes;
  final ImageFormat format;

  const ResultPage({required this.bytes, required this.format, super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cropped Image - ${format.name.toUpperCase()}'),
      ),
      body: Center(
        child: Image.memory(bytes),
      ),
    );
  }
}

注意事项

  1. 导入资源:确保在 pubspec.yaml 文件中正确配置了资源文件路径:

    assets:
      - assets/sail-boat.png
    
  2. 插件安装:在 pubspec.yaml 中添加 native_image_cropper 依赖:

    dependencies:
      flutter:
        sdk: flutter
      native_image_cropper: ^版本号
    
  3. 权限设置:确保在 Android 端的 AndroidManifest.xml 文件中声明了读写存储权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

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

1 回复

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


当然,以下是一个关于如何使用 native_image_cropper_android 插件在 Flutter 中进行图片裁剪的示例代码。请注意,这个插件专门用于 Android 平台,如果你需要在 iOS 上实现类似功能,可能需要使用其他插件,如 image_cropper

首先,确保你已经在 pubspec.yaml 文件中添加了 native_image_cropper_android 依赖:

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

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

接下来,在你的 Flutter 项目中,你可以按照以下步骤使用 native_image_cropper_android 插件:

  1. 导入插件

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

import 'package:native_image_cropper_android/native_image_cropper_android.dart';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart'; // 通常与图片选择器一起使用
  1. 选择图片并裁剪

你可以使用 ImagePicker 插件来选择图片,然后使用 NativeImageCropperAndroid 来裁剪图片。以下是一个完整的示例:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Image Cropper Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _pickAndCropImage,
            child: Text('Pick and Crop Image'),
          ),
        ),
      ),
    );
  }

  Future<void> _pickAndCropImage() async {
    final ImagePicker _picker = ImagePicker();
    final PickedFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      File? croppedFile = await NativeImageCropperAndroid.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,
        ),
      );

      if (croppedFile != null) {
        // 显示或处理裁剪后的图片
        showCroppedImage(croppedFile);
      } else {
        // 用户取消了裁剪
        print('User cancelled image cropping.');
      }
    } else {
      // 用户取消了图片选择
      print('User cancelled image picking.');
    }
  }

  void showCroppedImage(File image) {
    // 在这里显示裁剪后的图片,例如使用 Image.file(image)
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('Cropped image path: ${image.path}'),
      ),
    );
  }
}

在这个示例中,我们首先使用 ImagePicker 从图库中选择一张图片。然后,我们使用 NativeImageCropperAndroid.cropImage 方法来裁剪这张图片。裁剪完成后,我们显示裁剪后的图片路径(在实际应用中,你可能会将裁剪后的图片显示到 Image.file 组件中)。

请注意,NativeImageCropperAndroid 的参数和方法可能会随着插件版本的更新而变化,因此请参考插件的官方文档以获取最新的使用方法和参数信息。

回到顶部