Я пишу приложение с очень простой целью: выберите каталог, полный битмапов, и создайте видео AVI. Я использую исходный код Renie Nyffenegger "Avi.cpp/Avi.h" для добавления кадров BMP в файл AVI. Я использую заголовок "dirent.h" для "потока" имен файлов в мое приложение. Далеко и с несколькими незначительными ошибками приложение работает очень хорошо, за исключением случаев, когда вы работаете с каталогом, содержащим несколько тысяч файлов растровых изображений. Растровые изображения идентичны, за исключением содержимого с именами и пикселями, поэтому я немного смущен. Вот фрагмент кода из цикла, который записывает битмапы в файл AVI.
DIBSECTION dibs;
Bitmap bmp(bmpFileName.c_str());//Bitmap object created from filename
int sbm = ::GetObject(bmp,sizeof(dibs),&dibs);//size of bmp object
if(sbm != sizeof(DIBSECTION))
{
//error reading Bitmap file
//code to quit writing frames
//there will be an error writing the frame to the avi file if this is the case
}
else
{
//code to add frame to AVI file
}
У меня есть консоль в консоли, которая сообщает мне, когда каждый пятый кадр записывается в файл AVI, поэтому я могу отслеживать. Прямо вокруг 2950-го кадра (каждый раз каждый раз) он входит в раздел ошибки инструкции "if". Я могу проверить, установив точки останова, что имя файла растрового изображения верное. Я также пробовал следующий цикл while, чтобы увидеть, будет ли повторная инициализация Bitmap снова и снова в конечном итоге возвращать хорошее значение для sbm:
DIBSECTION dibs;
Bitmap bmp(bmpFileName.c_str());//Bitmap object created from filename
int sbm = ::GetObject(bmp,sizeof(dibs),&dibs);//size of bmp object
while(sbm != sizeof(DIBSECTION))
{
Bitmap tryAgain(bmpFileName.c_str());
sbm = ::GetObject(bmp,sizeof(dibs),&dibs);//size of bmp object
if(sbm == sizeof(DIBSECTION))
{
bmp = tryAgain;
}
}
//code to add frame to AVI file
В конце концов этот цикл while будет работать, и кадр будет добавлен в AVI файл, но то же самое произойдет со следующим файлом, а затем и далее, добавив массу времени в довольно быстрый процесс. Я подведу итог:
-Purpose заключается в создании файла AVI с использованием файлов растровых изображений в качестве фреймов, чтение из каталога -The работает отлично до тех пор, пока в 2950-м файле в каталоге -At эта точка не будет повреждена, хотя объект Bitmap недействителен, даже если он был инициализирован с строкой, которая указывает на действительный файл на жестком диске (как и все предыдущие). -Using цикл while, я могу создать действительный объект Bitmap, но он добавляет слишком много времени, чтобы приложение было практичным.
Я ищу некоторое представление о том, почему это происходит вокруг 2950-го файла в каталоге. Есть ли какой-то путь вокруг него и/или лучшая библиотека/заголовок для использования для этой цели? У меня очень мало формального обучения программированию, что, вероятно, очевидно в моем коде/подходе, но я ценю помощь.
Кредит для Родриго для исправления! С помощью:
::DeleteObject(bmp);
после добавления каждого кадра в результате использования памяти осталось менее 10 000 К (см. диспетчер задач). Я уверен, что смогу его очистить и в другом месте, а также использовать еще меньше памяти.