Flutter图片编辑插件image_editor_plus的使用

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

Flutter图片编辑插件image_editor_plus的使用

简介

ImageEditor 是一个功能强大且易于使用的Flutter插件,支持通过Paints、文本、滤镜、表情符号和贴纸等对图片进行编辑。以下是该插件的一些截图:

Image1 Image2 Image3 Image4

安装

添加依赖

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

dependencies:
  image_editor_plus: ^latest_version

导入包

在 Dart 文件中导入 image_editor_plus 包:

import 'package:image_editor_plus/image_editor_plus.dart';

iOS配置

<project root>/ios/Runner/Info.plist 文件中添加以下权限描述:

<key>NSPhotoLibraryUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>
<key>NSCameraUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>
<key>NSMicrophoneUsageDescription</key>
<string>Used to capture audio for image picker plugin</string>

Android配置

无需额外配置,插件应能正常工作。

示例代码

初始化项目

确保你已经将图片资源放在 assets 文件夹中,并在 pubspec.yaml 中正确配置了资源路径。

示例代码

以下是一个完整的示例代码,展示了如何使用 image_editor_plus 插件进行图片编辑:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_editor_plus/image_editor_plus.dart';
import 'package:image_editor_plus/options.dart';

void main() {
  runApp(
    const MaterialApp(
      home: ImageEditorExample(),
    ),
  );
}

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

  @override
  createState() => _ImageEditorExampleState();
}

class _ImageEditorExampleState extends State<ImageEditorExample> {
  Uint8List? imageData;

  @override
  void initState() {
    super.initState();
    loadAsset("image.jpg");
  }

  void loadAsset(String name) async {
    var data = await rootBundle.load('assets/$name');
    setState(() => imageData = data.buffer.asUint8List());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("ImageEditor Example"),
        centerTitle: true,
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          if (imageData != null) Image.memory(imageData!),
          const SizedBox(height: 16),
          ElevatedButton(
            child: const Text("Single image editor"),
            onPressed: () async {
              var editedImage = await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => ImageEditor(
                    image: imageData,
                    cropOption: const CropOption(
                      reversible: false,
                    ),
                  ),
                ),
              );

              // replace with edited image
              if (editedImage != null) {
                imageData = editedImage;
                setState(() {});
              }
            },
          ),
          ElevatedButton(
            child: const Text("Multiple image editor"),
            onPressed: () async {
              var editedImage = await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => ImageEditor(
                    images: [
                      imageData,
                      imageData,
                    ],
                  ),
                ),
              );

              // replace with edited image
              if (editedImage != null) {
                imageData = editedImage;
                setState(() {});
              }
            },
          ),
        ],
      ),
    );
  }
}

功能演示

单张图片编辑

点击 “Single image editor” 按钮,可以进入单张图片编辑界面。编辑完成后,返回主界面并更新显示编辑后的图片。

多张图片编辑

点击 “Multiple image editor” 按钮,可以进入多张图片编辑界面。编辑完成后,返回主界面并更新显示编辑后的图片。

其他功能

图片转换

你可以使用 ImageUtils.convert 方法将图片转换为不同的格式(如JPEG、HEIC、PNG、WEBP):

import 'package:image_editor_plus/utils.dart';

// 转换为JPEG
final convertedImage = await ImageUtils.convert(
    image: data, // <-- Uint8List/path of image
    format: 'jpg',
    quality: 80,
);

// 转换为HEIC
final convertedImage = await ImageUtils.convert(
    image: data, // <-- Uint8List/path of image
    format: 'heic',
    quality: 80,
);

// 转换为PNG
final convertedImage = await ImageUtils.convert(
    image: data, // <-- Uint8List/path of image
    format: 'png',
);

// 转换为WEBP
final convertedImage = await ImageUtils.convert(
    image: data, // <-- Uint8List/path of image
    format: 'webp',
    quality: 80,
);

国际化支持

你可以通过 ImageEditor.i18n 方法设置插件的语言翻译:

ImageEditor.i18n({
    'Remove': 'हटा दीजिये',
    'Save': 'सहेजें',
    'Slider Filter Color': 'स्लाइडर फिल्टर का रंग',
});

许可证

image_editor_plus 插件采用MIT许可证,详细信息请参阅 LICENSE 文件。

希望这些信息对你有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter应用中使用image_editor_plus插件进行图片编辑的一个基本示例。这个插件提供了裁剪、旋转、翻转和应用滤镜等基本图片编辑功能。

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

dependencies:
  flutter:
    sdk: flutter
  image_editor_plus: ^latest_version  # 请替换为最新版本号

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

接下来,在你的Flutter项目中,你可以使用以下代码来加载图片并进行编辑:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImageEditorScreen(),
    );
  }
}

class ImageEditorScreen extends StatefulWidget {
  @override
  _ImageEditorScreenState createState() => _ImageEditorScreenState();
}

class _ImageEditorScreenState extends State<ImageEditorScreen> {
  File? _imageFile;

  final ImagePicker _picker = ImagePicker();

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

    if (pickedFile != null) {
      setState(() {
        _imageFile = File(pickedFile.path);
      });
    }
  }

  Future<void> _editImage() async {
    if (_imageFile == null) return;

    final editor = ImageEditor();

    // 裁剪图片(例如:裁剪到原图的50%)
    final croppedFile = await editor.cropImage(
      filePath: _imageFile!.path,
      quality: 85,
      outputFormat: OutputFormat.jpeg,
      cropRectangle: Rect.fromLTWH(
        _imageFile!.width!.toDouble() * 0.25,
        _imageFile!.height!.toDouble() * 0.25,
        _imageFile!.width!.toDouble() * 0.5,
        _imageFile!.height!.toDouble() * 0.5,
      ),
    );

    // 旋转图片(例如:旋转90度)
    final rotatedFile = await editor.rotateImage(
      filePath: croppedFile!.path,
      degrees: 90,
      quality: 85,
      outputFormat: OutputFormat.jpeg,
    );

    // 翻转图片(例如:水平翻转)
    final flippedFile = await editor.flipImage(
      filePath: rotatedFile.path,
      axis: FlipAxis.horizontal,
      quality: 85,
      outputFormat: OutputFormat.jpeg,
    );

    // 显示编辑后的图片
    setState(() {
      _imageFile = flippedFile;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Editor Plus Example'),
      ),
      body: Center(
        child: _imageFile == null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('No image selected.'),
                  ElevatedButton(
                    onPressed: _pickImage,
                    child: Text('Pick Image'),
                  ),
                ],
              )
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Image.file(_imageFile!),
                  SizedBox(height: 20),
                  ElevatedButton(
                    onPressed: _editImage,
                    child: Text('Edit Image'),
                  ),
                ],
              ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用ImagePicker从相册中选择一张图片。
  2. 使用ImageEditorPluscropImage方法裁剪图片。
  3. 使用rotateImage方法旋转图片。
  4. 使用flipImage方法翻转图片。
  5. 显示编辑后的图片。

请注意,这里的Rect.fromLTWH用于定义裁剪区域,你可能需要根据实际情况调整裁剪区域的坐标和尺寸。另外,这个示例假设图片文件有宽度和高度属性,这在实际应用中可能需要通过ImageProperties来获取。

在实际应用中,你可能还需要处理更多的错误情况,比如文件读写权限、图片格式不支持等。这个示例仅用于展示基本用法。

回到顶部