FreeImage dll не работает для пакетного процесса
Мне нужно загрузить партии файлов изображений и изменить их размеры. Я делаю это через FreeImage.dll в C++. Каждая партия содержит файлы JPG и TIF. Проблема в том, что exe обрабатывает первый пакет точно, но для дальнейших пакетов он начинает пропускать некоторые файлы, особенно файлы JPG.
Я пробовал инициализировать и деинициализировать FreeImage до и после каждого пакета, но он все еще не работает.
Кто-нибудь может предложить мне способ сделать это? Даже если мне нужно использовать какую-то другую бесплатную библиотеку обработки изображений, это хорошо для меня.
1 ответ
Звучит так, как будто FreeImage теряет память, или память фрагментируется в коде, вызывающем FreeImage. В начале жизненного цикла вашего процесса достаточно непрерывной памяти и все работает нормально. Позже, вещи начинают терпеть неудачу на больших цветных изображениях. Причина, по которой именно jpegs терпят неудачу, заключается в том, что образ памяти цветного изображения всегда занимает не менее 24 бит на пиксель (вероятно, 32 бита), даже если его размер на диске намного меньше. Ваши изображения TIFF, вероятно, черно-белые и требуют только 1 бит на пиксель.
Если освобождается не вся память для каждого обработанного изображения (либо в FreeImage.dll, либо в вашей собственной программе), это создает проблему в непрерывно работающем процессе, даже если объем используемой памяти крошечный. Проблема в том, что память станет фрагментированной, и ОС не сможет переместить фрагменты в пространство памяти одного процесса. Для загрузки больших изображений требуются большие непрерывные блоки памяти, а во фрагментированной памяти больше не может быть достаточно больших свободных "дырок", даже если общего свободного пространства все еще достаточно. Простой обходной путь - это создание отдельного процесса для каждого изображения, которое будет обрабатываться, а основной процесс - только управление задачами. Это, однако, делает вашу программу немного более сложной и может вызвать проблемы со стабильностью, если возможно зависание рабочего процесса.