Мой сайт объединяет плагин, который позволяет пользователю загружать изображения на него.Максимальный размер растрового изображения до 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 вызывает сбой
Где я ошибся?
К сожалению, «OutOfMemoryException» не всегда означает, что у вас закончилась нехватка памяти - это общая ошибка GDI +. Что произойдет, если вы измените размер первого изображения до 7360x4912, все равно это приведет к сбою? Вполне возможно, что второе изображение повреждено каким-то образом, например. Ну и, конечно, размер перед преобразованием в «битмап» бессмыслен - если это 32-битное изображение, для него потребуется ~ 140 Мбайт памяти, независимо от размера входного файла. – Luaan
Для начала ваши вычисления в памяти, используемые изображениями, в лучшем случае оптимистичны, поскольку вы сравниваете сжатые размеры с памятью. Рассмотрим пиксель, берущий 4 байта на пиксель, дает ближе к 138 Мб для второго изображения (которое вы уже выделили память за один раз), и, предполагая 32-битное приложение, у вас есть в общей сложности 2 ГБ адресного пространства для всех ваших объектов - вы проверяли фактическое использование памяти при ее сбое? Сбой, если вы копируете только этот образ? –
Luaan, я просто попробовал изменить размер изображения до 7360x4912, и он отлично работает. Не знаю, почему он злится на другого. Роуленд Шоу, использование памяти не поднимается каким-либо образом до катастрофы, все происходит очень быстро. –