能否将glReadPixels提取出来的一系列OpenGL像素数据直接写入一个avi文件生成视频呢??高手指点

morningl_77 2009-04-02 06:37:30
如题这个函数是将OpenGL场景写入一个bmp文件,能不能向这个函数一样实现将一系列读取的数据直接写入avi文件中呢??
void grab(int x0, int y0, int WindowWidth, int WindowHeight, char* filename)
{
unsigned char bmp_header[]={0x42, 0x4D, 0x66, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,0x00, 0x00,
0x58, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01,
0x00, 0x18, 0x00, 0x00, 0x00,0x00, 0x00, 0x30, 0x48,
0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00,
0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int BMP_Header_Length=54; //位图信息头的长度
FILE* pWritingFile;
GLubyte* pPixelData;
// GLubyte BMP_Header[54];
GLint i, j;
GLint PixelDataLength;
// 计算像素数据的实际长度
i = WindowWidth * 3; // 得到每一行的像素数据长度
while( i%4 != 0 ) // 补充数据,直到i是的倍数
++i; // 本来还有更快的算法,
// 但这里仅追求直观,对速度没有太高要求
PixelDataLength = i * WindowHeight;
// 分配内存和打开文件
pPixelData = (GLubyte*)malloc(PixelDataLength);
if( pPixelData == 0 )
{
//TRACE("在grab()函数中分配内存失败!");
exit(0);
}
pWritingFile = fopen(filename, "wb");
if( pWritingFile == 0 )
{
//TRACE("在grab()函数中打开文件失败!");
exit(0);
}
// 读取像素
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glReadPixels(x0, y0, WindowWidth, WindowHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
// 把位图文件头复制为新文件的文件头
fwrite(bmp_header, 54, 1, pWritingFile);
fseek(pWritingFile, 0x0012, SEEK_SET);
i = WindowWidth;
j = WindowHeight;
fwrite(&i, sizeof(i), 1, pWritingFile);
fwrite(&j, sizeof(j), 1, pWritingFile);
// 写入像素数据
fseek(pWritingFile, 0, SEEK_END);
fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
// 释放内存和关闭文件
fclose(pWritingFile);
free(pPixelData);
}
...全文
402 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
morningl_77 2009-04-03
  • 打赏
  • 举报
回复
跪求高手点拨~~
zzz822163 2009-04-02
  • 打赏
  • 举报
回复
VFW教程,搜索一下这个,里面有详细介绍

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧