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

从MediaPicker选取图片后,如何获取Microsoft.Maui.Graphics.IImage对象?

解决MAUI中MediaPicker选图后IImage Resize空引用问题

核心问题

你遇到的空引用异常,根源是内存流位置偏移:把文件流复制到memoryStream后,流的读写指针停留在了末尾,PlatformImage.FromStream从当前位置开始读取,实际读不到任何内容。这导致image对象表面不为null,但内部的原生图像资源并未正确初始化,调用Resize时触发空引用错误。

修复步骤

  1. 在调用FromStream前,必须重置memoryStream的Position到起始位置
  2. 增加MediaPicker返回值的null校验(用户可能取消选择图片)
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:10:11