我正在编写一个非常简单的应用程序:选择一个充满位图的目录并创建一个AVI视频。我正在使用勒内·尼芬尼格尔的"Avi.cpp/Avi.h“源代码将bmp帧添加到AVI文件中。我正在使用标题"dirent.h“将文件名”流“到我的application.So中,对于几个小错误,应用程序运行得很好,除非使用包含数千个位图文件的目录。除了名称和像素内容外,位图是相同的,所以我有点困惑。下面是循环中的代码片段,它将位图写入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“循环,以查看一次又一次重新初始化位图是否最终会为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是通过使用位图文件作为帧来创建-The文件,从目录-The程序中读取直到目录-At中的2950个文件(这一点)为止,Bitmap对象是无效的,即使它已经用指向硬盘上的一个有效文件的字符串初始化了(就像前面的所有字符串一样)。-Using a while循环,我最终可以创建一个有效的Bitmap对象,但是它为应用程序的实用性增加了太多的时间。
我想了解一下为什么目录中的2950文件会出现这种情况。有什么方法可以绕过它,和/或一个更好的库/头用于这个目的吗?我很少受过正规的编程培训,这在我的代码/方法中可能很明显,但我很感谢您的帮助。
发布于 2014-10-28 17:47:18
修复工作归功于罗德里戈!使用:
::DeleteObject(bmp);添加每个帧后,内存使用量将保持在10,000 K以下(在任务管理器中查看)。我相信我也可以在其他地方清理它,让它使用更少的内存。
https://stackoverflow.com/questions/26614336
复制相似问题