2016-01-03 3 views
1

Я хочу изменить размер изображения на своем веб-сайте, но когда я использую Bitmap для загрузки изображения 14032 * 19864 (расширение png), вызывается OutOfMemoryException. Моя конфигурация компилятора - any cpu. Я сомневался, работает ли рабочая среда x64. код ниже:OutOfMemoryException с использованием растрового изображения для изменения размера большого изображения

public ActionResult BimDWGViewer() 
{ 
    Viewer.Uri uri = null; 
    string url = Request.Params["u"]; 
    uri = new Viewer.Uri("[email protected]"+url); 
    int width = Int32.Parse(Request.Params["w"]); 
    int height = Int32.Parse(Request.Params["h"]); 
    Nebula.Nexus.Helpers.ModelUriTranslator.TranslateUri(uri); 
    if (uri.IsFileProtocol) 
    { 
     string path = uri.Path; 
     System.Drawing.Bitmap image_source = new System.Drawing.Bitmap(path); 
     System.Drawing.Bitmap image_result = new System.Drawing.Bitmap(width,height); 
     using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image_result)) 
     { 
      g.DrawImage(image_source, new System.Drawing.Rectangle(0, 0, width, height), new System.Drawing.Rectangle(0, 0, image_source.Width, image_source.Height), System.Drawing.GraphicsUnit.Pixel); 
     } 
     MemoryStream output = new MemoryStream(); 
     image_result.Save(output, System.Drawing.Imaging.ImageFormat.Png); 
     byte[] res = output.ToArray(); 
     output.Dispose(); 
     image_source.Dispose(); 
     image_result.Dispose(); 
     return new FileContentResult(res, "image/png"); 
    } 

} 

Исключение происходит в линии

System.Drawing.Bitmap image_source = new System.Drawing.Bitmap(path); 
+0

Вы пытались открыть диспетчер задач и посмотреть, сколько памяти использует ваша программа? –

+0

Возможно, графика не была создана для обработки таких изображений. Использовать 'ImageMagick' http://www.imagemagick.org/script/index.php – Toumash

+0

Действительно ли путь? Недействительные пути вызовут эту ошибку в моем опыте – Jack

ответ

2

Убедитесь, что вы имеете gcAllowVeryLargeObjects элемент установлен в истинного в файле конфигурации.

Максимальный размер 2 ГБ для отдельных распределений в .NET (даже при работе как 64-разрядный процесс), и очень возможно, что один из классов, которые вы используете, делает что-то внутренне, что сталкивается с этим пределом. Это довольно распространенная проблема, и исправление вашего конфигурационного файла должно помочь вам в этом.

Обновление: В приведенных ниже комментариях проблема, с которой столкнулась @majing, заключалась в том, что Visual Studio запускает свое веб-приложение в 32-разрядной версии IIS Express. Настройка VS для запуска IIS как 64-битного процесса устранила проблему.

+0

Большое спасибо. Теперь я выясню, что он генерирует такое исключение, когда я выделяю 400 МБ памяти.И я установил элемент gcAllowVeryLargeObjects в true в web.config, но он не работает. Моя конфигурация - это «любой процессор», и я отключил «Предпочитаю 32 бит». Что мне делать дальше? – majing

+1

Итак, вы используете это из веб-приложения? Если вы запускаете Visual Studio прямо сейчас, то версия IIS Express по умолчанию, которую запускает VS, является 32-разрядной. Вы можете заставить VS запустить 64-битный сервер в «Инструменты-> Параметры-> ПроектыAndSolutions-> WebProjects и переключить флажок« Использовать 64-разрядную версию IIS Express ... ». –

+0

... и если вы все еще не уверены в том, какую архитектуру вы используете, просто откройте диспетчер задач Windows и посмотрите на процесс iisexpress.exe (или w3wp.exe) вашего приложения. В Win7 и ранее ваш процесс будет иметь суффикс '* 32' на вкладке сведений, если вы работаете как 32-разрядный процесс ... и в более новых операционных системах, таких как Windows 8/8.1/10, первые« Процессы » "вкладка должна указать вам архитектуру в круглых скобках после каждого процесса. Если вы действительно используете 64-битные после установки VS и вашей конфигурации, то, вероятно, есть ошибка в библиотеках, которые вы используете. –

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