Flutter 截图

218 阅读1分钟

Widget 截图

RepaintBoundary 用作需要截图的Widget的父Widget。

GlobalKey 作为RepaintBoundary的key。

final GlobalKey _globalKey = GlobalKey();

@override
  Widget build(BuildContext context) {
    _captureScreenshot();
  
    return RepaintBoundary(
            key: _globalKey,
            child: Container(
              ...
            ),
          );
  }
  

获取截图:

Future<void> _captureScreenshot() async {
    await Future.delayed(const Duration(seconds: 1));
    try {
      if(!mounted){
        debugPrint('currentContext is null');
        return ;
      }

      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();
      final image = Image.memory(pngBytes);
    } catch (e) {
      debugPrint(e.toString());
    }
  }
}

Flutter plugin

Dart Image 库

pub-web.flutter-io.cn/packages/im…

import 'package:image/image.dart' as img;

void handleResult(FaceInfo result, img.Image imageInput) {

    final x1 = result.x1.toInt();

    final y1 = result.y1.toInt();

    final width = (result.x2 - result.x1).toInt();

    final height = (result.y2 - result.y1).toInt();

    final cropImage =

    img.copyCrop(imageInput, x: x1, y: y1, width: width, height: height);

    //转为png图片

    final data = img.encodePng(cropImage);
}

第三方插件

crop_image: pub-web.flutter-io.cn/packages/cr…

cropperx: pub-web.flutter-io.cn/packages/cr…

image_cropping: pub-web.flutter-io.cn/packages/im…