Flutter优质功能集成插件cream_of_the_crop的使用

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

Flutter优质功能集成插件Cream Of The Crop 的使用

Cream Of The Crop

快速的Flutter Web图像裁剪和调整大小处理。

特性:

  • 裁剪
  • 调整大小
  • 获取图像尺寸

为什么?

这个包的存在是为了在Web上提供一个高性能的选项来执行图像调整大小和裁剪转换。由于Dart的特性,纯Dart编写的图像转换器在Web上运行较慢。详情可以查看image包中的性能警告。

Dart 图像与 Cream Of The Crop 性能对比。1.591 vs 38.634

如何工作?

在几乎所有现代Web浏览器中,cream_of_the_crop 可以利用GPU加速的HTML <canvas> 元素来进行调整大小和裁剪操作。

演示

示例文件夹中启动应用程序,以查看 <canvas> 和纯Dart之间的性能差异。

没有用户界面

该包没有用户界面。它设计用于与crop_image 或其他不处理自身图像转换的裁剪库一起使用。crop_image 提供了裁剪图像的用户界面,并生成该包可以使用的裁剪值来转换图像数据。

iOS / Android?

此包仅适用于Web。确保只在Web上调用其函数。其他平台会抛出未实现错误。

对于iOS和Android设备,image 包更为高效,并且可以为这些平台提供良好的用户体验。考虑检查一下flutter_native_image

裁剪指令

裁剪命令需要几个变量。请参阅Mozilla开发者文档了解它们的含义。

Dart 图像与 Cream Of The Crop 性能对比。1.591 vs 38.634

import 'package:cream_of_the_crop/cream_of_the_crop.dart';

final _creamOfTheCropPlugin = CreamOfTheCrop();

Uint8List? crop() async {
  return await _creamOfTheCropPlugin.cropImage(
    imageBytes,
    sx, sy,  // 相对于原始图像左上角的裁剪位置
    sw, sh,  // 剩余区域的宽度和高度
    dx, dy,  // 目标画布上的相对位置(目前几乎总是 0,0,因为不支持创建比所需图像更大的画布)
    dw, dh,  // 最终图像的宽度和高度
    quality, 
    imageExportType,
  );
}

为了计算这些值,可能有助于使用 dart:ui 包中的 Image() 对象来获取原始图像的宽度和高度。以下示例展示了如何使用 imagePicker

import 'package:image_picker/image_picker.dart';
import 'dart:ui' as ui;

final ImagePicker imagePicker = ImagePicker();

void getImage() async {
  // 使用图库选择图像
  final XFile? image = await imagePicker.pickImage(source: ImageSource.gallery);

  if (image != null) {
    // 将图像读取为字节
    Uint8List bytes = await image.readAsBytes();

    // 解码图像
    ui.Image decoded = await decodeImageFromList(bytes);
    
    print("图像宽度: ${decoded.width}, 高度: ${decoded.height}");
  }
}

crop_image 示例

示例文件夹中的flutter项目中,可以看到裁剪覆盖对话框的实现,返回裁剪值以供 cream_of_the_crop 使用。

给定一个X x Y尺寸的原始图像,裁剪为500 x 500正方形。

// 使用dart:ui解码原始图像的尺寸
int decodedWidth = decoded.width; // X
int decodedHeight = decoded.height; // Y

// 所需最终图像的像素大小
int exportWidth = 500;
int exportHeight = 500;

// 由crop_image包裁剪UI提供的值
double cropTop = finalCropPixels.top;
double cropRight = finalCropPixels.right;
double cropBottom = finalCropPixels.bottom;
double cropLeft = finalCropPixels.left;

// 边缘距离
int distTop = cropTop.toInt();
int distRight = (decodedWidth - cropRight).toInt();
int distLeft = cropLeft.toInt();
int distBottom = (decodedHeight - cropBottom).toInt();

// 计算裁剪值以创建裁剪后的图像数据
int sx = distLeft;
int sy = distTop;
int sw = decodedWidth - distLeft - distRight;
int sh = decodedHeight - distTop - distBottom;
int dx = 0;
int dy = 0;
int dw = exportWidth;
int dh = exportHeight;

更多关于Flutter优质功能集成插件cream_of_the_crop的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter优质功能集成插件cream_of_the_crop的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,cream_of_the_crop 这个名字听起来像是一个精选或高质量的 Flutter 插件集合。虽然这不是一个官方或广泛认知的 Flutter 插件名(可能是个假设的名字或特定项目的自定义插件集合),但我可以根据常见的 Flutter 插件集成方式给出一个示例,展示如何在 Flutter 项目中集成和使用高质量的第三方插件。

假设我们有一个集合了多个高质量插件的 Flutter 项目,并且我们想要展示如何集成和使用其中一个插件,比如用于图像处理的 image_picker 插件和用于状态管理的 provider 插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  image_picker: ^0.8.4+4  # 假设这是我们需要集成的高质量插件之一
  provider: ^6.0.0  # 用于状态管理的插件

2. 安装依赖

在命令行中运行以下命令来安装依赖:

flutter pub get

3. 使用插件

a. 使用 image_picker 插件选择图片

创建一个 Dart 文件(例如 main.dart),并在其中使用 image_picker 插件来选择图片:

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

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => ImageProvider()),
      ],
      child: MyApp(),
    ),
  );
}

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

class ImagePickerScreen extends StatefulWidget {
  @override
  _ImagePickerScreenState createState() => _ImagePickerScreenState();
}

class _ImagePickerScreenState extends State<ImagePickerScreen> {
  final ImagePicker _picker = ImagePicker();
  File? _imageFile;

  Future<void> _pickImage(ImageSource source) async {
    final XFile? image = await _picker.pickImage(source: source);
    if (image != null) {
      setState(() {
        _imageFile = File(image.path);
      });
      // 通知 ImageProvider 状态变化
      context.read<ImageProvider>().updateImage(_imageFile!);
    }
  }

  @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.gallery),
                    child: Text('Pick Image from Gallery'),
                  ),
                  SizedBox(height: 15),
                  ElevatedButton(
                    onPressed: () => _pickImage(ImageSource.camera),
                    child: Text('Pick Image from Camera'),
                  ),
                ],
              )
            : Image.file(_imageFile!),
      ),
    );
  }
}

class ImageProvider with ChangeNotifier {
  File? _image;

  File? get image => _image;

  void updateImage(File image) {
    _image = image;
    notifyListeners();
  }
}

b. 使用 provider 插件管理状态

在上述代码中,我们使用了 provider 插件来管理图片的状态。ImageProvider 类是一个 ChangeNotifier,它持有一个可选的 File 对象,并在图片更新时通知监听器。

总结

上述代码示例展示了如何在 Flutter 项目中集成和使用高质量的第三方插件。虽然 cream_of_the_crop 可能是一个假设的插件集合名,但你可以按照类似的方式集成和使用任何你需要的 Flutter 插件。确保你查阅每个插件的官方文档以获取最新的使用指南和最佳实践。

回到顶部