C# работа с картинками

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

При каждом захвате картинки она сохраняется на диск. Затем картинка загружается:

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.DecodePixelHeight = sizeHeight;
bmp.DecodePixelWidth = sizeWidth;
bmp.UriSource = new Uri(fileName, UriKind.RelativeOrAbsolute);
bmp.EndInit();

sizeHeight и sizeWidth передаются в метод и составляют половину от размера захваченной картинки. При обработке размера исходной картинки 640 на 480 мы получаем расход оперативной памяти в 160 Мб/100 картинок. После этого картинка сохраняется в List, и отображается на TimeLine.

Вопрос — можно ли как то оптимизировать работу с картинками, потому что задача — работать с 2-мя — 3-мя тысячами картинок.
  • Вопрос задан
  • 8530 просмотров
Пригласить эксперта
Ответы на вопрос 2
@sergeyZ
При каждом захвате картинки она сохраняется на диск. Затем картинка загружается
Но к чему такие сложности? Зачем её снова загружать чтобы отобразить?

К сути: bitmap не самый компактный формат. Последовательность bitmap'ов — по своей сути несжатое видео. А пара секунд такого видео как раз занимает 150-200 Мб.

Если я правильно понял, то в вашей задаче в List сохраняются не битмапы, а ссылки на файл? Тогда расход памяти обусловлен особенностями работы сборщика мусора в .net (память, занятая недоступными объектами не сразу освобождается) Картины должна быть примерно такая:


Если же вы используете что-то вроде List<Bitmap>, то вам ничего не поможет. Приложение за 60 секунд сожрет всю оперативную память, потом за пару минут весь swap и повиснет.

Уточните постановку задачи, поясните что нужно сделать.
Ответ написан
icc
@icc
Возможно, что проблема в отложенной очистке памяти C#. Попробуйте принудительно после показа каждой превьюшки вызывать сборщик мусора System.GC.Collect().
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы