ЗЕЛЕНЫЙ скриншот в C - PullRequest
       16

ЗЕЛЕНЫЙ скриншот в C

1 голос
/ 01 февраля 2012

Я пытаюсь сделать снимок экрана в GLUT, и у меня возникла небольшая проблема.Кажется, что glReadPixels () приводит к сбою моей программы с

Access violoation writing location 0x00000000

. Странно то, что файл создан в корне проекта и, очевидно, пуст.Я быстро настроил некоторые команды printf, и кажется, что код происходит каждый раз во время метода glReadPixels ().

Я чувствую, что проблема, возможно, связана с переменной 'пиксели'.У меня проблемы с поиском правильного способа определить это так, чтобы значения RGB были записаны в него.

Любые советы будут оценены.

void savePPM(char ppmFileName[]){
    int width = glutGet(GLUT_WINDOW_WIDTH);
    int height = glutGet(GLUT_WINDOW_HEIGHT);
    char *pixels = NULL;

    glReadPixels(0,0, width, height, GL_RGB, GL_UNSIGNED_BYTE ,pixels);

    ppmFile = fopen(ppmFileName, "wb");

    fprintf(ppmFile, "P6\n");
    fprintf(ppmFile, "%d %d\n", width, height);
    fprintf(ppmFile, "255\n");
    fwrite(pixels, 1, width*height*3, ppmFile);

    fclose(ppmFile);
    free(pixels);
}

1 Ответ

4 голосов
/ 01 февраля 2012

glReadPixels не выделяет память для вас, она просто сохраняет данные пикселей в буфере, который вы передаете в последнем параметре.Вы даете ему указатель NULL, поэтому он пытается сохранить данные по адресу 0, что, очевидно, приводит к нарушению доступа.

Сначала необходимо выделить память, передать ее в glReadPixels, а затемосвободить его.Вам также необходимо убедиться, что вы вызываете glPixelStorei, чтобы гарантировать, что пиксельные данные возвращаются упакованными, без каких-либо дополнений (в качестве альтернативы вы можете написать каждую строку сканирования по отдельности, но это требует немного дополнительных усилий).

Например:

// Error checking omitted for expository purposes
char *pixels = malloc(width * height * 3);  // Assuming GL_RGB
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(..., pixels);
...
fwrite(pixels, ...);
...
free(pixels);
...