MAUI Android从字节数组生成缩略图失败的问题排查
MAUI图片缩略图生成问题分析与修复
问题根源
- 流提前释放导致资源失效:第一个
using块创建的MemoryStream ms在块结束后被自动释放,但PlatformImage/W2DImage内部可能持有对该流的引用,后续访问Height/Width或调用Downsize时会因资源已释放出现异常或无响应。 - Win2D分支变量名错误:非Android分支中
W2DImage.FromStream(stream)的stream未定义,实际应使用第一个using块的ms变量。 - 冗余的流读取操作:第二个
using块重复读取原字节数组,完全没必要,反而增加资源消耗。 - 未保留缩略图结果:生成的缩略图仅保存到临时
memStream,但未将流内容转换为可传递的字节数组,等于没有生成可用的缩略图数据。
修复后的代码
if (receiptDocumentBytes != null) { Microsoft.Maui.Graphics.IImage image = null; int thumbnailSize = Preferences.Get("ThumbnailSize", 600); byte[] thumbnailBytes = null; // 避免流提前释放,所有图片操作在同一个流的using块内完成 using (MemoryStream ms = new MemoryStream(receiptDocumentBytes)) { #if ANDROID image = Microsoft.Maui.Graphics.Platform.PlatformImage.FromStream(ms); #else image = Microsoft.Maui.Graphics.Win2D.W2DImage.FromStream(ms); // 修正变量名错误 #endif if (image != null) { // 生成并保存缩略图字节数组 using (IImage thumbnailImage = image.Downsize(thumbnailSize, true)) { using (MemoryStream memStream = new MemoryStream()) { thumbnailImage.Save(memStream); thumbnailBytes = memStream.ToArray(); } } } } // 此处可使用thumbnailBytes进行应用内传递、存储等后续操作 if (thumbnailBytes != null) { // 示例逻辑:传递给页面显示或存入本地存储 // ... } }
关键修改说明
- 将所有图片处理逻辑合并到同一个
MemoryStream的using块内,确保流资源在操作完成后再释放。 - 修正Win2D分支的变量名错误,统一使用
ms作为流参数。 - 新增
thumbnailBytes变量存储缩略图的字节数组,解决原代码仅生成临时流但无实际产出的问题。 - 对
thumbnailImage添加using块,确保图片资源及时释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

