从MediaPicker选取图片后,如何获取Microsoft.Maui.Graphics.IImage对象?
解决MAUI中MediaPicker选图后IImage Resize空引用问题
核心问题
你遇到的空引用异常,根源是内存流位置偏移:把文件流复制到memoryStream后,流的读写指针停留在了末尾,PlatformImage.FromStream从当前位置开始读取,实际读不到任何内容。这导致image对象表面不为null,但内部的原生图像资源并未正确初始化,调用Resize时触发空引用错误。
修复步骤
- 在调用
FromStream前,必须重置memoryStream的Position到起始位置 - 增加MediaPicker返回值的null校验(用户可能取消选择图片)
- 使用
await using自动释放文件流资源,避免内存泄漏
修正后的完整代码
var file = await MediaPicker.PickPhotoAsync(new MediaPickerOptions { Title = "Pick a photo" }); // 校验用户是否取消选择 if (file == null) return; var memoryStream = new MemoryStream(); // 自动释放文件流资源 await using var filestream = await file.OpenReadAsync(); await filestream.CopyToAsync(memoryStream); // 重置流位置到起始处,这是解决问题的关键 memoryStream.Position = 0; Microsoft.Maui.Graphics.IImage image = Microsoft.Maui.Graphics.Platform.PlatformImage.FromStream(memoryStream); if (image != null) { var newImage = image.Resize(720, 1280, ResizeMode.Stretch, true); // 这里添加newImage的后续业务逻辑 }
补充说明
- 你之前声明的
byteArray变量没有实际用途,可以直接删除,减少不必要的内存占用 - 流的读写指针会随着
CopyToAsync操作移动到末尾,不重置的话,FromStream读取的是空流,导致IImage内部未完成初始化
内容的提问来源于stack exchange,提问作者Shaurya Shikhar
相关产品推荐
相关产品推荐

