Flutter图像转换插件flutter_image_converter的使用

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

Flutter图像转换插件flutter_image_converter的使用

简介

Flutter Image Converter 是一个用于在Flutter项目中轻松进行图像格式转换的插件。它支持多种图像来源和目标格式之间的转换,包括但不限于ImageProviderui.Imageimage.Imagewidget.Image以及原始字节流(Uint8List)。此插件能够识别并处理来自image包支持的所有图像格式,并且兼容各种类型的ImageProvider

Cover - Flutter Image Converter

使用方法

1. 添加依赖

首先,在pubspec.yaml文件中添加flutter_image_converter作为依赖:

dependencies:
  flutter_image_converter: ^latest_version # 替换为最新版本号

然后执行flutter pub get来安装该库。

2. 导入包

接下来,在需要使用的Dart文件顶部导入此库:

import 'package:flutter_image_converter/flutter_image_converter.dart';

3. 示例代码

下面是一个完整的示例应用程序,演示了如何使用flutter_image_converter来进行不同类型的图像转换操作。我们将创建一个简单的Flutter应用界面,展示从不同源获取的图像,并将其转换为目标格式后显示出来。

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

void main() => runApp(const App());

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

  @override
  Widget build(BuildContext context) => MaterialApp(
        home: Scaffold(
          appBar: appBar,
          body: SafeArea(
            child: SingleChildScrollView(
              child: Column(children: children),
            ),
          ),
        ),
        debugShowCheckedModeBanner: false,
      );

  AppBar get appBar => AppBar(
        title: const Text('Flutter Image Converter'),
        centerTitle: true,
      );

  List<Widget> get children => [
        const SizedBox(height: 24),
        ...demoImageProvider,
        ...demoUiImage,
        ...demoPackageImage,
        ...demoFileImage,
        ...demoBytesImage,
      ].map((w) => Padding(padding: const EdgeInsets.all(12), child: w)).toList();

  // ImageProvider to widget.Image
  List<Widget> get demoImageProvider => [
        const Text('From ImageProvider'),
        source(1).widgetImageSync,
      ];

  // image.Image to widget.Image
  List<Widget> get demoPackageImage => [
        const Text('From package Image'),
        FutureBuilder(
          future: source(2).imageImage,
          builder: (_, snapshot) =>
              snapshot.data == null ? const SizedBox() : snapshot.data!.widgetImageSync,
        ),
      ];

  /// See [ImageConverterOnFileExt].
  // FileImage or any format raw bytes to widget.Image
  List<Widget> get demoFileImage => [
        const Text('From File Image, any format'),
        FutureBuilder(
          // same as a file
          future: source(3).uint8List,
          builder: (_, snapshot) =>
              snapshot.data == null ? const SizedBox() : snapshot.data!.widgetImageSync,
        ),
      ];

  // Any formatted raw bytes to widget.Image
  List<Widget> get demoBytesImage => [
        const Text('From raw bytes, any format'),
        FutureBuilder(
          future: source(4).uint8List,
          builder: (_, snapshot) =>
              snapshot.data == null ? const SizedBox() : snapshot.data!.widgetImageSync,
        ),
      ];

  // ui.Image to widget.Image
  List<Widget> get demoUiImage => [
        const Text('From ui.Image'),
        FutureBuilder(
          future: source(5).uiImage,
          builder: (_, snapshot) => snapshot.data == null
              ? const SizedBox()
              : FutureBuilder(
                  future: snapshot.data!.widgetImage,
                  builder: (_, snapshot) =>
                      snapshot.data == null ? const SizedBox() : snapshot.data!,
                ),
        ),
      ];

  ImageProvider source(int n) => AssetImage('assets/$n.webp');
}

在这个例子中,我们定义了一个包含多个部分的应用程序:

  • demoImageProvider: 将ImageProvider直接转换成widget.Image
  • demoPackageImage: 先将图片资源加载为image.Image再转成widget.Image
  • demoFileImage: 从文件或任何格式的原始字节数组开始,最终生成widget.Image
  • demoBytesImage: 直接从原始字节数组创建widget.Image
  • demoUiImage: 通过先获得ui.Image再进一步转换为widget.Image

每个部分都使用了FutureBuilder来异步处理可能耗时的操作,并确保UI能够在数据准备好之前保持响应性。

支持的类型与转换器

扩展名 extension name image.Image ui.Image widget.Image ImageProvider Uint8List
image.Image imageImage
ui.Image uiImage
widget.Image widgetImage
ImageProvider imageProvider
Uint8List uint8List

以上表格展示了所有支持的数据类型及其相互之间的转换关系。你可以根据自己的需求选择合适的扩展方法来进行转换。

更多信息

有关更多细节和高级用法,请参考官方文档及示例代码。如果你有任何问题或者建议,欢迎访问GitHub仓库提交issue或pull request。希望这个插件能帮助你在Flutter开发中更方便地处理图像!


注意:请确保你已经在项目中正确配置了资源路径(如assets),以便能够顺利运行上述示例代码中的图片加载逻辑。


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

1 回复

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


当然,以下是一个关于如何使用 flutter_image_converter 插件的示例代码。这个插件允许你在 Flutter 应用中进行图像格式的转换,比如将 JPEG 转换为 PNG,或者将图像转换为 Base64 编码。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_image_converter: ^x.y.z  # 请使用最新版本号替换 x.y.z

然后运行 flutter pub get 来获取依赖。

接下来,是一个完整的 Flutter 应用示例,展示如何使用 flutter_image_converter 插件:

import 'package:flutter/material.dart';
import 'package:flutter_image_converter/flutter_image_converter.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(
      title: 'Flutter Image Converter Demo',
      home: ImageConverterScreen(),
    );
  }
}

class ImageConverterScreen extends StatefulWidget {
  @override
  _ImageConverterScreenState createState() => _ImageConverterScreenState();
}

class _ImageConverterScreenState extends State<ImageConverterScreen> {
  Uint8List? _imageBytes;
  String? _base64String;
  String? _convertedImageFormat;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Image Converter Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Original Image (Base64):'),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
            SizedBox(height: 16),
            if (_imageBytes != null)
              Text('Base64 String: $_base64String'),
            SizedBox(height: 16),
            if (_imageBytes != null)
              Text('Converted Image Format: $_convertedImageFormat'),
            SizedBox(height: 16),
            if (_imageBytes != null)
              ElevatedButton(
                onPressed: _convertImageFormat,
                child: Text('Convert Image Format'),
              ),
          ],
        ),
      ),
    );
  }

  Future<void> _pickImage() async {
    final pickedFile = await ImagePicker().pickImage(source: ImageSource.camera);
    if (pickedFile != null) {
      final fileBytes = await pickedFile.readAsBytes();
      setState(() {
        _imageBytes = fileBytes;
        _base64String = base64Encode(fileBytes);
      });
    }
  }

  Future<void> _convertImageFormat() async {
    if (_imageBytes == null) return;

    final result = await FlutterImageConverter.convertImageFormat(
      imageBytes: _imageBytes!,
      targetFormat: ImageFormat.PNG, // 你可以改为其他格式如 ImageFormat.JPEG, ImageFormat.WEBP
    );

    if (result != null) {
      setState(() {
        _convertedImageFormat = 'Converted to ${result.format.name} format';
      });
      // 这里你可以保存或显示转换后的图像
      // 例如,使用 result.bytes 获取转换后的图像字节数据
    } else {
      // 处理转换失败的情况
      print('Image format conversion failed.');
    }
  }
}

注意事项

  1. ImagePicker 插件:上面的代码示例中使用了 ImagePicker 插件来从相机或图库中选择图像。你需要在 pubspec.yaml 中添加 image_picker 依赖,并运行 flutter pub get
dependencies:
  image_picker: ^x.y.z  # 请使用最新版本号替换 x.y.z
  1. 权限:如果你的应用需要从相机或图库中选择图像,你需要在 AndroidManifest.xmlInfo.plist 中添加相应的权限声明。

  2. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,比如处理图像选择失败、转换失败等情况。

这个示例展示了如何使用 flutter_image_converter 插件来选择图像、转换为 Base64 编码,以及将图像转换为其他格式。你可以根据实际需求进行进一步定制。

回到顶部