2015-02-06 79 views
1

在我的程序中我使用的是Qt的功能:qApp->primaryScreen()->grabWindow(qApp->desktop()->winId(),x_offset,y_offset,w,h);截图截图:native API vs opengl

但是它对于一个“主要任务”慢慢一点点。所以我碰到了上面的一个问题。该程序能够在Windows和Mac OS X下工作。我听说opengl是一个不错的屏幕抓图工具,因为它比原生API和其跨平台解决方案更接近GPU。这是我想要得到的第一个知识: Opengl作为桌面屏幕抓取工具,是真的吗? 我的意思是像一个按钮“打印屏幕”。

如果是, 怎么样?

如果不是:

窗户:请你给意见 如何? BitBlt,GetDC,像这样?

Mac OS X:AVFoundation?请你介绍一下这个或者给点链接 如何用截图使用这个类? (这是一个很难的方式,因为我知道关于Objective-C(++)几乎没有)

更新:我读了很多关于捕获截图的方法。有一些知识:

1. Opengl(也许)是真正的screengrabber,但使用它将是不正确的这个软件。顺便说一句,我不在乎,如果有一些解决方案,我会接受它。

2的DirectX它不解决我的问题,因为这个软件并不在Mac OS X上运行的方式

回答

0

glReadPixels(闪光X, 闪烁Y, GLsizei宽度, GLsizei高度, GLenum格式, GLenum类型, GLvoid * data)将从位置数据开始将一块像素块读入客户端内存中。

+0

谢谢你的回复!我tryed使用它,但我不知道我做对了:'unsigned char pixels [4] = {0}; glReadPixels(0,0,500,500,GL_RGB,GL_UNSIGNED_INT,pixels);'。但是我总是看到'glReadPixels'后面的像素由零填充。 'glGetError'返回0. – 2015-02-07 00:06:28

+0

你只能通过分配一个大小为4的像素来读取一个像素,但是你的输入是500 * 500像素,你通过glReadPixels得到了什么(0,0,1,1,GL_RGB,GL_UNSIGNED_INT,像素); – 2015-02-07 00:46:17

+0

已编辑!所以,现在我仍然只取零。 – 2015-02-07 01:23:43

1

为了扩展@ Zhenyi Luo的回答,这里是我过去使用的代码片段。

它还使用FreeImage导出屏幕截图。

void Display::SaveScreenShot (std::string FilePath, SCREENSHOT_FORMAT Format){ 

    // Create Pixel Array 
    GLubyte* pixels = new GLubyte [3 * Window::width * Window::height]; 

    // Read Pixels From Screen And Buffer Into Array 
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 
    glReadPixels (0, 0, Window::width, Window::height, GL_BGR, GL_UNSIGNED_BYTE, pixels); 

    // Convert To FreeImage And Save 
    FIBITMAP* image = FreeImage_ConvertFromRawBits (pixels, Window::width, 
                 Window::height, 3 * Window::width, 24, 
                 0x0000FF, 0xFF0000, 0x00FF00, false); 

    FreeImage_Save ((FREE_IMAGE_FORMAT) Format, image, FilePath.c_str(), 0); 

    // Free Resources 
    FreeImage_Unload (image); 
    delete [] (pixels); 
} 
+0

尝试你的解决方案 - 下载freeimage,安装,复制/粘贴代码。这与之前的消息一样 - 只有零。也许我应该提醒一下:我需要从桌面读取像素,如“打印屏幕”按钮。或者,也许我不知道一些功能如何使用它) – 2015-02-07 21:03:41