Flutter图像处理插件iimage的使用

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

Flutter图像处理插件iimage的使用

简介

iimage 是一个专门为 Flutter 应用开发中的图像处理业务设计的工具包。它提供了多种图像处理功能,易于库的引入,方便的功能调用,每个功能都经过合理的设计,并且具有很高的专业性,支持多个平台,没有限制,业务覆盖面广,可以满足 90% 的业务开发需求。该库还在持续更新中。

更新与特性

问题与建议

  • 感谢您对 iimage 的关注和使用;
  • 希望您留下宝贵的评论,电子邮件地址为 1542100658@qq.com
  • 如果在使用 iimage 时遇到错误,请在 问题地址 提出您的问题。

鼓励和支持

iimage 是一个高度专业的图像处理工具包,每个功能都经过作者的仔细检查和测试。虽然工具包仍在开发中,但它已经具备了很多出色的功能。如果您发现任何问题,请毫不犹豫地联系作者或在 GitHub 上提出问题。如果您对 iimage 满意,请留下您的宝贵支持,这将是作者最好的鼓励。

示例代码

以下是一个完整的示例代码,展示了如何使用 iimage 进行图像处理。

import 'dart:async';
import 'dart:ui' as ui;
import 'package:example/fam/fam.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:idkit/idkit.dart' hide IImage;
import 'package:iimage/iimage.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter FImage Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter FImage Demo'),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 图像变化流控制器
  final StreamController<ui.Image> imageStreamController = StreamController.broadcast();

  // 当前图像
  ui.Image? image;

  // 获取原始图像
  Future<ui.Image> getImageData() async {
    final ImmutableBuffer immutableBuffer = await rootBundle.loadBuffer(FamManager.aa);
    final ui.Codec codec = await ui.instantiateImageCodecFromBuffer(immutableBuffer);
    final ui.FrameInfo frameInfo = await codec.getNextFrame();
    return frameInfo.image;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                // 左右翻转按钮
                IconButton(
                  hoverColor: Colors.transparent,
                  onPressed: () async {
                    if (image == null) return;
                    final ByteData? byteData = await image!.toByteData();
                    if (byteData == null) return;
                    image = await IImage.mirrorFromUint32List(
                      uint32list: byteData.buffer.asUint32List(),
                      imageWidth: image!.width,
                      imageHeight: image!.height,
                      mirrorType: MirrorType.lr,
                    );
                    imageStreamController.add(image!);
                  },
                  icon: Image.asset(FamManager.zy),
                ),
                // 上下翻转按钮
                IconButton(
                  hoverColor: Colors.transparent,
                  onPressed: () async {
                    if (image == null) return;
                    final ByteData? byteData = await image!.toByteData();
                    if (byteData == null) return;
                    image = await IImage.mirrorFromImage(
                      image: image!,
                      mirrorType: MirrorType.td,
                    );
                    imageStreamController.add(image!);
                  },
                  icon: Image.asset(FamManager.sx),
                ),
              ],
            ),
            10.vGap,
            // 显示图像
            FutureBuilder(
              future: getImageData(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.active ||
                    snapshot.connectionState == ConnectionState.waiting) {
                  return const Text('图像加载中...');
                }
                if (snapshot.hasError) {
                  return const Text('图像加载失败!');
                }
                image = snapshot.data;
                return StreamBuilder<ui.Image>(
                  initialData: image,
                  stream: imageStreamController.stream,
                  builder: (context, snapshot) {
                    if (snapshot.hasError) {
                      return const Text('图像镜像失败!!!');
                    }
                    if (snapshot.data == null) {
                      return const Text('图像镜像图为 null');
                    }
                    return IDKitImage.image(image: snapshot.data!);
                  },
                );
              },
            ),
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    imageStreamController.close();
    super.dispose();
  }
}

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

1 回复

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


在Flutter中,iimage 并不是一个广为人知的图像处理插件。通常,Flutter 开发者会使用 image_picker 来选择图像,以及 imagecanvas 相关的 Flutter API 来进行图像处理。不过,假设你提到的 iimage 是一个假设的或特定的图像处理插件,我们可以基于常见的图像处理任务来展示一些代码示例。

由于 iimage 插件的具体 API 和功能未知,以下示例将使用 Flutter 内置的图像处理功能,这些功能通常足够处理大多数图像任务。如果你有一个特定的 iimage 插件,并且知道其 API,你可以根据这些示例调整代码。

1. 选择并显示图像

首先,我们需要一个插件来选择图像,image_picker 是一个常用的选择。

添加依赖

dependencies:
  flutter:
    sdk: flutter
  image_picker: ^0.8.4+4  # 请检查最新版本

选择并显示图像

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

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

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

class ImagePickerDemo extends StatefulWidget {
  @override
  _ImagePickerDemoState createState() => _ImagePickerDemoState();
}

class _ImagePickerDemoState extends State<ImagePickerDemo> {
  File? _imageFile;

  final ImagePicker _picker = ImagePicker();

  Future<void> _pickImage(ImageSource source) async {
    final XFile? image = await _picker.pickImage(source: source);

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Demo'),
      ),
      body: Center(
        child: _imageFile == null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('No image selected.'),
                  ElevatedButton(
                    onPressed: () => _pickImage(ImageSource.camera),
                    child: Text('Select from Camera'),
                  ),
                  ElevatedButton(
                    onPressed: () => _pickImage(ImageSource.gallery),
                    child: Text('Select from Gallery'),
                  ),
                ],
              )
            : Image.file(_imageFile!),
      ),
    );
  }
}

2. 图像处理(例如,转换为灰度图像)

Flutter 提供了 CanvasPaint 类来进行图像处理。以下是将图像转换为灰度图像的示例:

添加图像处理函数

import 'dart:typed_data';
import 'dart:ui' as ui;

Uint8List convertImageToGrayscale(Uint8List imageBytes, int width, int height) {
  final ByteBuffer buffer = imageBytes.buffer.asByteBuffer();
  final Uint8ClampedList pixels = Uint8ClampedList.view(buffer);

  for (int i = 0; i < pixels.length; i += 4) {
    final int r = pixels[i];
    final int g = pixels[i + 1];
    final int b = pixels[i + 2];

    // 计算灰度值
    final int gray = (r * 0.299 + g * 0.587 + b * 0.114).toInt();

    pixels[i] = gray;    // Red channel
    pixels[i + 1] = gray; // Green channel
    pixels[i + 2] = gray; // Blue channel
  }

  return imageBytes;
}

Future<Uint8List?> loadAndProcessImage(File imageFile) async {
  final ByteData byteData = await imageFile.readAsBytes();
  final Uint8List imageBytes = byteData.buffer.asUint8List();

  final ui.Codec codec = await ui.instantiateImageCodec(imageBytes);
  final ui.FrameInfo frameInfo = await codec.getNextFrame();

  final int width = frameInfo.image.width;
  final int height = frameInfo.image.height;

  return convertImageToGrayscale(imageBytes, width, height);
}

将处理后的图像显示在屏幕上

class ImageProcessingDemo extends StatefulWidget {
  @override
  _ImageProcessingDemoState createState() => _ImageProcessingDemoState();
}

class _ImageProcessingDemoState extends State<ImageProcessingDemo> {
  File? _imageFile;
  Uint8List? _processedImageBytes;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Processing Demo'),
      ),
      body: Center(
        child: _imageFile == null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('No image selected.'),
                  ElevatedButton(
                    onPressed: () async {
                      final XFile? image = await ImagePicker().pickImage(source: ImageSource.gallery);

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

                        _processedImageBytes = await loadAndProcessImage(_imageFile!);

                        setState(() {});
                      }
                    },
                    child: Text('Select and Process Image'),
                  ),
                ],
              )
            : Image.memory(_processedImageBytes!),
      ),
    );
  }
}

请注意,上述代码中的 convertImageToGrayscale 函数直接修改了原始图像的像素数据。这通常用于简单的图像处理任务。对于更复杂的图像处理,你可能需要使用第三方库,如 dart:ui 提供的 CanvasPaint,或者将图像发送到原生平台进行处理(例如,使用 MethodChannel 调用原生 Android 或 iOS 的图像处理库)。

如果你有一个特定的 iimage 插件,并且知道它的 API,你可以根据插件的文档和示例代码来调整上述示例。

回到顶部