Flutter将Widgets转换为图片插件widgets_to_image_plus的使用

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

Flutter将Widgets转换为图片插件widgets_to_image_plus的使用

widgets_to_image_plus 是一个功能强大的Flutter库,旨在将Flutter小部件捕获为图片。该库提供了多种功能,使开发人员能够操作和自定义从Flutter小部件生成的图片,从而增强应用程序的视觉效果和交互性。

功能特性

  • 捕获小部件为图片:轻松将任何Flutter小部件转换为多种格式的图片,包括PNG和JPEG。
  • 图片操作:对捕获的图片应用各种变换,如:
    • 灰度转换
    • 添加水印
    • 自定义背景颜色
    • 生成缩略图
  • 图片效果:通过多种效果增强图片,包括:
    • 旋转
    • 颜色反转
    • 褐色调
    • 亮度、对比度和饱和度调整
    • 暗角效果
    • 边框和圆角
    • 水平和垂直翻转

安装

要将 widgets_to_image_plus 集成到你的Flutter项目中,请在 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  widgets_to_image_plus: ^0.0.1

导入库

在Dart文件中导入库:

import 'package:widgets_to_image_plus/widgets_to_image_plus.dart';

完整示例代码

以下是一个完整的示例代码,展示了如何使用 widgets_to_image_plus 捕获小部件并显示为图片:

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyApp> {
  final WidgetToImagePlus _controller = WidgetToImagePlus();
  Uint8List? _imageBytes;

  // 捕获图片
  Future<void> _captureImage() async {
    final bytes = await _controller.simpleCapture(format: ui.ImageByteFormat.png);
    _setImage(bytes);
  }

  // 捕获为灰度图片
  Future<void> _captureAsGrayscale() async {
    final bytes = await _controller.captureAsGrayscale();
    _setImage(bytes);
  }

  // 捕获并添加水印
  Future<void> _captureWithWatermark() async {
    final bytes = await _controller.captureWithWatermark(watermark: "Watermark");
    _setImage(bytes);
  }

  // 捕获并设置背景颜色
  Future<void> _captureWithBackground() async {
    final bytes = await _controller.captureWithBackground(backgroundColor: Colors.red);
    _setImage(bytes);
  }

  // 生成缩略图
  Future<void> _generateThumbnail() async {
    final bytes = await _controller.generateThumbnail();
    _setImage(bytes);
  }

  // 捕获并旋转图片
  Future<void> _captureWithRotation() async {
    final bytes = await _controller.captureWithRotation(angle: 0.5);
    _setImage(bytes);
  }

  // 捕获并反转颜色
  Future<void> _captureWithInvertedColors() async {
    final bytes = await _controller.captureWithInvertedColors();
    _setImage(bytes);
  }

  // 捕获并应用褐色调
  Future<void> _captureWithSepia() async {
    final bytes = await _controller.captureWithSepia();
    _setImage(bytes);
  }

  // 捕获并调整亮度
  Future<void> _captureWithBrightness() async {
    final bytes = await _controller.captureWithBrightness(brightness: 0.5);
    _setImage(bytes);
  }

  // 捕获并调整对比度
  Future<void> _captureWithContrast() async {
    final bytes = await _controller.captureWithContrast(contrast: 1.5);
    _setImage(bytes);
  }

  // 捕获并调整饱和度
  Future<void> _captureWithSaturation() async {
    final bytes = await _controller.captureWithSaturation(saturation: 1.5);
    _setImage(bytes);
  }

  // 捕获并应用暗角效果
  Future<void> _captureWithVignette() async {
    final bytes = await _controller.captureWithVignette(radius: 0.5, color: Colors.black);
    _setImage(bytes);
  }

  // 捕获并添加边框
  Future<void> _captureWithBorder() async {
    final bytes = await _controller.captureWithBorder(thickness: 20, color: Colors.black);
    _setImage(bytes);
  }

  // 捕获并应用圆角
  Future<void> _captureWithRoundedCorners() async {
    final bytes = await _controller.captureWithRoundedCorners(radius: 20);
    _setImage(bytes);
  }

  // 捕获并水平翻转
  Future<void> _captureWithHorizontalFlip() async {
    final bytes = await _controller.captureWithHorizontalFlip();
    _setImage(bytes);
  }

  // 捕获并垂直翻转
  Future<void> _captureWithVerticalFlip() async {
    final bytes = await _controller.captureWithVerticalFlip();
    _setImage(bytes);
  }

  // 设置捕获的图片
  void _setImage(Uint8List? bytes) {
    if (bytes != null) {
      setState(() {
        _imageBytes = bytes;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("捕获小部件为图片"),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              RepaintBoundary(
                key: _controller.containerKey,
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.blue,
                  child: Center(
                    child: Text(
                      'Hello, Flutter!',
                      textAlign: TextAlign.center,
                      style: TextStyle(color: Colors.white, fontSize: 24),
                    ),
                  ),
                ),
              ),
              SizedBox(height: 20),
              Wrap(
                spacing: 10,
                runSpacing: 20,
                alignment: WrapAlignment.center,
                children: [
                  ElevatedButton(
                    onPressed: _captureImage,
                    child: Text("捕获图片"),
                  ),
                  ElevatedButton(
                    onPressed: _captureAsGrayscale,
                    child: Text("捕获为灰度图片"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithWatermark,
                    child: Text("捕获并添加水印"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithBackground,
                    child: Text("捕获并设置背景颜色"),
                  ),
                  ElevatedButton(
                    onPressed: _generateThumbnail,
                    child: Text("生成缩略图"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithRotation,
                    child: Text("捕获并旋转"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithInvertedColors,
                    child: Text("捕获并反转颜色"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithSepia,
                    child: Text("捕获并应用褐色调"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithBrightness,
                    child: Text("捕获并调整亮度"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithContrast,
                    child: Text("捕获并调整对比度"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithSaturation,
                    child: Text("捕获并调整饱和度"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithVignette,
                    child: Text("捕获并应用暗角效果"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithBorder,
                    child: Text("捕获并添加边框"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithRoundedCorners,
                    child: Text("捕获并应用圆角"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithHorizontalFlip,
                    child: Text("捕获并水平翻转"),
                  ),
                  ElevatedButton(
                    onPressed: _captureWithVerticalFlip,
                    child: Text("捕获并垂直翻转"),
                  ),
                ],
              ),
              SizedBox(height: 20),
              if (_imageBytes != null)
                Image.memory(_imageBytes!), // 显示捕获的图片
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter中使用widgets_to_image_plus插件将Widgets转换为图片的示例代码。这个插件是widgets_to_image的增强版,提供了更多的功能和更好的性能。

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

dependencies:
  flutter:
    sdk: flutter
  widgets_to_image_plus: ^x.y.z  # 替换为最新版本号

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

接下来是一个完整的示例代码,展示了如何使用widgets_to_image_plus将Widgets转换为图片并保存到设备中。

import 'package:flutter/material.dart';
import 'package:widgets_to_image_plus/widgets_to_image_plus.dart';
import 'dart:ui' as ui;
import 'dart:typed_data';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Widgets to Image Plus Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Convert the following widget to an image:'),
              SizedBox(height: 20),
              WidgetToImageExample(),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  await _captureWidgetToImage();
                },
                child: Text('Capture Widget to Image'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class WidgetToImageExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 200,
      height: 200,
      color: Colors.amber,
      child: Center(
        child: Text(
          'Hello, Flutter!',
          style: TextStyle(fontSize: 24, color: Colors.black),
        ),
      ),
    );
  }
}

Future<void> _captureWidgetToImage() async {
  // 请求存储权限(如果需要)
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    await Permission.storage.request();
    status = await Permission.storage.status;
    if (!status.isGranted) {
      // 权限被拒绝
      return;
    }
  }

  // 获取外部存储路径
  final directory = (await getExternalStorageDirectory())!.path;
  final filePath = '$directory/widget_image.png';

  // 将Widget转换为图片
  final widget = WidgetToImageExample();
  final imageBytes = await widgetToImage(widget,
    pixelRatio: 2.0, // 调整图片质量
    backgroundColor: Colors.white, // 背景颜色
  );

  // 将图片保存到文件
  final buffer = Uint8List.fromList(imageBytes!);
  final imageFile = File(filePath);
  await imageFile.writeAsBytes(buffer);

  // 显示成功信息
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text('Image saved to $filePath')),
  );
}

注意事项:

  1. 权限处理:在Android和iOS上保存文件到外部存储通常需要存储权限。上面的代码示例中使用了permission_handler插件来处理权限请求。

  2. 依赖包:确保你已经添加了path_providerpermission_handler的依赖,因为上面的代码示例中使用了这两个包。

  3. UI线程widgetToImage是一个耗时的操作,建议在实际应用中使用compute函数或者将其放在后台线程中执行,以避免阻塞UI线程。

  4. 插件版本:由于插件可能会更新,请参考最新的widgets_to_image_plus文档和示例代码,以获取最新的功能和API变化。

希望这个示例对你有帮助!

回到顶部