Flutter截图保存插件widgets_to_png的使用

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

Flutter截图保存插件widgets_to_png的使用

widgets_to_png 是一个Flutter包,允许将任何小部件转换为PNG图像并保存到设备相册。

功能

  • 将任何小部件转换为PNG字节。
  • 将捕获的小部件图像保存到文件。
  • 将捕获的小部件图像保存到设备相册。
  • 使用预定义或自定义值指定图像质量。

使用方法

1. 包装您的小部件

WidgetToPng 包装您想要捕获的小部件,并提供一个 GlobalKey 来标识它。

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

class MyWidget extends StatelessWidget {
  final GlobalKey _globalKey = GlobalKey();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Widget to Image Example'), // 小部件转图片示例
      ),
      body: Center(
        child: WidgetToPng(
          keyToCapture: _globalKey, // 需要捕获的小部件的key
          child: Container(
            width: 200,
            height: 200,
            color: Colors.blue,
            child: Center(child: Text('Capture Me!')), // 捕捉我!
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await ImageConverter.saveWidgetToGallery(
            key: _globalKey,
            fileName: 'captured_widget.png', // 保存文件名为 captured_widget.png
          );
        },
        child: Icon(Icons.camera), // 相机图标
      ),
    );
  }
}
2. 将小部件作为字节捕获

使用 captureWidgetToBytes 方法将小部件作为字节捕获。您可以使用 ImageQuality 枚举或自定义质量值来指定图像质量。

import 'package:widgets_to_png/widgets_to_png.dart';

// 使用枚举指定图像质量
Uint8List? imageBytes = await ImageConverter.captureWidgetToBytes(
  key: _globalKey,
  imageQuality: ImageQuality.high, // 高质量
);

// 或者使用自定义质量值
Uint8List? imageBytes = await ImageConverter.captureWidgetToBytes(
  key: _globalKey,
  customImageQuality: 3.0, // 自定义质量值
);
3. 将字节保存到文件

使用 saveBytesToFile 方法将捕获的字节保存到文件。

import 'dart:io';
import 'package:widgets_to_png/widgets_to_png.dart';

File imageFile = await ImageConverter.saveBytesToFile(
  bytes: imageBytes!, // 捕获的字节
  filename: 'widget_image.png', // 文件名为 widget_image.png
);
4. 将字节转换为 XFile

使用 convertBytesToXFile 方法将捕获的字节转换为 XFile

import 'package:image_picker/image_picker.dart';
import 'package:widgets_to_png/widgets_to_png.dart';

XFile imageXFile = await ImageConverter.convertBytesToXFile(
  bytes: imageBytes!, // 捕获的字节
  filename: 'widget_image.png', // 文件名为 widget_image.png
);
5. 将小部件保存到相册

使用 saveWidgetToGallery 方法直接将捕获的小部件图像保存到设备相册。

import 'package:widgets_to_png/widgets_to_png.dart';

await ImageConverter.saveWidgetToGallery(
  key: _globalKey,
  fileName: 'captured_widget.png', // 保存文件名为 captured_widget.png
);

类和方法

WidgetToPng

包装另一个小部件并允许其被捕获为图像的小部件。

属性 类型 描述
keyToCapture GlobalKey 用于标识要捕获的小部件的键。
child Widget 要包装并捕获的小部件。
ImageConverter

用于将小部件转换为图像并保存它们的实用类。

功能

  • captureWidgetToBytes: 捕获由给定 GlobalKey 标识的小部件并返回图像字节。
  • saveBytesToFile: 将给定的图像字节保存到具有指定 filename 的临时文件中。
  • convertBytesToXFile: 将给定的图像字节转换为具有指定 filenameXFile
  • saveWidgetToGallery: 捕获由给定 GlobalKey 标识的小部件并将其与指定的 fileName 一起保存到相册中。
ImageQuality

表示捕获图像质量的枚举。

质量 描述
low 低质量 (1.2x 像素比率)
medium 中等质量 (2.0x 像素比率)
high 高质量 (2.5x 像素比率)

注意: 图像质量越高,转换小部件为字节所需的时间就越长。

示例

这是一个完整的示例,展示如何使用 widgets_to_png 包:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final GlobalKey _globalKey = GlobalKey();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Widget to Image Example'), // 小部件转图片示例
        ),
        body: Center(
          child: WidgetToPng(
            keyToCapture: _globalKey, // 需要捕获的小部件的key
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(child: Text('Capture Me!')), // 捕捉我!
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            await ImageConverter.saveWidgetToGallery(
              key: _globalKey,
              fileName: 'captured_widget.png', // 保存文件名为 captured_widget.png
            );
          },
          child: Icon(Icons.camera), // 相机图标
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用widgets_to_png插件来截图并保存图片的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  widgets_to_png: ^4.0.0  # 请注意版本号,这里使用的是4.0.0,实际使用时请检查最新版本

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

接下来,在你的Flutter项目中,你可以使用以下代码来截图并保存图片:

import 'package:flutter/material.dart';
import 'package:widgets_to_png/widgets_to_png.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Widgets to PNG Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ScreenshotWidget(),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 触发截图保存功能
                  final ByteData byteData = await ScreenshotWidget().captureAsPng();
                  final Uint8List pngBytes = byteData.buffer.asUint8List();

                  // 保存图片到设备存储
                  final Directory extDir = await getApplicationDocumentsDirectory();
                  final String imgPath = '${extDir.path}/screenshot.png';
                  File imgFile = File(imgPath);
                  await imgFile.writeAsBytes(pngBytes);

                  print('Screenshot saved to $imgPath');
                },
                child: Text('Save Screenshot'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class ScreenshotWidget extends StatelessWidget {
  ScreenshotController _controller = ScreenshotController();

  @override
  Widget build(BuildContext context) {
    return Screenshot(
      controller: _controller,
      child: Container(
        color: Colors.amber,
        width: 300,
        height: 300,
        child: Center(
          child: Text(
            'Hello, Flutter!',
            style: TextStyle(fontSize: 24, color: Colors.black),
          ),
        ),
      ),
    );
  }

  Future<ByteData> captureAsPng() async {
    // 捕获截图
    final ScreenshotController screenshotController = _controller;
    return await screenshotController.capture();
  }
}

在这个示例中:

  1. ScreenshotWidget是一个你想要截图的widget。
  2. ScreenshotController用于控制截图操作。
  3. Screenshot widget包裹了你想要截图的内容,并指定了controller
  4. 在按钮点击事件中,调用captureAsPng方法来捕获截图,并将截图保存为PNG文件到应用文档目录。

请注意,在Android上保存文件到外部存储可能需要请求权限,这里示例代码简化了流程,直接保存到应用的内部存储目录。

确保在实际应用中处理文件保存权限和路径问题,并根据需要调整UI和逻辑。

回到顶部