编写图像文件时C ++写入访问冲突

时间:2013-03-17 14:46:56

标签: c++ opengl

我需要在每次调用时将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被调用时,我得到了访问冲突。可能我误解了如何使用它。

3 个答案:

答案 0 :(得分:1)

如何确定_viewWidth_viewHeight?回读纹理时,您应该使用glGetTexLevelparameteri检索它们,以从 GL_TEXTURE_2D 目标中检索 GL_TEXTURE_WIDTH GL_TEXTURE_HEIGHT 参数。 / p>

也是行

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);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

默认情况下,OpenGL假定一行像素数据与四字节边界对齐。对于RGB / BGR,情况并非总是如此,如果是这样的话,你将会在malloc'ed块之外写一些东西。试试

glPixelStorei(GL_PACK_ALIGNMENT, 1)

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