2015-08-27 3 views
1

Мой сайт объединяет плагин, который позволяет пользователю загружать изображения на него.Максимальный размер растрового изображения до outofmemoryexception

Он отлично работает с большинством фотографий, но будет создавать исключение OutOfMemoryException на любых изображениях, которые, по его мнению, слишком велики.

Вот код, который выходит из строя:

Image img = Image.FromFile(path); 
Image test = (Image)(new Bitmap(img, new Size(img.Width, img.Height))); //OutOfMemoryException 

Это действительно все о разрешении как:

Image 1 => 3.79Mb, 4200x2850 не врезаться

Image 2 => 1,82 Мб, 7360x4912 вызывает сбой

Где я ошибся?

+0

К сожалению, «OutOfMemoryException» не всегда означает, что у вас закончилась нехватка памяти - это общая ошибка GDI +. Что произойдет, если вы измените размер первого изображения до 7360x4912, все равно это приведет к сбою? Вполне возможно, что второе изображение повреждено каким-то образом, например. Ну и, конечно, размер перед преобразованием в «битмап» бессмыслен - если это 32-битное изображение, для него потребуется ~ 140 Мбайт памяти, независимо от размера входного файла. – Luaan

+0

Для начала ваши вычисления в памяти, используемые изображениями, в лучшем случае оптимистичны, поскольку вы сравниваете сжатые размеры с памятью. Рассмотрим пиксель, берущий 4 байта на пиксель, дает ближе к 138 Мб для второго изображения (которое вы уже выделили память за один раз), и, предполагая 32-битное приложение, у вас есть в общей сложности 2 ГБ адресного пространства для всех ваших объектов - вы проверяли фактическое использование памяти при ее сбое? Сбой, если вы копируете только этот образ? –

+0

Luaan, я просто попробовал изменить размер изображения до 7360x4912, и он отлично работает. Не знаю, почему он злится на другого. Роуленд Шоу, использование памяти не поднимается каким-либо образом до катастрофы, все происходит очень быстро. –

ответ

3

Эта ошибка возникла в веб-приложении MVC. Это было вызвано запуском 32-разрядного сервера IISEXPRESS, который заставлял выделение памяти растрового изображения быть смежным, а не использовать любые доступные куски.

Решение было заставить IISEXPRESS работать в 64-битном, перейдя в следующие настройки Visual Studio:

TOOLS> OPTIONS> Проекты и решения> Веб-проект и проверить 64-разрядный IISEXPRESS коробка

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