2013-03-17 97 views
0

我需要在每次调用时追加RGB帧到文件。写入映像文件时发生C++ fwrite访问冲突

这里是我做的:

 size_t lenght=_viewWidth * _viewHeight * 3; 
    BYTE *bytes=(BYTE*)malloc(lenght); 
    /////////////// read pixels from OpenGL tex ///////////////////// 
    glBindTexture(GL_TEXTURE_2D,tex); 
    glGetTexImage(GL_TEXTURE_2D,0,GL_BGR,GL_UNSIGNED_BYTE,bytes); 
    glBindTexture(GL_TEXTURE_2D,0); 

     ///write it to file : 
     hOutFile = fopen(outFileName.c_str(), cfg.appendMode ? "ab" : "wb"); 
    assert(hOutFile!=0); 


    fwrite(bytes, 1 ,w * h, hOutFile); // Write 



    fclose(hOutFile); 

不知怎的,我得到访问冲突时FWRITE得到called.Probably我误解了如何使用它。

回答

1

你如何确定_viewWidth_viewHeight?在回读纹理时,您应该使用glGetTexLevelparameteri检索它们以检索来自 GL_TEXTURE_2D目标的参数 GL_TEXTURE_WIDTH GL_TEXTURE_HEIGHT参数。

还行

fwrite(bytes, 1 ,w * h, hOutFile); 

是错误的。什么是w,什么是h?他们从来没有在代码中初始化,并且没有连接到那里的其他分配。此外,如果这些是图像的宽度和高度,它仍然缺少像素的元素数量。最有可能的3

它会更有意义有类似

int elements = ...; // probably 3 
int w = ...; 
int h = ...; 
size_t bytes_length = w*elements * h; 
bytes = malloc(bytes_length) 

... 

fwrite(bytes, w*elements, h, hOutFile); 
+0

w和h被初始化为图像的宽度和高度。但是现在我认为我通过的fwrite参数是错误的。为什么只传递“h”作为第三个参数? – 2013-03-17 15:19:29

+1

@MichaelIV:fwrite是C标准库IO的一部分,通常是缓冲的。 fwrite的第一个参数是指向缓冲区的指针。第二个参数是缓冲区中单个元素的大小(在我们的例子中是单行像素)。第三个参数是缓冲区中之前指定的大小元素的数量。第四个参数是指向stdio文件对象的指针。以元素大小传递一行的长度给了stdio一个提示,一个好的缓冲大小是多少。 – datenwolf 2013-03-17 16:09:22

+0

好的,现在我明白你的意思了 – 2013-03-17 19:22:28

0

是否由bytes引起? 也许w * h是不是你认为它是。

+0

w * h是图像的宽度和高度 – 2013-03-17 14:58:58

+0

@MichaelIV:您认为这样,但它们是否在程序中正确定义和初始化? – datenwolf 2013-03-17 14:59:50

+0

@Michael IV:也许你可以向我们展示更多的coooooooooooodes – Immueggpain 2013-03-17 15:02:34

0

是宽度不断奇数或不能被4整除?

默认情况下,OpenGL假定一行像素数据与四字节边界对齐。对于RGB/BGR,情况并非总是如此,如果是这样的话,你会写出超出malloc的块并且破坏某些东西。尝试在读取像素之前尝试将

glPixelStorei(GL_PACK_ALIGNMENT, 1) 

看看问题是否消失。