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 в метод Resize imageManager. Менеджер изображений создает новый экземпляр WebImage, затем изменяет размер изображения и снова преобразует его в байт [].

При отладке этого кода, в момент, когда я передаю строку wi.GetBytes(), мое использование памяти резко возрастает (как минимум, до 500 Мб). Я загружаю изображение 10 МБ. При загрузке фотографий меньшего размера (~1,5 Мб) потребление памяти нормальное.

Что может быть причиной этого, и можно ли это как-то исправить?

Спасибо

1 ответ

Решение

Под капотом WebImage использует System.Drawing.Image.FromStream взять исходный поток изображения и превратить его в массив байтов. Я попытался взять 6.0MB JPG и вызвать этот метод, и я получил поток с 6.0MB в нем. Если я прошу BMP, я получаю 172MB байта

Я подозреваю, что вы загружаете сжатое изображение (например, PNG / JPG), и вызов GetBytes делает доступными распакованные байты изображения. При распаковке в исходную форму изображение может быть значительно больше. Не так много, что вы можете сделать, чтобы обойти этот недостаток работы с объектами Stream весь путь, поэтому вы никогда не загрузите все в память сразу.

Другие вопросы по тегам