flutter - 从 Widget 或 Canvas 创建原始图像

我的最终目标是能够通过传递原始图像数据或将图像保存到磁盘以供原生 android/ios 服务共享来共享动态图像。如何将 flutter 中的 WidgetCanvas 转换为原始图像数据(如 byte[])?

最佳答案

现在有对此的支持。您可以使用 RenderRepaintBoundryOffsetLayerScene。它们都有一个toImage。这是 RenderRepaintBoundry.toImage() 的链接

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

  @override
  PngHomeState createState() => PngHomeState();
}

class PngHomeState extends State<PngHome> {
  GlobalKey globalKey = GlobalKey();

  Future<void> _capturePng() async {
    RenderRepaintBoundary boundary = globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
    ui.Image image = await boundary.toImage();
    ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
    Uint8List pngBytes = byteData!.buffer.asUint8List();
    print(pngBytes);
  }

  @override
  Widget build(BuildContext context) {
    return RepaintBoundary(
      key: globalKey,
      child: Center(
        child: TextButton(
          onPressed: _capturePng,
          child: const Text('Take screenshot', textDirection: TextDirection.ltr),
        ),
      ),
    );
  }
}

这是从 the docs 复制的并适应最新的 null 安全和飞镖语言功能。 globalKey.currentContextbyteData 的值可以为 null,因此您的生产代码最好检查它们。

https://stackoverflow.com/questions/41957086/

相关文章:

flutter - 了解 Flutter 渲染引擎

dart - 如何从 Flutter 检查设备操作系统版本?

java - 使用 Platform Channels 在 Flutter 中调用原生库

android - Flutter 未检测到 Android SDK

flutter - 如何在 flutter 中使文本与宽度允许的一样大

firebase - 如何使用 Firebase 身份验证在 Flutter 中注销用户

flutter - 如何在 flutter 中仅使一行2个元素中的一个元素居中

dart - 如何自动缩小文本小部件中的字体以适应最大行数?

dart - Material Flutter 应用源码

flutter - 在 flutter 中使用 TabBarView 获取 'Horizontal