You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ImageProvider<Object>类型图片保存至手机相册?

解决ImageProvider转Uint8List并保存至相册的问题

要解决ImageProvider<Object>无法直接传入ImageGallerySaver.saveImage()的问题,核心是把ImageProvider转换成Uint8List格式,具体实现步骤如下:

  • 利用ImageProvider.resolve()获取图片流,监听流回调拿到Image实例
  • 将Image实例编码为ByteData,再转换为Uint8List
  • 把Uint8List传入ImageGallerySaver.saveImage()完成保存

修改后的完整代码:

Future<void> onTakeScreenshot() async {
  ImageProvider<Object> capture = await arSessionManager.snapshot();
  
  // 显示预览弹窗
  await showDialog(
    context: context,
    builder: (_) => Dialog(
      child: Container(
        decoration: BoxDecoration(
          image: DecorationImage(image: capture, fit: BoxFit.cover),
        ),
      ),
    ),
  );

  // 转换ImageProvider为Uint8List
  final ImageStream stream = capture.resolve(const ImageConfiguration());
  final Completer<Uint8List> completer = Completer();
  
  stream.addListener(ImageStreamListener((ImageInfo info, bool _) async {
    final ByteData? byteData = await info.image.toByteData(format: ImageByteFormat.png);
    if (byteData != null) {
      completer.complete(byteData.buffer.asUint8List());
    } else {
      completer.completeError('Failed to convert image to bytes');
    }
  }));

  try {
    final Uint8List imageBytes = await completer.future;
    await ImageGallerySaver.saveImage(imageBytes);
    // 可添加保存成功提示
    // ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('图片已保存至相册')));
  } catch (e) {
    // 处理转换或保存失败的情况
    print('保存失败:$e');
  }
}

代码说明:

  • capture.resolve(const ImageConfiguration()):获取图片的数据流
  • ImageStreamListener:监听图片加载完成事件,拿到ImageInfo中的图片实例
  • info.image.toByteData():将图片编码为PNG格式的ByteData(可根据需求改为ImageByteFormat.jpeg)
  • byteData.buffer.asUint8List():把ByteData转成Uint8List,满足ImageGallerySaver.saveImage()的参数要求

内容的提问来源于stack exchange,提问作者leebumseok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:15:39