2015-06-25 2 views
1

Я работаю над C# WPF-приложением, которое использует пиксельные данные из многих изображений для обработки одного изображения.Как уменьшить использование памяти для обработки многих изображений?

  1. Он требует от пользователя открытия нескольких изображений любого формата.
  2. Этих изображений хранится с использованием System.Drawing.Bitmap класса в памяти с помощью LockBits() способа и их адрес памяти для первого пикселя DATAS хранятся в байтах *.
  3. Нового System.Drawing.Bitmap создается и обрабатывается с помощью LockBits() метода и прямой доступ к памяти в небезопасного контекста с System.Threading.Tasks.Parallel класса, и его пиксельные значения вычисляются с использованием значения пикселей всех открытых изображений для каждого пикселя и сохраняются в памяти.
  4. Обработанный System.Drawing.Bitmap закодирован в jpeg и сохранен в выбранном месте.
  5. Dispose(), UnlockBits() и GC.Collect() методы называются.

Проблема в том, что с помощью вышеуказанного метода все открытые изображения должны оставаться в памяти до завершения всей операции.
Например, если я открываю 50 изображений с разрешением 4160x3120, он занимает 4160 * 3120 * 3 * 50 байт: около 1857 мегабайт памяти.

Есть ли возможное решение, которое не требует, чтобы все изображения находились в памяти или какое-либо другое решение для сокращения использования памяти?

+0

Недавно я прочитал статью, в которой вы можете установить частоту обновления fps элементов управления в wpf, что может повысить производительность. Может быть, поиск в этом направлении может помочь. Вот ссылка: http://www.wpftutorial.net/FrameRate.html –

+2

Если вам действительно нужна вся эта информация сразу, вы должны ее сохранить, выбора нет. То, что вы, возможно, сможете сделать, в зависимости от вашего алгоритма, - это обмен некоторыми данными между памятью и диском, но все данные должны быть в памяти в какой-то момент. – Mephy

+1

«Есть ли возможное решение, которое не требует, чтобы все изображения были в памяти». Конечно, если обработка изображений может быть выполнена последовательно. Это, однако, трудно сказать по вашему вопросу, так как вы не сказали нам точно, что делает обработка. – Clemens

ответ

1

Я работаю над приложением C# WPF, которое использует пиксельные данные из многих изображений для обработки одного изображения.

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

Если обработка пикселей происходит из одного и того же относительного местоположения, то, возможно, сломать изображение на разделы (например, четверти).

0

Извините, но я думаю, что прямой ответ на ваш вопрос - нет.

Если вам нужно обработать все данные изображений во время выполнения, вам необходимо иметь все их в памяти. Эта ситуация очень распространена в определенных приложениях, которые используют медицинские изображения или алгоритмы обработки изображений для 3D-рендеринга, распознавания образов и т. Д., Поэтому для таких систем обычно требуется большое количество аппаратного обеспечения.

Вы делаете правильную работу в небезопасном контексте, и вы должны использовать столько, сколько можете TPL (параллельная библиотека задач).

Более высокая производительность зависит от того, что позволяют ваши алгоритмы.

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