如何将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
相关产品推荐
相关产品推荐

