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

.NET MAIImage调整大小报错:System.ObjectDisposedException(Android.Graphics.Bitmap)

问题分析

抛出System.ObjectDisposedException: Cannot access a disposed object. Object name: Android.Graphics.Bitmap异常的核心原因:你通过photo.OpenReadAsync()获取的sourceStream被using块包裹,代码离开using范围时流会自动释放。而Android平台的PlatformImage基于Android.Graphics.Bitmap创建,该Bitmap依赖原始流的资源,流释放后Bitmap会被标记为已释放,后续操作Resize后的newImage时就会触发异常。

解决方案

将原始流的内容复制到**内存流(MemoryStream)**中,用内存流创建IImage,这样即使原始流被释放,内存流中的数据依然保留,Bitmap的底层资源不会被回收。

修改后的代码片段:

FileResult photo = await MediaPicker.Default.CapturePhotoAsync();
localFilePath = String.Empty;
string base64ImageString = string.Empty;

if (photo != null)
{
    localFilePath = System.IO.Path.Combine(FileSystem.CacheDirectory, photo.FileName);

    IImage image;
    using Stream sourceStream = await photo.OpenReadAsync();
    // 将原始流复制到内存流,脱离临时流的生命周期限制
    var memoryStream = new MemoryStream();
    await sourceStream.CopyToAsync(memoryStream);
    memoryStream.Position = 0; // 重置流指针至起始位置

    image = PlatformImage.FromStream(memoryStream);
    if (image != null)
    {
        // 保持Resize的dispose参数为false,避免释放源IImage资源
        Microsoft.Maui.Graphics.IImage newImage = image.Resize(500, 400, ResizeMode.Fit, false);
        base64ImageString = newImage.AsBase64(ImageFormat.Png, 1);
        
        // 手动释放资源,避免内存泄漏
        newImage.Dispose();
        image.Dispose();
        memoryStream.Dispose();
    }
}
额外说明
  • 内存流会将图片数据全部加载到内存中,适合处理中等大小的图片;若处理超大图片,建议用本地文件作为中转。
  • 操作完成后手动调用Dispose()释放IImage和MemoryStream资源,避免MAUI出现内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:05:35