Существуют ли стандартные шаблоны для реализации класса для динамической загрузки изображений? - PullRequest
3 голосов
/ 03 декабря 2010

Мне было поручено создать приложение, которое работает с тысячами изображений, слишком много для одновременной загрузки в ОЗУ.Я предполагаю, что это несколько похоже на просмотрщик фотографий, такой как Picassa, в том, что в любой момент времени приложению требуются пиксельные данные только из нескольких каталогизированных изображений.Приложение также должно обрабатывать очень большие изображения, где для анализа или отображения изображений в любой момент времени потребуется только небольшое подмножество данных пикселей, что, как я полагаю, в некоторой степени аналогично Google Earth.Короче говоря, приложение должно динамически загружать только ту часть пиксельных данных, которая действительно требуется в любой момент времени.

Имея дело только со статической загрузкой изображений, типичной для библиотек изображений, таких как OpenCV, CImg или Magick ++, яЯ немного растерялся, как мне лучше всего подойти к проблеме.Поэтому мой вопрос: существуют ли какие-либо стандартные шаблоны проектирования для этого требования или подходы к решению этой (или аналогичной) проблемы?

Кстати, для небольших изображений я понимаю, что могу просто отложить загрузку изображенияпока это не нужно, но при таком подходе на ум приходят две ключевые проблемы.(1) Это не решает проблему большого изображения.(2) Поскольку выгрузка изображения сразу после его использования может быть неэффективной, мне понадобится некоторый тип обработчика управления памятью в приложении, который выгружает изображения только при загрузке новых изображений и превышении некоторого порога памяти.Очевидно, что аналогичная проблема управления памятью остается для частей большего изображения, загруженных в память.Я откровенно признаю, что такой инструмент находится за пределами моих знаний и опыта, поэтому, если это является преобладающим ответом на этот вопрос, то у меня есть дополнительный вопрос.Может ли кто-нибудь порекомендовать несколько базовых руководств по управлению памятью?

Спасибо за помощь!

ОБНОВЛЕНИЕ: Для тех, кому интересно, я подумаю, что поделюсь своим подходом.Класс изображения, который я создал, загружает данные изображения.Чтобы решить проблему с загрузкой тысяч изображений, я создал класс, который будет отслеживать дескрипторы файлов (в Windows есть ограничение - см. _Getmaxstdio) и объем загруженной памяти изображений, выгружая при необходимости.Для обработки очень больших изображений я использовал библиотеку изображений VXL в качестве бэк-энда, которая может загружать подраздел большого изображения.Конечно, это не так эффективно для некоторых изображений (особенно для сжатых изображений), но, поскольку я в основном работаю с мозаичными изображениями TIFF, это работает очень хорошо.

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

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

Если вам обычно требуется отображать уменьшенные (уменьшенные) изображения, то вы можете упростить свою работу, создавая и сохраняя уменьшенные версии больших изображений. Весь каскад уменьшенных изображений со сторонами х 0,707, х 0,5 и т. Д. Занимает столько же места, сколько исходное изображение.

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

0 голосов
/ 03 декабря 2010

Часть 2 - немногие форматы изображений поддерживают эффективную загрузку части изображения

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

0 голосов
/ 03 декабря 2010

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

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

...