Почему я не могу прочитать некоторые файлы BMP?

0

Я пишу приложение с очень простой целью: выберите каталог, полный битмапов, и создайте видео 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-го файла в каталоге. Есть ли какой-то путь вокруг него и/или лучшая библиотека/заголовок для использования для этой цели? У меня очень мало формального обучения программированию, что, вероятно, очевидно в моем коде/подходе, но я ценю помощь.

  • 4
    У вас заканчивается память / ручки? Есть ли у вас бесплатные ресурсы, вы идете вместе?
  • 0
    Также возможно: повреждение памяти из-за записи за конец массива, записи в мертвые указатели, игнорирования ошибок ...
Показать ещё 2 комментария
Теги:
winapi
bitmap

1 ответ

0
Лучший ответ

Кредит для Родриго для исправления! С помощью:

::DeleteObject(bmp);

после добавления каждого кадра в результате использования памяти осталось менее 10 000 К (см. диспетчер задач). Я уверен, что смогу его очистить и в другом месте, а также использовать еще меньше памяти.

  • 0
    «Я уверен, что смогу почистить его и в другом месте и заставить его использовать еще меньше памяти». - Полная трата времени, если вы зависаете около 10 МБ.
  • 0
    @Ed: Доступные объекты GDI и доступное адресное пространство не связаны. Объекты GDI совместно используются всеми процессами, запущенными на одном рабочем столе, и обычно это первый ресурс, из которого у вас заканчивается. Всегда утилизируйте объекты GDI как можно скорее.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню