2015-02-06 37 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