0

我需要在每次调用时将 RGB 帧附加到文件中。

这是我所做的:

        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 被调用时,我遇到了访问冲突。可能我误解了如何使用它。

4

3 回答 3

1

你如何确定_viewWidth_viewHeight?读回纹理时,您应该使用 glGetTexLevelparameteri 检索它们以GL_TEXTURE_2D目标检索GL_TEXTURE_WIDTHGL_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);
于 2013-03-17T14:59:28.443 回答
0

是由 引起的bytes吗?也许w * h不是你想的那样。

于 2013-03-17T14:56:02.467 回答
0

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

默认情况下,OpenGL 假定一行像素数据与四字节边界对齐。对于 RGB/BGR,情况并非总是如此,如果是这样,您将在 malloc'ed 块之外进行写入并破坏某些内容。试着放

glPixelStorei(GL_PACK_ALIGNMENT, 1)

在读取像素并查看问题是否消失之前。

于 2013-03-18T01:19:15.070 回答