Flutter图像处理插件image_crafter的使用

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

Flutter图像处理插件image_crafter的使用

简介

image_crafter 是一个Dart包,提供了用于选择、裁剪和处理图像的实用函数,并包含了一个在Flutter应用中的示例用法。该插件支持Android和iOS平台,允许用户从图库中选择图片或通过相机拍摄图片,并对图片进行裁剪和压缩。

功能

  • 从图库中选择图片或通过相机拍摄图片。
  • 将选定的图片裁剪为所需的纵横比。
  • 在保持质量的同时处理和压缩图片。

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用image_crafter插件来选择、裁剪和显示图片。

import 'dart:io';

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  File? _image;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: _image != null ? Colors.black12 : null,
      appBar: AppBar(
        title: const Text("Select Image and Crop"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 显示选中的图片
            _image == null
                ? const Text("Select Image")
                : CircleAvatar(
                    radius: 100, // 调整头像的半径
                    backgroundColor: Colors.grey, // 头像背景颜色
                    child: ClipOval(
                      child: Image.file(
                        _image!,
                        height: 300.0,
                        width: 300.0,
                        fit: BoxFit.fill,
                      ),
                    ),
                  ),
            const SizedBox(height: 20.0),

            // 从图库选择图片按钮
            ElevatedButton(
              onPressed: () async {
                File? image = await ImageUtility.imageFromGallery(
                  imageQuality: 60, // 图片质量(0-100)
                  aspectRatioPresetsForAndroid: [CustomAspectRatio.square], // Android平台的纵横比预设
                  aspectRatioPresetsForIos: [CustomAspectRatio.square], // iOS平台的纵横比预设
                  lockAspectRatio: true, // 是否锁定纵横比
                );
                setState(() {
                  _image = image;
                });
                if (kDebugMode) {
                  if (_image != null) {
                    print("Gallery path ${_image!.path}");
                  }
                }
              },
              child: const Text('Pick Image from Gallery'),
            ),
            const SizedBox(height: 30),

            // 从相机拍摄图片按钮
            ElevatedButton(
              onPressed: () async {
                File? image = await ImageUtility.imageFromCamera(
                  imageQuality: 60, // 图片质量(0-100)
                  aspectRatioPresetsForAndroid: [CustomAspectRatio.square], // Android平台的纵横比预设
                  aspectRatioPresetsForIos: [CustomAspectRatio.square], // iOS平台的纵横比预设
                  lockAspectRatio: true, // 是否锁定纵横比
                );
                setState(() {
                  _image = image;
                });
                if (kDebugMode) {
                  if (_image != null) {
                    print("Camera path ${_image!.path}");
                  }
                }
              },
              child: const Text('Pick Image from Camera'),
            ),
          ],
        ),
      ),
    );
  }
}

配置

iOS配置

从版本0.8.1开始,iOS实现使用PHPicker来选择(多个)图片,适用于iOS 14或更高版本。由于实现了PHPicker,在iOS 14+的模拟器上无法选择HEIC格式的图片,这是一个已知问题。请在真实设备上测试,或使用非HEIC格式的图片进行测试。

Info.plist文件中添加以下键:

  • NSPhotoLibraryUsageDescription:描述应用程序为什么需要访问照片库权限。如果始终将requestFullMetadata设置为false,则不会请求此权限,但App Store政策要求包含此plist条目。
  • NSCameraUsageDescription:描述应用程序为什么需要访问相机。
Android配置

AndroidManifest.xml中添加以下内容:

<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />

确保在build.gradle文件中将compileSdkVersion设置为33:

android {
  compileSdkVersion 33
  ...
}

使用说明

  • 检查权限状态:
var permissionStatus = await ImageUtility.checkPermission();
if (permissionStatus) {
  // 权限已授予
} else {
  // 导航到设置页面
}
  • 从图库选择图片:
File? image = await ImageUtility.imageFromGallery(imageQuality: 60);
  • 从相机拍摄图片:
File? image = await ImageUtility.imageFromCamera(imageQuality: 60);

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用image_crafter插件进行图像处理的代码示例。image_crafter插件提供了一系列图像编辑和处理功能,比如裁剪、旋转、滤镜等。需要注意的是,在实际使用之前,请确保你已经在pubspec.yaml文件中添加了image_crafter依赖并运行了flutter pub get

1. 添加依赖

首先,在pubspec.yaml文件中添加image_crafter依赖:

dependencies:
  flutter:
    sdk: flutter
  image_crafter: ^最新版本号  # 请替换为实际可用的最新版本号

2. 导入插件

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

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

3. 使用ImageCrafter进行图像处理

以下是一个简单的示例,展示了如何使用ImageCrafter进行图像裁剪和旋转操作:

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

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

class ImageProcessingPage extends StatefulWidget {
  @override
  _ImageProcessingPageState createState() => _ImageProcessingPageState();
}

class _ImageProcessingPageState extends State<ImageProcessingPage> {
  Uint8List? imageBytes;

  @override
  void initState() {
    super.initState();
    // 加载本地图片或者网络图片(此处为示例,加载本地资产图片)
    rootBundle.load('assets/sample.jpg').then((data) {
      setState(() {
        imageBytes = data.buffer.asUint8List();
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Crafter Demo'),
      ),
      body: Center(
        child: imageBytes != null
            ? Image.memory(processImage(imageBytes!))
            : CircularProgressIndicator(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          setState(() {
            imageBytes = await processImageWithCrafter(imageBytes!);
          });
        },
        tooltip: 'Process Image',
        child: Icon(Icons.edit),
      ),
    );
  }

  Uint8List processImage(Uint8List imageBytes) {
    // 此处为简单示例,不对图像进行处理,直接返回原始图像数据
    return imageBytes;
  }

  Future<Uint8List> processImageWithCrafter(Uint8List imageBytes) async {
    final imageProvider = MemoryImage(imageBytes);
    final image = await imageProvider.image;
    final painter = ImageCrafter(image);

    // 裁剪图像(例如:裁剪为图像中心的正方形区域)
    final rect = Rect.fromLTWH(
      (image.width! - image.height!)! / 2.0,
      (image.height! - image.width!)! / 2.0,
      image.height!,
      image.height!,
    );
    final croppedImage = await painter.cropImage(rect);

    // 旋转图像(例如:旋转90度)
    final rotatedImage = await painter.rotateImage(croppedImage!, 90);

    // 将处理后的图像转换为Uint8List
    final byteData = await rotatedImage.toByteData(format: ui.ImageByteFormat.png);
    return byteData!.buffer.asUint8List();
  }
}

4. 添加资产图片

如果你使用的是本地资产图片,请确保在pubspec.yaml中添加资产路径:

flutter:
  assets:
    - assets/sample.jpg

注意事项

  • ImageCrafter插件的具体API可能会随着版本更新而变化,请参考插件的官方文档以获取最新和最准确的信息。
  • 图像处理操作(尤其是裁剪和旋转)可能会消耗较多的内存和CPU资源,因此在处理大图像或执行复杂操作时,请注意性能优化。

希望这个示例能帮你更好地理解如何在Flutter项目中使用image_crafter插件进行图像处理。

回到顶部