2012-06-05 5 views
3

У нас есть сценарий загрузки изображений в ASP.NET MVC3.WebImage и большое потребление памяти

  • Контроллер

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

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

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

Спасибо

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^