Я работаю над C# WPF-приложением, которое использует пиксельные данные из многих изображений для обработки одного изображения.Как уменьшить использование памяти для обработки многих изображений?
- Он требует от пользователя открытия нескольких изображений любого формата.
- Этих изображений хранится с использованием System.Drawing.Bitmap класса в памяти с помощью LockBits() способа и их адрес памяти для первого пикселя DATAS хранятся в байтах *.
- Нового System.Drawing.Bitmap создается и обрабатывается с помощью LockBits() метода и прямой доступ к памяти в небезопасного контекста с System.Threading.Tasks.Parallel класса, и его пиксельные значения вычисляются с использованием значения пикселей всех открытых изображений для каждого пикселя и сохраняются в памяти.
- Обработанный System.Drawing.Bitmap закодирован в jpeg и сохранен в выбранном месте.
- Dispose(), UnlockBits() и GC.Collect() методы называются.
Проблема в том, что с помощью вышеуказанного метода все открытые изображения должны оставаться в памяти до завершения всей операции.
Например, если я открываю 50 изображений с разрешением 4160x3120, он занимает 4160 * 3120 * 3 * 50 байт: около 1857 мегабайт памяти.
Есть ли возможное решение, которое не требует, чтобы все изображения находились в памяти или какое-либо другое решение для сокращения использования памяти?
Недавно я прочитал статью, в которой вы можете установить частоту обновления fps элементов управления в wpf, что может повысить производительность. Может быть, поиск в этом направлении может помочь. Вот ссылка: http://www.wpftutorial.net/FrameRate.html –
Если вам действительно нужна вся эта информация сразу, вы должны ее сохранить, выбора нет. То, что вы, возможно, сможете сделать, в зависимости от вашего алгоритма, - это обмен некоторыми данными между памятью и диском, но все данные должны быть в памяти в какой-то момент. – Mephy
«Есть ли возможное решение, которое не требует, чтобы все изображения были в памяти». Конечно, если обработка изображений может быть выполнена последовательно. Это, однако, трудно сказать по вашему вопросу, так как вы не сказали нам точно, что делает обработка. – Clemens