2017-06-19 276 views
-1

我想读的屏幕像素这样做的RGB值:glReadPixels与屏幕像素

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

} 

但它并不重要坐标我问。它始终返回我R:204 G:204 B:204

我在做什么错?

+2

你想做什么?您甚至没有创建OpenGL上下文... –

+0

我想读取位置x = 800像素的RGB值y = 800 – sergio

+0

glReadPixels只能在与其关联的OpenGL上下文的屏幕中工作。在glReadPixels文档中有一个注释:“位于连接到当前GL上下文的窗口之外的像素的值未定义”。换句话说,只有在以下情况下,才能确保获得实际的像素值:1.有一个窗口并且2.将GL上下文连接到它。 –

回答

0

正如在其他答复中提到并评论你可以使用glReadPixels仅供的OpenGL上下文窗口内的像素被至于你提到你已经使用在那个时候......竟然呈现GetPixel它提示你正在使用GDI。在这种情况下,您正尝试阅读GDI Canvas像素OpenGL这是不可能的(其他方式可能但速度较慢)。所以,我建议阅读本:

哪里可以找到例子的两种方法。如果你想从你自己的应用程序获得像素,那么你可以使用不同的API,然后GetPixel

如果您在VCL环境使用Graphics::TBitmap::ScanLine属性,如果正确使用,可用于直接像素访问没有限制或性能命中。

MSVC++GCC环境中使用WinAPI的BitBlt但是这是有点慢,而不是作为优雅(至少从我的观点)。

1

glReadPixels()在没有当前GL上下文的情况下将不起作用。虽然你的确实有有一个当前上下文you can't read the system framebuffer that way

+0

那么,我将如何有效地读取屏幕中任何像素的RGB值?我需要比GetPixel方法更快的东西... – sergio

+3

您是否阅读过链接问题的答案?在那里他们大致解释了为什么你不能使用glReadPixels截屏。如果你在Windows上,你可以尝试使用Win32。您可以使用CreateCompatibleBitmap和屏幕设备上下文作为参数,并将生成的位图复制到内存位图,如下所述:https://stackoverflow.com/questions/3291167/how-can-i-take-a-screenshot -in-A-Windows的应用程序 –