为什么我不能读一些BMP文件?

时间:2014-10-28 17:08:46

标签: c++ windows winapi bitmap

我正在编写一个非常简单的应用程序:选择一个完整的Bitmaps目录并创建一个AVI视频。我使用RenéNyffenegger的“Avi.cpp / Avi.h”源代码将bmp帧添加到AVI文件中。我正在使用标题“dirent.h”将文件名“流”到我的应用程序中。到目前为止,除了一些小错误之外,应用程序运行良好,除非使用包含数千个Bitmap文件的目录。除了名称和像素内容之外,位图是完全相同的,所以我有点困惑。以下是循环内部的代码片段,它将Bitmaps写入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
}

我在控制台中有一个cout告诉我每隔5帧写入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文件中,但下一个文件将发生同样的事情,下一个文件和下一个文件会发生同样的事情,这会给其他相当快速的过程增加时间。我将总结一下:

- 目的是通过使用位图文件作为帧来创建AVI文件,从目录中读取 - 该程序完美地工作,直到目录中的第2950个文件 - 此时,Bitmap对象无效,即使它已使用指向硬盘驱动器上的有效文件的字符串进行初始化(就像之前的所有文件一样)。 - 使用while循环,我最终可以创建一个有效的Bitmap对象,但它增加了应用程序实用的时间。

我正在寻找一些有关为何在目录中的第2950个文件周围发生这种情况的见解。有没有办法解决它,和/或更好的库/标头用于此目的?我的正式编程培训很少,我的代码/方法可能很明显,但我很感激帮助。

1 个答案:

答案 0 :(得分:0)

感谢rodrigo的修复!使用:

::DeleteObject(bmp);
添加每一帧后,

导致内存使用率低于10,000K(在任务管理器中查看)。我确信我也可以在其他地方清理它并使其使用更少的内存。