2012-06-16 2 views
6

Я работаю над каким-то университетским проектом и застрял в проблеме памяти. я загружаю картинки, которая занимает около 1,5GB на HDD с кодом ниже:Обработка на больших растровых изображениях (до 3 ГБ)

Bitmap bmp = new Bitmap(pathToFile); 

Вопрос заключается в том, что вновь созданный объект Bitmap использует около 3,5GB оперативной памяти, которая является то, что я не могу понять (это действительно БОЛЬШОЙ оберткой: E). Мне нужно получить массив пикселей, и использование класса Bitmap действительно полезно (позже я использую метод LockBits() и обрабатываю байты массива на каждый байт), но в этом случае это полный блокиратор. Итак, вот мой вопрос:

Есть ли простой способ извлечь матрицу пикселей без предоставления дополнительных 2gb?

Я использую C# только для извлечения необходимого массива, который позже обрабатывается в C++ - возможно, я могу извлечь все необходимые данные в C++ (но проблема с конверсией появляется здесь - я концентрируюсь на формате 24bgr)?

PS: Мне нужно сохранить все растровое изображение в памяти, поэтому разделение его на части не является решением.

PS2: Просто для выяснения некоторых проблем: Я знаю разницу между расширением файла и форматом файла. Загруженный файл является несжатым растровым изображением 3 байта на пиксель размером ~ 1.42GB (16k x 32k пикселей), поэтому почему объект Bitmap более чем в два раза больше? Любые проблемы с распаковкой и конвертирование в другой формат не происходит.

+0

Возможные дубликат: [http://stackoverflow.com/questions/569889/how-do- i-use-large-bitmaps-in-net? rq = 1] (http://stackoverflow.com/questions/569889/how-do-i-use-large-bitmaps-in-net?rq=1) – Jason

+0

@ Джейсон: Да, но этот вопрос не имеет реального ответа. Не знаю, почему они контролируют файлы с отображением памяти. –

+0

Какая кодировка использует растровое изображение? Есть ли RLE-сжатие? –

ответ

1

Рассмотрите возможность использования файлов с памятью для доступа к своим ОГРОМНЫМ данным :). Пример, ориентированный на то, что вам нужно, можно найти здесь: http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx Это управляемый код, но вы также можете использовать его из эквивалентного кода.

Дайте мне знать, если вам нужно больше деталей.

+0

Можете ли вы уточнить, как его можно использовать в данном конкретном случае? –

+0

Ну, вы просто проходите растровое изображение с отображением памяти, просматриваете данные в кусках и нажимаете на часть C++. Я думаю, что даже может быть более эффективным делать все это на C++ и обрабатывать данные растровых изображений по мере перемещения файла с отображением mem. –

+0

Все дело в том, что с MMF вы не загружаете все данные в память. Это небольшая часть. И вы можете пройти через него, не заботясь о том, что это не все в памяти. –

0

Вы можете остановить кэширование памяти.

Вместо

Bitmap bmp = new Bitmap(pathToFile);

Использование

var bmp = (Bitmap)Image.FromStream(sourceFileStream, false, false);

см https://stackoverflow.com/a/47424918/887092

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