Flutter多图裁剪插件multi_image_crop的使用

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

Flutter多图裁剪插件multi_image_crop的使用

multi_image_crop 是一个用于在iOS和Android上同时裁剪多张图片的Flutter插件。

特性

该插件包含一个 MultiImageCrop.startCropping() 方法。此方法仅裁剪和过滤图片。

该插件通过文件进行处理,以避免通过方法通道传递大量数据。文件存储在iOS和Android的缓存文件夹中。因此,如果需要保存实际裁剪后的图像,请确保将文件复制到其他位置。

所有计算密集型工作都在主线程之外通过iOS上的调度队列和Android上的缓存线程池完成。

感谢

该插件使用了 image_crop 插件,原始贡献者是他。我们认为该插件在功能上非常出色。本插件的主要区别在于:

  • 支持多张图片裁剪
  • 提供图像过滤功能

注意:该插件仍在开发中,部分功能尚未实现,测试范围有限。

使用

创建一个方法并传入要裁剪的图片列表或单张图片:

MultiImageCrop.startCropping(
    context: context,
    aspectRatio: 4 / 3,
    activeColor: Colors.amber,
    pixelRatio: 3,
    files: List.generate(
        receivedFiles!.length, (index) => File(receivedFiles![index].path)),
    callBack: (List<File> images) {
      setState(() {
        croppedFiles = images;
      });
    });

示例代码

以下是一个完整的示例代码,展示了如何使用 multi_image_crop 插件来裁剪多张图片。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:multi_image_crop/multi_image_crop.dart';
import 'package:image_picker/image_picker.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MultiCrop Image',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(primarySwatch: Colors.yellow, primaryColor: Colors.yellow),
      home: const MyHomePage(title: 'Multi Crop Image'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<XFile>? receivedFiles = [];
  List<File> croppedFiles = [];
  final ImagePicker _picker = ImagePicker();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
          itemCount: croppedFiles.length,
          itemBuilder: (context, index) {
            return Container(
                height: 250,
                padding: const EdgeInsets.all(10.0),
                child: Image.file(
                  croppedFiles[index],
                  fit: BoxFit.fitWidth,
                ));
          }),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          chooseImage();
        },
        child: const Icon(Icons.add),
      ),
    );
  }

  void chooseImage() async {
    receivedFiles = await _picker.pickMultiImage();
    MultiImageCrop.startCropping(
        context: context,
        aspectRatio: 4 / 3,
        activeColor: Colors.amber,
        pixelRatio: 3,
        files: List.generate(
            receivedFiles!.length, (index) => File(receivedFiles![index].path)),
        callBack: (List<File> images) {
          setState(() {
            croppedFiles = images;
          });
        });
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter中的multi_image_crop插件进行多图裁剪的示例代码。这个插件允许用户在Flutter应用中裁剪多张图片。

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

dependencies:
  flutter:
    sdk: flutter
  multi_image_crop: ^0.0.8  # 请注意版本号,使用最新版本

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

接下来,你可以在你的Flutter应用中实现图片裁剪功能。以下是一个简单的示例:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  List<File> images = [];
  List<File> croppedImages = [];

  final ImagePicker _picker = ImagePicker();

  Future<void> pickImages() async {
    List<PickedFile> result = await _picker.pickMultiImage(
      maxImages: 5,
      enableRotation: true,
    );

    if (result != null) {
      setState(() {
        images = result.map((e) => File(e.path)).toList();
      });
    }
  }

  Future<void> cropImages() async {
    if (images.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('请先选择图片!')),
      );
      return;
    }

    List<CroppedFile> croppedFiles = await MultiImageCrop.cropImages(
      imageFiles: images,
      aspectRatioPresets: [
        CropAspectRatioPreset.square,
        CropAspectRatioPreset.ratio3x2,
        CropAspectRatioPreset.original,
        CropAspectRatioPreset.ratio4x3,
        CropAspectRatioPreset.ratio16x9
      ],
      androidUiSettings: AndroidUiSettings(
        toolbarTitle: '裁剪图片',
        toolbarColor: Colors.deepPurple,
        toolbarWidgetColor: Colors.white,
        initAspectRatio: CropAspectRatioPreset.original,
        lockAspectRatio: false,
      ),
      iosUiSettings: IOSUiSettings(
        minimumAspectRatio: 1.0,
      ),
    );

    if (croppedFiles != null) {
      setState(() {
        croppedImages = croppedFiles.map((e) => File(e.path)).toList();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('多图裁剪示例'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            ElevatedButton(
              onPressed: pickImages,
              child: Text('选择图片'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: cropImages,
              child: Text('裁剪图片'),
            ),
            SizedBox(height: 16),
            if (images.isNotEmpty)
              Text('原始图片:'),
            ...images.map((image, index) => Image.file(image)).toList(),
            SizedBox(height: 16),
            if (croppedImages.isNotEmpty)
              Text('裁剪后的图片:'),
            ...croppedImages.map((image, index) => Image.file(image)).toList(),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖添加:在pubspec.yaml中添加multi_image_cropimage_picker插件。
  2. 选择图片:使用ImagePickerpickMultiImage方法选择多张图片。
  3. 裁剪图片:使用MultiImageCrop.cropImages方法对选择的图片进行裁剪。
  4. 显示图片:使用Image.file方法显示原始图片和裁剪后的图片。

确保你在运行这个代码之前已经正确添加了所有依赖,并且已经授予了应用访问存储的权限(在Android上需要添加权限声明,并在运行时请求权限)。

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

回到顶部