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 весь путь, поэтому вы никогда не загрузите все в память сразу.