.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
相关产品推荐
相关产品推荐

