FreeImage dll не работает для пакетного процесса - PullRequest
0 голосов
/ 14 октября 2010

Мне нужно загрузить пакеты файлов изображений и изменить их размеры. Я делаю это через FreeImage.dll в C ++. Каждая партия содержит файлы JPG и TIF. Проблема в том, что exe обрабатывает первый пакет точно, но для дальнейших пакетов он начинает пропускать некоторые файлы, особенно файлы JPG.

Я пытался инициализировать и деинициализировать FreeImage до и после каждого пакета, но он все еще не работает.

Кто-нибудь может предложить мне способ сделать это? Даже если мне нужно использовать какую-то другую бесплатную библиотеку обработки изображений, которая подойдет мне.

1 Ответ

0 голосов
/ 20 октября 2011

Звучит так, как будто FreeImage теряет память, или память фрагментируется в коде, вызывающем FreeImage.В начале жизненного цикла вашего процесса все еще достаточно непрерывной памяти, и все работает нормально.Позже, вещи начинают терпеть неудачу на больших цветных изображениях.Причина, по которой именно jpegs терпят неудачу, заключается в том, что образ памяти цветного изображения всегда занимает не менее 24 бит на пиксель (вероятно, 32 бита), даже если его размер на диске намного меньше.Ваши изображения TIFF, вероятно, черно-белые и требуют только 1 бит на пиксель.

Если освобождается не вся память для каждого обработанного изображения (в FreeImage.dll или в вашей собственной программе), это создает проблему в непрерывно работающем процессе, даже если объем используемой памяти остаетсякрошечный.Проблема заключается в том, что память станет фрагментированной, и ОС не сможет переместить фрагменты в пространство памяти одного процесса.Для загрузки больших изображений требуются большие непрерывные блоки памяти, а во фрагментированной памяти больше не может быть достаточно больших свободных «дырок», даже если общего свободного пространства все еще достаточно.Простой обходной путь - создать отдельный процесс для каждого обрабатываемого изображения, а основной процесс должен выполнять только управление задачами.Это, однако, делает вашу программу немного более сложной и может вызвать проблемы со стабильностью, если возможно зависание рабочего процесса.

...