Flutter图片编辑插件images_editor的使用

Flutter图片编辑插件images_editor的使用

Images Editor 允许你在同一画布上编辑多张图片。

准备工作

1. 添加依赖

pubspec.yaml 文件中添加最新的版本,并运行 dart pub get

dependencies:
  images_editor: ^0.0.1
2. 配置Android

UCropActivity 添加到你的 AndroidManifest.xml 文件中:

<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
3. 添加图片选择器

pubspec.yaml 文件中添加 image_picker 作为依赖项,并遵循 安装说明 或使用其他包来选择图片。

示例代码

示例代码位于 /example 文件夹中。以下是一个完整的示例:

import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:images_editor/images_editor.dart';
import 'package:images_editor/utils/setting_values.dart';

import 'show_images.dart';

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

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

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

class _MyAppState extends State<MyApp> {

  List<Uint8List> images = [];

  Future<List<File>> pickMultiple() async {
    List<File> files = [];
    final pickedImage = await ImagePicker().pickMultiImage(imageQuality: 50);
    for (var file in pickedImage) {
      files.add(File(file.path));
    }
    return files;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Images Editor",
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Images Editor', style: TextStyle(fontSize: 25.0, color: Colors.white),),
          actions: [
            if (images.isNotEmpty)...[
              IconButton(
                onPressed: () {
                  setState(() {
                    images = [];
                  });
                },
                icon: const Icon(Icons.delete),
              ),
            ],
          ],
        ),
        body: Center(
          child: Builder(
            builder: (context) {
              if (images.isNotEmpty) {
                return ShowImages(
                  images: images,
                  onDelete: (index) {
                    setState(() {
                      images.removeAt(index);
                    });
                  },
                );
              } else {
                return ElevatedButton(
                  onPressed: () async {
                    await pickMultiple().then((files) {
                      if (files.isNotEmpty) {
                        Navigator.push(context, MaterialPageRoute(builder: (context) {
                          return ImagesEditor(
                            files: files,
                            onFinish: (images) {
                              Navigator.pop(context);
                              setState(() {
                                this.images = images;
                              });
                            },
                            customText: CustomText(),
                            customColor: CustomColor(),
                            customWidget: CustomWidget(),
                          );
                        }));
                      }
                    });
                  },
                  style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blue,
                  ),
                  child: const Text('Select images to edit', style: TextStyle(fontSize: 15.0, color: Colors.white)),
                );
              }
            }
          ),
        ),
      ),
    );
  }
}

属性说明

属性 描述
files 表示所选图片文件的文件对象列表。
onFinish 当编辑完成时调用的回调函数,返回编辑后的图片作为 Uint8List 列表。
customText 用于自定义警告和小部件文本。
customColor 用于自定义小部件主题。
customWidget 用于自定义小部件。
textInputDecoration 用于输入文本字段的装饰。
imageHeight 预览图像的高度。
imageWidth 预览图像的宽度。

贡献

欢迎来自开源社区的贡献,以使本项目更加完善。无论你是想报告错误、建议新功能或贡献代码,我都非常感谢你的帮助。

错误报告和功能请求

如果遇到错误或有新的功能想法,请在我的 GitHub Issues 页面上打开一个新问题。我会审查并讨论最佳解决方法。

代码贡献

如果你想为本项目贡献代码,请按以下步骤操作:

  1. 将仓库 Fork 到你的 GitHub 账户。
  2. 在本地机器上克隆你的 Fork 仓库:
git clone https://github.com/Kora3/flutter_images_editor.git

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

1 回复

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


images_editor 是一个用于在 Flutter 应用中编辑图片的插件。它提供了多种图片编辑功能,如裁剪、旋转、添加文本、添加贴纸、滤镜等。以下是如何在 Flutter 项目中使用 images_editor 插件的步骤。

1. 添加依赖

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

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

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

2. 导入插件

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

import 'package:images_editor/images_editor.dart';

3. 基本用法

3.1 图片裁剪

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:images_editor/images_editor.dart';

class ImageEditorExample extends StatefulWidget {
  @override
  _ImageEditorExampleState createState() => _ImageEditorExampleState();
}

class _ImageEditorExampleState extends State<ImageEditorExample> {
  File? _editedImage;

  Future<void> _cropImage() async {
    final File? imageFile = File('path_to_your_image.jpg'); // 替换为你的图片路径

    if (imageFile != null) {
      final File? editedFile = await ImagesEditor.crop(
        file: imageFile,
        rect: Rect.fromLTWH(50, 50, 200, 200), // 裁剪区域
      );

      setState(() {
        _editedImage = editedFile;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Editor Example'),
      ),
      body: Column(
        children: [
          if (_editedImage != null)
            Image.file(_editedImage!),
          ElevatedButton(
            onPressed: _cropImage,
            child: Text('Crop Image'),
          ),
        ],
      ),
    );
  }
}

3.2 图片旋转

Future<void> _rotateImage() async {
  final File? imageFile = File('path_to_your_image.jpg'); // 替换为你的图片路径

  if (imageFile != null) {
    final File? editedFile = await ImagesEditor.rotate(
      file: imageFile,
      degree: 90, // 旋转90度
    );

    setState(() {
      _editedImage = editedFile;
    });
  }
}

3.3 添加文本

Future<void> _addTextToImage() async {
  final File? imageFile = File('path_to_your_image.jpg'); // 替换为你的图片路径

  if (imageFile != null) {
    final File? editedFile = await ImagesEditor.addText(
      file: imageFile,
      text: 'Hello, Flutter!',
      position: const Offset(50, 50), // 文本位置
      style: const TextStyle(color: Colors.white, fontSize: 24), // 文本样式
    );

    setState(() {
      _editedImage = editedFile;
    });
  }
}

3.4 添加贴纸

Future<void> _addStickerToImage() async {
  final File? imageFile = File('path_to_your_image.jpg'); // 替换为你的图片路径

  if (imageFile != null) {
    final File? editedFile = await ImagesEditor.addSticker(
      file: imageFile,
      sticker: File('path_to_your_sticker.png'), // 替换为你的贴纸路径
      position: const Offset(100, 100), // 贴纸位置
      size: const Size(50, 50), // 贴纸大小
    );

    setState(() {
      _editedImage = editedFile;
    });
  }
}

3.5 应用滤镜

Future<void> _applyFilter() async {
  final File? imageFile = File('path_to_your_image.jpg'); // 替换为你的图片路径

  if (imageFile != null) {
    final File? editedFile = await ImagesEditor.applyFilter(
      file: imageFile,
      filter: ColorFilter.matrix(<double>[
        0.2126, 0.7152, 0.0722, 0, 0,
        0.2126, 0.7152, 0.0722, 0, 0,
        0.2126, 0.7152, 0.0722, 0, 0,
        0,      0,      0,      1, 0,
      ]), // 这是一个灰度滤镜
    );

    setState(() {
      _editedImage = editedFile;
    });
  }
}

4. 保存编辑后的图片

编辑后的图片可以通过 File 对象保存到本地或上传到服务器。

Future<void> _saveImage() async {
  if (_editedImage != null) {
    final Directory directory = await getApplicationDocumentsDirectory();
    final String filePath = '${directory.path}/edited_image.jpg';
    await _editedImage!.copy(filePath);
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Image saved to $filePath')));
  }
}
回到顶部