2012-01-12 23 views
11

Tôi đang cố sử dụng glReadPixels để lấy dữ liệu màu từ hình ảnh. Tôi được cho là sử dụng glReadPixels nhưng tôi không thể hình dung ra được. Đó là một phần của một dự án lớn hơn nhiều, nhưng ngay bây giờ tất cả những gì tôi muốn là biết cách sử dụng đúng cách này.glReadPixels() "dữ liệu" đối số sử dụng?

Tôi nhìn nó lên và có một cái gì đó như thế này:

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

Nhưng tôi không chắc chắn những gì tôi nên được đưa vào như là đối số cuối cùng, và khi tôi làm, làm thế nào tôi thậm chí sẽ sử dụng nó. Trợ giúp thực sự sẽ được đánh giá cao! (ví dụ: một ví dụ đơn giản về cách sử dụng hoặc cách lấy màu)

+0

Ví dụ về làm thế nào để đọc toàn bộ màn hình cùng một lúc: http://stackoverflow.com/a/36236839/895245 –

Trả lời

15

data lấy con trỏ tới một số vùng đệm bạn đã chuẩn bị cho glReadPixels để đưa dữ liệu vào. Như thế này:

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

Thực hiện tốt. Tôi sẽ thêm rằng hai thông số đầu tiên (x và y) hầu như luôn luôn là 0,0 vì chúng chỉ định góc dưới bên trái của vùng pixel. – ahoffer

+0

Còn GL_PACK_ALIGNMENT thì sao? Hoặc GL_PACK_ROW_LENGTH? – Zbyl

+0

@Zbyl: GL_PACK_ALIGNMENT phải được đặt, nhưng giá trị chính xác tùy thuộc vào định dạng đích. GL_PACK_ROW_LENGTH có thể được để lại 0, trừ khi bạn muốn cập nhật một phần con của bộ đệm được trỏ tới bởi dữ liệu. Tuy nhiên, chỉ cần đọc một bức tranh toàn bộ điều này là không cần thiết. – datenwolf

2

data là con trỏ tới dữ liệu pixel bạn đang cố gắng đọc. Hãy xem một số mã ví dụ và xem một vài dòng ở trên cuộc gọi đó để tìm hiểu cách họ đang khởi tạo mã đó. Thông thường nó sẽ chỉ là một phân bổ kích thước một cái gì đó như x * y * depth. Bạn sẽ vượt qua nó ở dạng &data. Hãy thử đọc một khối pixel 1x1 màu đã biết và xem loại thông tin nào được cung cấp.

+0

"dữ liệu là con trỏ đến dữ liệu pixel bạn đang cố gắng để đọc" - typo: _write_, không đọc. – Damon

+0

Tôi cho rằng từ đặt hàng của tôi còn lại một cái gì đó để được mong muốn: "Dữ liệu pixel bạn đang cố gắng đọc được lưu trữ trong' dữ liệu' ". Họ đang * đọc * điểm ảnh vào 'dữ liệu'. – Tim

16

dụ Cách sử dụng:

#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; 
} 

Sử dụng chuột để nhận được giá trị RGBA cho một pixel.

+0

Slick! Tôi thích nó. – Tim

+1

Tôi gặp sự cố trong quá trình deallocation vector. Tôi cố định nó bằng cách sử dụng: 'unsigned char pixels [4];' – num3ric

+0

Tôi đang cố gắng để chạy mã này nhưng tất cả tôi nhận được có giá trị rỗng (NULL) cho các điểm ảnh. Bất kỳ ý tưởng những gì có thể gây ra điều này? Tôi đang sử dụng glut-3.7.6 – masad

Các vấn đề liên quan