2017-06-19 10 views
-1

Ich versuche, den RGB-Wert eines Bildschirmpixel Tun zu lesen:glReadPixels mit Bildschirmpixel

#include "stdafx.h" 
#include<windows.h> 
#include<stdio.h> 
#include <gl\GL.h> 

int main(int argc, char** argv) 
{ 
    GLubyte color[3]; 
    glReadPixels(800, 800, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &color); 

    printf("R:%d G:%d B:%d", color[0], color[1], color[2]); 

    while (1); 

} 

Aber es spielt keine Rolle, welche Koordinaten bitte ich um. Es gibt mir immer wieder R: 204 G: 204 B: 204

Was mache ich falsch?

+2

Was versuchen Sie zu tun? Sie haben nicht einmal einen OpenGL-Kontext erstellt ... –

+0

Ich versuche den RGB-Wert des Pixels in Position zu lesen x = 800 y = 800 – sergio

+0

glReadPixels funktioniert nur in einem Bildschirm, dem ein OpenGL-Kontext zugeordnet ist. In den glReadPixels-Dokumenten gibt es einen Hinweis: "Werte für Pixel, die außerhalb des Fensters liegen, das mit dem aktuellen GL-Kontext verbunden ist, sind nicht definiert". Mit anderen Worten, Sie können nur sicher sein, dass Sie tatsächliche Pixelwerte erhalten, wenn Sie: 1. ein Fenster haben und 2. einen GL-Kontext damit verbunden haben. –

Antwort

0

Wie in der anderen Antwort erwähnt und kommentiert Sie glReadPixels nur für Pixel in Ihrem OpenGL Kontextfenster verwenden können, die tatsächlich zu dieser Zeit gemacht werden ... Wie Sie Sie verwendet haben erwähnt GetPixel es Hinweise, die Ihnen GDI verwenden. In diesem Fall versuchen Sie GDI Canvas Pixel von OpenGL zu lesen, was nicht möglich ist (anders herum ist möglich, aber langsam). Also ich Ratschläge lesen dies:

Wo Sie zB beiden Methoden finden. Wenn Sie versuchen, Pixel von Ihrer eigenen App zu erhalten, dann können Sie verschiedene API verwenden, dann GetPixel.

Wenn Sie in VCL Umgebung Graphics::TBitmap::ScanLine Eigenschaft verwenden, die für den direkten Zugriff auf Bildpunkte ohne Einschränkungen verwendet werden kann, oder die Leistung trifft, wenn sie ordnungsgemäß verwendet.

Auf MSVC++ von GCC Umgebung WinAPIBitBlt verwenden, aber das ist ein bisschen langsamer und nicht so elegant (zumindest aus meiner Sicht).

1

funktioniert nicht ohne einen aktuellen GL-Kontext. Auch wenn Sie haben haben einen aktuellen Kontext you can't read the system framebuffer that way.

+0

Also, was würde ich tun, um die RGB-Werte jedes Pixels im Bildschirm effizient zu lesen? Ich brauche etwas schneller als GetPixel Methode ... – sergio

+3

Haben Sie die Antwort auf die Frage in den Link gelesen? Dort erklären sie grob, warum man mit glReadPixels keine Screenshots machen kann. Wenn Sie Windows verwenden, können Sie versuchen, Win32 zu verwenden. Sie können CreateCompatibleBitmap mit dem Bildschirmgerätekontext als Argument verwenden und die resultierende Bitmap in eine speicherinterne Bitmap kopieren, wie hier beschrieben: https://stackoverflow.com/questions/3291167/how-can-i-take-a-screenshot -in-a-Windows-Anwendung –

Verwandte Themen