2017-06-19 89 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的應用程序 –