WebImage和大内存消耗

时间:2012-06-05 14:40:56

标签: asp.net asp.net-mvc-3 memory-consumption webimage

我们在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); 
    
        ...
      }
    }
    
  • ImageManager

    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)时,内存消耗是正常的。

造成这种情况的原因是什么,可以通过某种方式解决吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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

我怀疑您正在上传压缩图像(例如PNG / JPG),而对GetBytes的调用会导致图像的解压缩字节可用。当解压缩成原始形式时,图像实际上可能实际上更大。没有太多可以做到的,以避免一直处理Stream对象,所以你永远不会一次将所有内容加载到内存中。