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

MAUI Android从字节数组生成缩略图失败的问题排查

MAUI图片缩略图生成问题分析与修复

问题根源

  1. 流提前释放导致资源失效:第一个using块创建的MemoryStream ms在块结束后被自动释放,但PlatformImage/W2DImage内部可能持有对该流的引用,后续访问Height/Width或调用Downsize时会因资源已释放出现异常或无响应。
  2. Win2D分支变量名错误:非Android分支中W2DImage.FromStream(stream)的stream未定义,实际应使用第一个using块的ms变量。
  3. 冗余的流读取操作:第二个using块重复读取原字节数组,完全没必要,反而增加资源消耗。
  4. 未保留缩略图结果:生成的缩略图仅保存到临时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:11:28