【发布时间】:2019-04-18 04:10:59
【问题描述】:
我正在尝试捕获我的桌面图像。 (所有图像,包括桌面输出到显示器)
使用窗口 API(BitBlt 或 CImageClass)很容易,但这不是我想要的方式。
我想用 opengl 来做。所以我找到了 glReadPixel 函数和窗口 TRANSPARENT。
但它只是读取像素自己的Windows应用程序屏幕。(另存为bmp文件并检查)
初始化()
glfwSetErrorCallback(errorCallback);
if (!glfwInit()) {
std::cerr << "Error: GLFW " << std::endl;
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_DEPTH_BITS, 16);
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_SAMPLES, 4);
const int Monitor_count = GetMonitors();
GLwindow = glfwCreateWindow(
nWidth, // width
nHeight, // height
"OpenGL_Test", // window title
NULL, NULL);
if (!GLwindow) {
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwSwapInterval(1);
if (glfwGetWindowAttrib(GLwindow, GLFW_TRANSPARENT_FRAMEBUFFER))
{
//...
}
glfwSetWindowOpacity(GLwindow, 0.0f);
auto Mode = glfwGetVideoMode(Monitor[0]);
glfwMakeContextCurrent(GLwindow);
glfwSetKeyCallback(GLwindow, keyCallback);
glewExperimental = GL_TRUE;
GLenum errorCode = glewInit();
if (GLEW_OK != errorCode) {
std::cerr << "Error: GLEW - " << glewGetErrorString(errorCode) << std::endl;
glfwTerminate();
exit(EXIT_FAILURE);
}
if (!GLEW_VERSION_3_3) {
std::cerr << "OpenGL 3.3 API is not available." << std::endl;
glfwTerminate();
exit(EXIT_FAILURE);
}
glViewport(0, 0, nWidth, nHeight);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {
std::cerr << "Error: " << std::endl;
}
return true;
圈
while (!glfwWindowShouldClose(GLwindow)) {
Sleep(10);
glClearColor(0.0f, 0.3f, 0.3f, 0.5f);
glClear(GL_COLOR_BUFFER_BIT);
unsigned char *image = (unsigned char*)malloc(sizeof(unsigned char)*nWidth*nHeight * 3);
glReadPixels(0, 0, nWidth, nHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, image);
glfwPollEvents();
}
return true;
第一季度。是否可以使用 OPENGL 进行桌面捕获(全图像 GPU 输出)?
第二季度。如果 Q1 是可能的,我应该使用 FBO 和 PBO GL_BACK 吗??
第三季度。如何访问母窗口或 GPU 适配器? >> GL 似乎强烈拒绝这一点。(我不想要任何渲染,只需从 GPU 读取像素数据(桌面图像。不是由我的应用程序渲染。)(如果可能的话......))
有人向我展示链接或想法吗?
【问题讨论】:
-
您发布的代码出了什么问题?
-
我的代码没有错误,但这不是我想要的。也许观众可以看到和编辑它?
-
@Spektre 谢谢回复。该链接已经存在于我的收藏夹中。但这是从 GPU 中的应用程序获取渲染数据。不是吗?还是我误会了?
-
@Birds 链接的答案中有 2 个部分。第一个只能获取 grom GL 的图像,但第二个获取屏幕上的所有 GDI/GL/DX 内容基本上它会保存您在屏幕上看到的任何内容,除非使用了一些讨厌的技术(覆盖或流式传输)......或“优化”gfx使用了驱动程序......但上次我遇到这样的问题是几年前......
标签: c++ opengl screen-capture wgl