Flutter图像处理插件flutter_image_processing的使用

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

Flutter图像处理插件flutter_image_processing的使用

1. Introduction

flutter_image_processing 插件项目为 iOS 和 Android 提供了基于 OpenCV 4.3.0 库的图像处理功能。这些功能通过将 OpenCV 教程中提供的 C++ 图像处理代码适配到 Flutter 中实现。项目使用 FFI(Foreign Function Interface)库将这些 C++ 函数绑定到 Flutter 中。

目前,我们提供了两个函数:高斯模糊(Gaussian Blur)和 Canny 边缘检测器(Canny Edge Detector)。未来,我们将继续更新和扩展功能,提供更多图像处理能力。

在示例代码中,你将注意到 image_picker 的使用。此外,请注意,示例在模拟器上运行时无法进行测试,建议在实际设备上进行测试。

2. Screenshots

Home Select Image Gaussian Blur Result Canny Edge Detector Result
Home Select Image Gaussian Blur Result Canny Edge Detector Result

3. Setup

flutter_image_processing 插件需要 image_picker 来选择图片。image_picker 的权限设置可以在其各自的插件安装文档中找到,适用于 iOS 和 Android。

4. Usage

以下是一个完整的示例代码,展示了如何使用 flutter_image_processing 插件进行高斯模糊和 Canny 边缘检测。

示例代码

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

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

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

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

class _MyAppState extends State<MyApp> {
  final ImagePicker _picker = ImagePicker();
  late String version;
  Image _img = Image.asset('assets/img/default.jpg');

  @override
  void initState() {
    super.initState();
    version = flutter_image_processing.opencvVersion();
  }

  @override
  Widget build(BuildContext context) {
    const textStyle = TextStyle(fontSize: 25);
    const spacerSmall = SizedBox(height: 10);
    return Scaffold(
      appBar: AppBar(
        title: const Text('flutter_image_processing example'),
      ),
      body: SingleChildScrollView(
        child: Container(
          padding: const EdgeInsets.all(10),
          child: Column(
            children: [
              spacerSmall,
              Text(
                'OpenCV Version: $version',
                style: textStyle,
                textAlign: TextAlign.center,
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  final imageFile = await _picker.pickImage(source: ImageSource.gallery);
                  final imagePath = imageFile?.path ?? "none";

                  await flutter_image_processing.gaussianBlur(imagePath);

                  setState(() {
                    _img = Image.file(File(imagePath));
                  });
                },
                child: const Text("Run GaussianBlur"),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  final imageFile = await _picker.pickImage(source: ImageSource.gallery);
                  final imagePath = imageFile?.path ?? "none";

                  await flutter_image_processing.cannyDetector(imagePath);

                  setState(() {
                    _img = Image.file(File(imagePath));
                  });
                },
                child: const Text("Run CannyDetector"),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  final imageFile = await _picker.pickImage(source: ImageSource.gallery);
                  final imagePath = imageFile?.path ?? "none";

                  await flutter_image_processing.medianBlur(imagePath);

                  setState(() {
                    _img = Image.file(File(imagePath));
                  });
                },
                child: const Text("Run medianBlur"),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  final imageFile = await _picker.pickImage(source: ImageSource.gallery);
                  final imagePath = imageFile?.path ?? "none";

                  await flutter_image_processing.bilateralFilter(imagePath);

                  setState(() {
                    _img = Image.file(File(imagePath));
                  });
                },
                child: const Text("Run bilateralFilter"),
              ),
              SizedBox(height: 20),
              Center(child: _img),
            ],
          ),
        ),
      ),
    );
  }

  void test() {
    List<String> a;
  }
}

参考

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


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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_image_processing插件来进行图像处理的示例代码。这个插件提供了多种图像处理功能,比如滤镜、调整亮度和对比度等。

首先,你需要在pubspec.yaml文件中添加flutter_image_processing依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_image_processing: ^0.10.0  # 请根据需要检查最新版本号

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

接下来是一个简单的示例,展示如何使用flutter_image_processing插件对图像应用滤镜:

import 'package:flutter/material.dart';
import 'package:flutter_image_processing/flutter_image_processing.dart';
import 'dart:typed_data';
import 'dart:ui' as ui;

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

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

class ImageProcessingScreen extends StatefulWidget {
  @override
  _ImageProcessingScreenState createState() => _ImageProcessingScreenState();
}

class _ImageProcessingScreenState extends State<ImageProcessingScreen> {
  Uint8List? _imageBytes;
  Uint8List? _processedImageBytes;

  @override
  void initState() {
    super.initState();
    // 加载本地图片或者从网络获取图片数据
    rootBundle.load('assets/sample_image.jpg').then((value) {
      setState(() {
        _imageBytes = value.buffer.asUint8List();
      });
      applyFilter();
    });
  }

  void applyFilter() async {
    if (_imageBytes == null) return;

    final imageProvider = MemoryImage(_imageBytes!);
    final image = await imageProvider.image;
    final painter = ImagePainter(_imageBytes!);

    // 转换为灰度图像
    final grayImageBytes = await painter.toGrayscale();

    // 应用Sepia滤镜
    final sepiaImageBytes = await painter.applySepiaFilter(intensity: 0.8);

    // 在这里你可以保存或者显示处理后的图像
    setState(() {
      _processedImageBytes = sepiaImageBytes;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Image Processing Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_imageBytes != null)
              Image.memory(_imageBytes!),
            if (_processedImageBytes != null)
              SizedBox(height: 20),
            if (_processedImageBytes != null)
              Image.memory(_processedImageBytes!),
          ],
        ),
      ),
    );
  }
}

class ImagePainter {
  final Uint8List imageBytes;
  ImagePainter(this.imageBytes);

  Future<Uint8List> toGrayscale() async {
    final image = Image.memory(imageBytes);
    final imageProcessor = ImageProcessor(image);
    final grayImage = await imageProcessor.toGrayscale();
    return (await grayImage.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List();
  }

  Future<Uint8List> applySepiaFilter({required double intensity}) async {
    final image = Image.memory(imageBytes);
    final imageProcessor = ImageProcessor(image);
    final sepiaImage = await imageProcessor.applySepiaFilter(intensity: intensity);
    return (await sepiaImage.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List();
  }
}

说明:

  1. 加载图像:在initState方法中,我们从本地资产加载一张图片。你也可以从网络加载图片,只需要相应地调整代码。
  2. 图像处理:在applyFilter方法中,我们创建了一个ImagePainter实例,并调用其方法来将图像转换为灰度图像和应用Sepia滤镜。
  3. 显示图像:使用Image.memory来显示原始和处理后的图像。

注意:由于flutter_image_processing插件的API可能会随着版本更新而变化,因此请确保参考最新的官方文档和示例代码。如果插件提供了更多的图像处理功能,比如调整亮度、对比度等,你可以参考文档来扩展这个示例。

回到顶部