【问题标题】:glReadPixels with screen pixelsglReadPixels 与屏幕像素
【发布时间】:2017-06-19 15:35:37
【问题描述】:

我正在尝试读取屏幕像素的 RGB 值:

#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

我做错了什么?

【问题讨论】:

  • 你想做什么?您甚至没有创建 OpenGL 上下文...
  • 我正在尝试读取 x=800 y=800 位置像素的 RGB 值
  • glReadPixels 只能在具有与之关联的 OpenGL 上下文的屏幕中工作。在 glReadPixels 文档中有一条注释:“位于连接到当前 GL 上下文的窗口之外的像素的值未定义”。换句话说,只有在以下情况下,您才能确定您将获得实际的像素值:1. 有一个窗口,并且 2. 将 GL 上下文连接到它。

标签: c++ windows opengl glreadpixels


【解决方案1】:

glReadPixels() 在没有当前 GL 上下文的情况下将无法工作。即使您确实有当前上下文you can't read the system framebuffer that way

【讨论】:

  • 那么,我该怎么做才能有效地读取屏幕中任何像素的 RGB 值?我需要比 GetPixel 方法更快的方法...
  • 您是否阅读了链接中问题的答案?他们在那里大致解释了为什么你不能使用 glReadPixels 来截屏。如果您在 Windows 上,您可以尝试使用 Win32。您可以将 CreateCompatibleBitmap 与屏幕设备上下文一起用作参数,并将生成的位图复制到内存位图,如下所述:stackoverflow.com/questions/3291167/…
【解决方案2】:

正如其他答案和 cmets 中所述,您只能将 glReadPixels 用于当时实际渲染的 OpenGL 上下文窗口内的像素......正如您提到的,您使用了 @987654324 @ 它暗示你正在使用 GDI。在这种情况下,您尝试从 OpenGL 读取 GDI Canvas 像素,这是不可能的(相反的方法是可能的,但是速度很慢)。所以我建议阅读这篇文章:

您可以在哪里找到这两种方法的示例。如果您尝试从自己的应用程序中获取像素,那么您可以使用不同的 api 然后GetPixel

如果您在 VCL 环境中,请使用 Graphics::TBitmap::ScanLine 属性,如果使用得当,该属性可用于直接像素访问而不受限制或性能损失。

GCC 环境的 MSVC++ 上使用 WinAPI BitBlt 但这有点慢而且不那么优雅(至少从我的观点来看)观点)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2019-03-04
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多