3

我们在 ASP.NET MVC3 中有图像上传的场景。

  • 控制器

    public ActionResult Upload(IEnumerable<HttpPostedFileBase> images, SomeViewModel model)
    {
      foreach(var i in images)
      {
        ...
    
        byte[] fileBytes = i.InputStream.GetBytesArray();
    
        byte[] image = _imageManager.Resize(fileBytes, MaxImageWidth, MaxImageHeight, true); 
    
        ...
      }
    }
    
  • 图像管理器

    public byte[] Resize(byte[] content, int width, int height, bool preserveAR = true)
    {
      if (content == null)
        return null;
    
      WebImage wi = new WebImage(content);
    
      wi = wi.Resize(width, height, preserveAspectRatio);
    
      return wi.GetBytes();
    }
    

所以我们从客户端接收图像作为 HttpPostedFileBase。我们将 byte[] fileBytes 传递给 imageManager 的 Resize 方法。图像管理器正在创建新的 WebImage 实例,然后调整图像大小并再次将其转换为 byte[]。

调试此代码时,当我通过 wi.GetBytes() 行时,我的内存使用量急剧增加(至少 500mb)。我正在上传 10mb 的图片。上传较小尺寸的照片(~1.5mb)时,内存消耗是正常的。

这可能是什么原因,可以通过某种方式解决吗?

谢谢

4

1 回答 1

1

在引擎盖下,WebImage 用于System.Drawing.Image.FromStream获取原始图像流并将其转换为字节数组。我尝试使用 6.0MB JPG 并在其上调用该方法,我得到了一个包含 6.0MB 的流。如果我要一个 BMP,我会得到一个 172MB 字节的数组

我怀疑您正在上传压缩图像(例如 PNG / JPG),并且对 GetBytes 的调用导致图像的解压缩字节可用。当解压缩成原始形式时,图像实际上可能要大得多。您可以做的事情不多,无法从头到尾处理 Stream 对象,因此您永远不会一次将所有内容加载到内存中。

于 2012-07-06T23:10:11.767 回答