从Widget或Canvas创建原始图像

rip*_*182 8 flutter

我的最终目标是能够通过传递原始图像数据或将图像保存到磁盘以共享本机android/ios服务来共享动态图像.如何将一个Widget或一个Canvas颤动转换为原始图像数据(如byte[])?

And*_*onu 8

现在有支持.你可以使用RenderRepaintBoundryOffsetLayerScene.他们都有一个toImage.这是RederRepaintBoundry.toImage()的链接

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

这是从文档中复制的.

您可能还想知道此时,您需要切换到RenderRepaintBoundry通道,因为OffsetLayer尚未合并.如果您需要切换,请运行:

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

  • @colin如果可能的话,尝试将您想要捕获的部分包装在上述小部件之一中。另外, [Scene.toImage()](https://master-docs-flutter-io.firebaseapp.com/flutter/dart-ui/Scene/toImage.html) 接收宽度和高度,您可能能够以不同的方式利用(我不确定它是否会裁剪或扭曲原始图像): (2认同)
  • &gt; 完成绘制阶段 这是否意味着小部件必须在屏幕上? (2认同)

Ben*_*sal 7

您可以使用 来Screenshot package获取您想要imagewidget

https://pub.dev/packages/screenshot


Eri*_*del 5

目前在 FlutterView 中运行的 Dart 代码目前无法实现这一点,但是我们在实现文件跟踪方面存在一个错误:https : //github.com/flutter/flutter/issues/6774

可以将 Flutter 小部件渲染为 FlutterView 的一部分,然后在 FlutterView 上使用 Java 或 Objective-C 接口来捕获图片,例如 FlutterView 实现的标准 android.View.getBitmap: https://docs.flutter。 io/javadoc/io/flutter/view/FlutterView.html#getBitmap--

如果这对您的应用程序很重要并且希望能够从 Dart 代码中捕获 Widget 树的位图,我们很乐意听到它。请提供有关上述问题的更多背景信息!