2015-02-06 2 views
1

내 프로그램에서 Qt의 기능을 사용 중입니다. qApp->primaryScreen()->grabWindow(qApp->desktop()->winId(),x_offset,y_offset,w,h);캡쳐 화면 캡쳐 화면 : native API vs opengl

"메인 작업"은 약간 느립니다. 그래서 위의 질문과 충돌합니다. 이 프로그램은 Windows 및 Mac OS X에서 작동 할 수 있습니다. OpenGL에 대한 좋은 screengrabber는 기본 API와 크로스 플랫폼 솔루션보다 GPU에 가깝기 때문에 들었습니다. 이것은 내가 얻고 싶은 첫 번째 지식이다. OpenGL을 데스크톱 스크린 그래버로 사용하는 것이 진짜인가? 버튼 "인쇄 화면"과 같은 의미입니다.

그렇다면 은 어떻게됩니까?

해당하지 않는 경우 :

Windows : 조언을 주실 수 있습니까 하는 방법? BitBlt, GetDC, 이런 짓을 한거야?

Mac OS X : AVFoundation? 제발, 이것을 설명하거나 약 에 대한 링크를 제공 할 수 있습니다 캡처이 스크린 샷을 사용하여 캡처? (Objective-C (++)에 대해 거의 알지 못하기 때문에 어렵습니다.)

업데이트 : 나는 스크린 샷을 캡처하는 방법에 대해 많이 읽었습니다. 약간의 지식이 있습니다 :

1. Opengl (아마도)는 스크린 그래버 (screengrabber)로 실제적이지만,이 소프트웨어에 대해서는 정확하지 않을 것입니다. Btw, 나는 상관하지 않는다. 내가 해결책을 찾으면 받아 들일 것이다.

2. 다이렉트는이 소프트웨어는 Mac OS X에서 작동하지 않기 때문에 내 문제를 해결하는 방법이 아니다

답변

0

glReadPixels (반짝임 X, 반짝임 Y, GLsizei 폭, GLsizei 높이, GLenum 형식, GLenum 유형, GLvoid * data)은 위치 데이터에서 시작하여 클라이언트 블록으로 픽셀 블록을 읽습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 나는 그것을 사용하려고했지만, 나는 올바르게했는지 확신 할 수 없다.'unsigned char pixels [4] = {0}; glReadPixels (0,0,500,500, GL_RGB, GL_UNSIGNED_INT, 픽셀);'. 그러나 나는 항상'pixels'가'glReadPixels' 다음에 0으로 채워지는 것을 보았습니다. 'glGetError'는 0을 반환합니다. –

+0

크기가 4 인 픽셀을 할당하여 한 픽셀 만 읽을 수는 있지만 입력 값은 500 * 500 픽셀입니다. glReadPixels (0,0,1,1, GL_RGB, GL_UNSIGNED_INT, pixels); –

+0

수정 됨! 그래서 지금은 여전히 ​​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); 
} 
+0

솔루션 다운로드 - 무료 이미지, 설치, 복사/붙여 넣기 코드를 시도했습니다. 이것은 이전의 메시지 전용 0 에서처럼 작동합니다. 아마 나는 "화면 인쇄"버튼과 같이 바탕 화면에서 픽셀을 읽을 필요가 있음을 상기시켜야 할 것입니다. 또는 어쩌면 나는 그것을 사용하는 몇 가지 기능을 몰라) –