2012-01-12 17 views
11

Estoy tratando de usar glReadPixels para obtener datos de color de una imagen. Se supone que debo usar glReadPixels, pero parece que no puedo resolverlo. Es parte de un proyecto mucho más grande, pero ahora todo lo que quiero es saber cómo usar esto correctamente.glReadPixels() uso de argumentos "de datos"?

miré hacia arriba y tiene algo como esto:

void glReadPixels(GLint x, 
     GLint y, 
     GLsizei width, 
     GLsizei height, 
     GLenum format, 
     GLenum type, 
     GLvoid* data); 

pero no estoy seguro de lo que debería estar puesta en lo que último argumento, y cuando lo haga, como lo sería incluso utilizarlo. ¡La ayuda realmente sería apreciada! (es decir: un ejemplo simple de cómo usarlo, o cómo obtener el color)

+0

Ejemplo de cómo leer toda la pantalla a la vez: http://stackoverflow.com/a/36236839/895245 –

Respuesta

15

data toma un puntero a algún búfer preparado para glReadPixels para poner los datos. De esta manera:

switch(format) { 
case GL_BGR: 
case GL_RGB: 
    components = 3; break; 

case GL_BGRA: 
case GL_RGBA: 
    components = 4; break; 

case GL_ALPHA: 
case GL_LUMINANCE: 
    components = 1; break; 
} 

GLubyte *data = malloc(components * width * height); 
if(data) { 
    glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, data); 
} 
+1

Bien hecho. Añadiría que los primeros dos parámetros (xey) son casi siempre 0,0 porque especifican la esquina inferior izquierda del área de píxeles. – ahoffer

+0

¿Qué pasa con GL_PACK_ALIGNMENT? O GL_PACK_ROW_LENGTH? – Zbyl

+0

@Zbyl: GL_PACK_ALIGNMENT debe establecerse, pero el valor exacto depende del formato de destino. GL_PACK_ROW_LENGTH se puede dejar en 0, a menos que desee actualizar una subparte del búfer al que apuntan los datos. Sin embargo, solo por leer una imagen en su totalidad, esto no es necesario. – datenwolf

2

data es el puntero a los datos de píxeles que está tratando de leer. Eche un vistazo a algunos códigos de ejemplo, y mire unas líneas arriba de que llaman para averiguar cómo lo están inicializando. Usualmente será una asignación de tamaño algo como x * y * depth. Lo pasarías como &data. Intente leer un bloque de 1x1 píxeles de color conocido y vea qué tipo de información le devuelve.

+0

"de datos es el puntero a los datos de pixel que está tratando de leer" - error tipográfico: _escritura_, no leído. – Damon

+0

Supongo que mi orden de palabras dejó algo que desear: "Los datos de píxeles que está tratando de leer se almacenan en' datos' ". Están * leyendo * el píxel en 'datos'. – Tim

16

Ejemplo de uso:

#include <GL/glut.h> 
#include <vector> 
#include <iostream> 

using namespace std; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-10, 10, -10, 10, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glScalef(5,5,5); 
    glBegin(GL_QUADS); 
    glColor3ub(255,0,0); 
    glVertex2f(-1,-1); 
    glColor3ub(0,255,0); 
    glVertex2f(1,-1); 
    glColor3ub(0,0,255); 
    glVertex2f(1,1); 
    glColor3ub(255,255,255); 
    glVertex2f(-1,1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

void mouse(int x, int y) 
{ 
    // 4 bytes per pixel (RGBA), 1x1 bitmap 
    vector< unsigned char > pixels(1 * 1 * 4); 
    glReadPixels 
     ( 
     x, glutGet(GLUT_WINDOW_HEIGHT) - y, 
     1, 1, 
     GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0] 
     ); 

    cout << "r: " << (int)pixels[0] << endl; 
    cout << "g: " << (int)pixels[1] << endl; 
    cout << "b: " << (int)pixels[2] << endl; 
    cout << "a: " << (int)pixels[3] << endl; 
    cout << endl; 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("glReadPixels()"); 

    glutDisplayFunc(display); 
    glutPassiveMotionFunc(mouse); 
    glutMainLoop(); 
    return 0; 
} 

utilizar el ratón para obtener el valor RGBA para un píxel.

+0

¡Deslizante! Me gusta. – Tim

+1

Obtengo bloqueos durante la desasignación del vector. Lo arreglé usando: 'unsigned char pixels [4];' – num3ric

+0

Estoy tratando de ejecutar este código, pero todo lo que obtengo son valores vacíos (NULL) para los píxeles. ¿Alguna idea de lo que podría estar causando esto? Estoy utilizando GLUT-3.7.6 – masad

Cuestiones relacionadas