Сбой ImageResizer на больших изображениях

Я использую замечательный компонент ImageResizing, и у меня возникает ошибка «Недостаточно памяти» при попытке загрузить и прочитать изображения размером около 100 МБ. Он может показаться большим, но мы являемся типографией, поэтому многим людям необходимо предоставлять изображения такого размера.

Неудачная строка кода:

ImageResizer.ImageBuilder.Current.Build(Server.MapPath(strImagePath), Server.MapPath(strThumbPath), new ResizeSettings("maxheight=" + "150"+ "&maxwidth=" + "238"));

Вероятно, это сбой самого GDI, но есть ли какой-либо обходной путь, кроме обнаружения произошедшей ошибки и информирования пользователя?

Заранее спасибо Аль


person higgsy    schedule 11.09.2012    source источник
comment
Размер файла изображения (jpg/png/и т.д.) не так важен, как его разрешение и глубина цвета. для изображения 1000x1000 при 32 битах потребуется ~ 4 мегабайта оперативной памяти только для необработанных несжатых данных пикселей. Вы говорите, что вы принтеры, так что, скорее всего, вы имеете дело с еще большими изображениями.   -  person Marc B    schedule 11.09.2012
comment
Спасибо за ваш ответ. Как вы можете решить, какой баран ему понадобится, исходя из размеров? Примерно конечно. Изображения, которые я тестировал, имеют разрешение 19000 X 13000 и чертовски большие!   -  person higgsy    schedule 12.09.2012
comment
19000 * 13000 * (бит_глубина/8) = 942 мегабайта для 32-битного изображения.   -  person Marc B    schedule 12.09.2012


Ответы (2)


JPEG размером 100 МБ обычно распаковывается примерно до 8 гигабайт в растровой форме. Ваш единственный шанс заставить это работать — получить 16 ГБ ОЗУ и запустить процесс в 64-битном режиме.

В качестве альтернативы вы можете попробовать libvips — он предназначен для гигантских файлы изображений. Пока еще нет оболочки .NET, но я очень хочу сделать ее и запустить интеграцию с ImageResizer! Конечно, если никто не заинтересован в финансировании этого, это, вероятно, не произойдет какое-то время...

person Lilith River    schedule 11.09.2012
comment
Эй, компьютерный лингвист - спасибо за ваш ответ. Интересно, однако, что код, который я опубликовал, иногда работает на машине с 4 ГБ ОЗУ — так что это странно, верно? - person higgsy; 12.09.2012
comment
Не совсем. Если изображение использовалось почти в максимальном качестве, возможно, оно занимает всего около 3 ГБ в растровой форме, и, таким образом, успех зависит от того, насколько фрагментировано ваше пространство памяти и сколько из нее свободно. Для такой работы нужны огромные нефрагментированные блоки оперативной памяти. - person Lilith River; 12.09.2012

Как упоминал Lilith River, libvips может изменять размер больших изображений с небольшими потребностями в памяти. К счастью, теперь доступна полная привязка libvips для .NET: https://github.com/kleisauke/net-vips/.

Он должен без проблем обрабатывать файлы JPEG размером 100 МБ.

person kleisauke    schedule 22.01.2019