2013-03-17 1 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_WIDTH и GL_TEXTURE_HEIGHT параметров из мишени в GL_TEXTURE_2D.

Также линия

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» только в качестве третьего параметра ? –

+1

@MichaelIV: fwrite является частью стандартной библиотеки C, которая обычно буферизуется. Первым параметром для fwrite является указатель на буфер. Второй параметр - это размер одного элемента в буфере (в нашем случае - одна строка пикселей). Третий параметр - это количество элементов размера, указанных ранее в буфере. 4-й параметр - это указатель на объект stdio FILE. Передача длины строки как размера элемента дает подсказку для stdio, какой хороший размер буферизации. – datenwolf

+0

Хорошо, теперь я понимаю, что вы имеете в виду –

0

Это вызвано bytes? Возможно, w * h - это не то, что вы думаете.

+0

w * h - ширина и высота изображения –

+0

@MichaelIV: Вы так думаете, но правильно ли они определены и инициализированы в вашей программе? – datenwolf

+0

@Michael IV: может быть, вы можете показать нам больше coooooooooooodes – Immueggpain

0

это ширина когда-либо нечетное число или не делится на 4?

По умолчанию OpenGL предполагает, что ряд пиксельных данных выровнен по границе четырех байтов. С RGB/BGR это не всегда так, и если так, вы будете писать за блоком malloc'ed и что-то сбиваете. Попробуйте положить

glPixelStorei(GL_PACK_ALIGNMENT, 1) 

перед тем, как прочитать пиксели и посмотреть, не исчезла ли проблема.

Смежные вопросы