source

Linux에서 가장 빠른 화면 캡처 방법

lovecheck 2023. 10. 24. 21:24
반응형

Linux에서 가장 빠른 화면 캡처 방법

이 질문은 이 질문과 비슷합니다.

가장 빠른 화면 캡처 방법

리눅스/X11용입니다.

좀 더 구체적으로 말하자면, X11 다이플레이에서 실행되는 하나의 윈도우(윈도우의 알트 프린트 스크린에 해당하는 프로그램)의 픽셀 이미지를 캡처하는 방법이 필요합니다.

참고 및 요구사항:

1) 캡처 중인 창 위에 새 창을 놓더라도 픽셀 이미지는 아무런 폐색 없이 원래 응용 프로그램 창을 가리켜야 합니다.

2) 사용자가 애플리케이션 창을 볼 필요는 없으며, 비디오 목적으로 픽셀 버퍼/images만 저장하면 됩니다.

제가 조사한 다른 대안들은 다음과 같습니다.

1) xvfb - 작동하지만 CPU 렌더링을 수행하므로 느리고 좋은 GPU를 낭비합니다.

2) 많은 lxc 내부의 x11 - 이론적으로는 작동할 수 있지만 설정이 복잡하며, 많은 창이 캡처되면서 잘 확장될 수 있을지 확신할 수 없습니다.

제안과 아이디어는 환영입니다.

이는 하드웨어 가속이 가능한 서버에서 VirtualGL을 사용하면 가능합니다.기본적으로 서버를 적절하게 구성한 다음 동일한 컴퓨터 또는 동일한 네트워크에 있는 컴퓨터에서 실행합니다.

export DISPLAY=<your xvfb display>
vglrun <your_app>

이를 통해 다음과 같은 이점을 얻을 수 있습니다.

1) 당신의 앱은 하드웨어를 사용할 virtualGL을 사용하여 렌더링할 것입니다.

2) VirtualGL은 Xfvb 디스플레이 내부에 3D 컨텍스트를 표시하며 CPU에서 2D 위젯만 렌더링합니다.

3) 프레임 버퍼에 렌더링하도록 Xvfb 구성

4) 이익!

이것은 순수 X11에서는 불가능합니다.

컴포지팅을 통해 원하는 것을 얻을 수 있지만 이를 지원하는 서버에서만 가능합니다(대부분의 최신 서버에서 가능).이것은 사실 윈도우 관리자와는 아무런 관련이 없습니다.WM은 특별한 능력이 있기는 하지만 다른 고객일 뿐입니다. 하지만 이런 능력들은 작곡과는 무관합니다.동일한 합성 API를 사용할 수 있습니다.

man xcomposite당신을 시작하게 해줘야 합니다.

X11에서는 안 된다는 댓글을 본 적이 있어서 이해가 안 되는 부분이 있을 수도 있지만 아래 코드를 사용해서 화면을 캡처할 수 있습니다.

#include <X11/Xlib.h> //-lX11
#include <X11/Xutil.h>
#include <X11/Xmd.h> 
#include <X11/Xatom.h>
#include <jpeglib.h> //-ljpeg 

void CopyDesktopImage(std::string sFilePath_Name)
{  
    Display *dis=XOpenDisplay((char *)0);
    Screen *scr = XDefaultScreenOfDisplay(dis);
    Drawable drawable = XDefaultRootWindow(dis);

    XImage *image = XGetImage(dis, drawable, 0, 0, scr->width, scr->height, AllPlanes, ZPixmap);
    Save_XImage_to_JPG(image, sFilePath_Name.c_str(), 75);
    XDestroyImage(image);

    XCloseDisplay(dis); 
}

void Save_XImage_to_JPG(XImage *image, std::string FileName, int Quality)
{
    FILE* outfile = fopen(FileName.c_str(), "wb");
    if(outfile == NULL) return;

    jpeg_compress_struct cinfo;
    jpeg_error_mgr       jerr;

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    jpeg_stdio_dest(&cinfo, outfile);

    cinfo.image_width      = image->width;
    cinfo.image_height     = image->height;
    cinfo.input_components = image->bitmap_unit >> 3;
    cinfo.in_color_space   = JCS_EXT_BGRX;

    jpeg_set_defaults(&cinfo);
    /*set the quality [0..100]  */
    jpeg_set_quality(&cinfo, Quality, true);
    jpeg_start_compress(&cinfo, true);

    JSAMPROW row_pointer;          /* pointer to a single row */

    while (cinfo.next_scanline < cinfo.image_height) 
    {
        row_pointer = (JSAMPROW) &image->data[cinfo.next_scanline*image->bytes_per_line];
        jpeg_write_scanlines(&cinfo, &row_pointer, 1);
    }
    jpeg_finish_compress(&cinfo);

    fclose(outfile);
}

xwd(1)를 사용하여 X11 창을 덤프할 수 있으며 xwd(1)를 표시할 수 있습니다.ImageMagickNetpbm 도구는 XWD 형식을 다루는 방법을 알고 있습니다.하지만 이것들은 특별히 빠르지는 않습니다.그리고 그들은 창문의 숨겨진 부분을 드러내지 않을 것입니다.

이것은 얼토당토않은 추측이지만, VNC를 통해 단일 윈도우를 스트리밍하려면 -id [ windowid](http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id) 옵션과 함께 x11vnc를 사용할 수 있습니다.이렇게 하면 창 전체가 표시되며, 창이 가려져 있어도 메인 화면과 정확히 동일한 위치가 표시됩니다(팝업 메뉴가 일부 손실될 수 있음).실제 X11 화면에서 창 좌표를 가져올 수 있습니다.

그 정보를 입수하고 싶어요gnome-screenshot, 아니면 기존의 다른 오픈 소스 도구를 이용해서 그들이 어떻게 그것을 하는지 파악할 수 있습니다.

Ubuntu가 사용하는 소스는 http://packages.ubuntu.com/quantal/gnome-screenshot 에서 확인할 수 있습니다.

하지만, 많은 부분의 코드를 자르고 붙여넣기 전에 라이센스를 확인하는 것을 잊지 마세요!

Xpaint는 MIT Athena 위젯 세트를 사용하여 만들어진 매우 오래된 X11 유틸리티입니다.파일 > 스냅샷 만들기 화면에서 창이나 마우스로 선택한 직사각형을 가져옵니다.

오어

MagiCapture는 X 윈도우 시스템의 화면 캡처 및 미리보기 유틸리티입니다.사용자는 하나의 창, 장식이 있는 하나의 창, 디스플레이의 직사각형 영역, 또는 디스플레이 자체 전체를 캡처할 수 있습니다.사용자는 캡처된 이미지를 ImageMagick 툴킷에서 지원하는 그래픽 파일에 저장할 수 있습니다. 이 툴킷은 모든 그래픽 형식이 아닌 경우 대부분의 그래픽 형식을 지원합니다.MagiCapture는 사용자 인터페이스를 위해 GLIB 및 GTK+ 라이브러리를 사용하고 모든 그래픽 처리를 위해 ImageMagick 및 GdkMagick 라이브러리를 사용합니다.ImageMagick이 필요합니다.

오어

Zscreen:- 이 Windows 전용 화면 캡처 앱에는 수많은 기능이 있습니다.활성 창, 선택한 창 또는 전체 화면의 샷을 가져옵니다.이미지가 있으면 이미지 편집기에서 자동으로 열거나 Twitpic, YFrog, Flickr 또는 지원되는 여러 서비스 중 하나에 업로드합니다.ZScreen은 클립보드에 있는 이미지를 포함하여 모든 이미지를 캐시하므로 스크린샷의 기록이 항상 바로 손끝에 있습니다.

로컬 네트워크의 까다로운 해킹으로 할 수 있는 일은 X 원격 기능을 사용하여 X 수신 포트를 연 다음 envar를 사용하여 X 수신 포트로 내보내기를 설정한 다음 XscreenCapture를 사용하는 것입니다.

언급URL : https://stackoverflow.com/questions/13479975/fastest-method-for-screen-capturing-on-linux

반응형