Flutter图片裁剪插件image_crop_nic的使用

Flutter图片裁剪插件image_crop_nic的使用

安装

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

dependencies:
  image_crop_nic: ^版本号

确保替换 ^版本号 为最新的版本号。

使用

首先创建一个用于加载和编辑图片的widget。以下是一个完整的示例代码:

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_crop_nic/image_crop_nic.dart';
import 'package:image_picker/image_picker.dart';

void main() {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    statusBarColor: Colors.transparent,
    statusBarBrightness: Brightness.dark,
    statusBarIconBrightness: Brightness.light,
    systemNavigationBarIconBrightness: Brightness.light,
  ));

  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final cropKey = GlobalKey<CropState>();
  File? _file;
  File? _sample;
  File? _lastCropped;

  [@override](/user/override)
  void dispose() {
    super.dispose();
    _file?.delete();
    _sample?.delete();
    _lastCropped?.delete();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: SafeArea(
        child: Container(
          color: Colors.black,
          padding: const EdgeInsets.symmetric(vertical: 40.0, horizontal: 20.0),
          child: _sample == null ? _buildOpeningImage() : _buildCroppingImage(),
        ),
      ),
    );
  }

  Widget _buildOpeningImage() {
    return Center(child: _buildOpenImage());
  }

  Widget _buildCroppingImage() {
    return Column(
      children: <Widget>[
        Expanded(
          child: Crop.file(_sample!, key: cropKey),
        ),
        Container(
          padding: const EdgeInsets.only(top: 20.0),
          alignment: AlignmentDirectional.center,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              TextButton(
                child: Text(
                  'Crop Image',
                  style: Theme.of(context)
                      .textTheme
                      .button
                      ?.copyWith(color: Colors.white),
                ),
                onPressed: () => _cropImage(),
              ),
              _buildOpenImage(),
            ],
          ),
        )
      ],
    );
  }

  Widget _buildOpenImage() {
    return TextButton(
      child: Text(
        'Open Image',
        style:
            Theme.of(context).textTheme.button?.copyWith(color: Colors.white),
      ),
      onPressed: () => _openImage(),
    );
  }

  Future<void> _openImage() async {
    final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery);
    if (pickedFile == null) return;
    final file = File(pickedFile.path);

    final sample = await ImageCrop.sampleImage(
      file: file,
      preferredSize: context.size?.longestSide.ceil(),
    );

    _sample?.delete();
    _file?.delete();

    setState(() {
      _sample = sample;
      _file = file;
    });
  }

  Future<void> _cropImage() async {
    final scale = cropKey.currentState?.scale;
    final area = cropKey.currentState?.area;
    if (area == null) {
      // 无法裁剪,小部件未设置好
      return;
    }

    // 放大以使用尽可能多的像素
    // 这将用更高的分辨率采样图像,使裁剪后的图像更大
    final sample = await ImageCrop.sampleImage(
      file: _file!,
      preferredSize: (2000 / scale!).round(),
    );

    final file = await ImageCrop.cropImage(
      file: sample,
      area: area,
    );

    sample.delete();

    _lastCropped?.delete();
    _lastCropped = file;

    debugPrint('$file');
  }
}

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

1 回复

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


image_crop_nic 是一个 Flutter 插件,用于在 Flutter 应用中实现图片裁剪功能。它提供了简单易用的 API,允许用户选择图片并进行裁剪。以下是使用 image_crop_nic 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 image_crop_nic 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  image_crop_nic: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在需要使用图片裁剪功能的 Dart 文件中导入 image_crop_nic 插件:

import 'package:image_crop_nic/image_crop_nic.dart';

3. 选择图片并裁剪

使用 ImageCropNic 插件提供的 API 来选择图片并进行裁剪。以下是一个简单的示例:

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

class ImageCropExample extends StatefulWidget {
  @override
  _ImageCropExampleState createState() => _ImageCropExampleState();
}

class _ImageCropExampleState extends State<ImageCropExample> {
  String _croppedImagePath;

  Future<void> _cropImage() async {
    // 使用 image_picker 插件选择图片
    final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      // 使用 image_crop_nic 插件裁剪图片
      final croppedFile = await ImageCropNic.cropImage(
        imagePath: pickedFile.path,
        aspectRatio: CropAspectRatio.square, // 设置裁剪比例
      );

      if (croppedFile != null) {
        setState(() {
          _croppedImagePath = croppedFile.path;
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Crop Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _croppedImagePath != null
                ? Image.file(File(_croppedImagePath)) // 显示裁剪后的图片
                : Text('No image selected.'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _cropImage,
              child: Text('Crop Image'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

运行你的 Flutter 应用,点击 “Crop Image” 按钮,选择一张图片并进行裁剪。裁剪后的图片将会显示在界面上。

5. 其他功能

image_crop_nic 插件还提供了其他一些功能,比如设置裁剪比例、旋转图片等。你可以根据需求进一步探索这些功能。

6. 注意事项

  • 确保在使用 image_picker 插件时,已经正确处理了权限请求。
  • 由于 image_crop_nic 插件可能依赖原生代码,确保在 Android 和 iOS 项目中正确配置了相关权限和依赖。

7. 处理权限

在 Android 和 iOS 上,你可能需要处理相机和图库的权限。确保在 AndroidManifest.xmlInfo.plist 中添加相应的权限声明。

Android:

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

iOS:

<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to your photo library to select images.</string>
<key>NSCameraUsageDescription</key>
<string>We need access to your camera to take photos.</string>
回到顶部