捕获屏幕截图:本机API与opengl

时间:2015-02-06 23:44:28

标签: macos winapi opengl

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

但对于一项主要任务而言,它有点慢;#34;。所以我碰到了上面的问题。该程序能够在Windows和Mac OS X下工作。我听说opengl是一个很好的screengrabber,因为它比原生API和它的跨平台解决方案更接近GPU。这是我想要获得的第一个知识: Opengl作为桌面screengrabber,它是真的吗? 我的意思是像一个按钮"打印屏幕"。

如果是,如何?

如果不是:

Windows:您能否提供建议如何? BitBlt,GetDC,这样的事吗?

Mac OS X:AVFoundation?那么,您能描述一下这个或者提供一些关于如何使用这个类捕获屏幕截图的链接吗? (这是一个艰难的方式,因为我几乎什么都不知道Objective-C(++))

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

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

 2. DirectX不能解决我的问题,因为该软件在Mac OS X下不起作用。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

glReadPixels(GLint x,     GLint y,     GLsizei宽度,     GLsizei身高,     GLenum格式,     GLenum类型,     GLvoid *数据)将从位置数据开始将一块像素读入客户端内存。