it-swarm-ko.tech

Linux에서 Python 스크립트를 통해 스크린 샷 생성

python 스크립트를 통해 스크린 샷을 만들고 눈에 띄게 저장하고 싶습니다.

Linux 솔루션에만 관심이 있으며 X 기반 환경을 지원해야합니다.

77
skyronic

이것은 scrot 또는 ImageMagick을 사용할 필요가 없습니다.

import gtk.gdk

w = gtk.gdk.get_default_root_window()
sz = w.get_size()
print "The size of the window is %d x %d" % sz
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
if (pb != None):
    pb.save("screenshot.png","png")
    print "Screenshot saved to screenshot.png."
else:
    print "Unable to get the screenshot."

http://ubuntuforums.org/showpost.php?p=2681009&postcount=5 에서 빌린

64
Rusty

한 클래스에서 모든 답변을 컴파일하십시오. PIL 이미지를 출력합니다.

#!/usr/bin/env python
# encoding: utf-8
"""
screengrab.py

Created by Alex Snet on 2011-10-10.
Copyright (c) 2011 CodeTeam. All rights reserved.
"""

import sys
import os

import Image


class screengrab:
    def __init__(self):
        try:
            import gtk
        except ImportError:
            pass
        else:
            self.screen = self.getScreenByGtk

        try:
            import PyQt4
        except ImportError:
            pass
        else:
            self.screen = self.getScreenByQt

        try:
            import wx
        except ImportError:
            pass
        else:
            self.screen = self.getScreenByWx

        try:
            import ImageGrab
        except ImportError:
            pass
        else:
            self.screen = self.getScreenByPIL


    def getScreenByGtk(self):
        import gtk.gdk      
        w = gtk.gdk.get_default_root_window()
        sz = w.get_size()
        pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
        pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
        if pb is None:
            return False
        else:
            width,height = pb.get_width(),pb.get_height()
            return Image.fromstring("RGB",(width,height),pb.get_pixels() )

    def getScreenByQt(self):
        from PyQt4.QtGui import QPixmap, QApplication
        from PyQt4.Qt import QBuffer, QIODevice
        import StringIO
        app = QApplication(sys.argv)
        buffer = QBuffer()
        buffer.open(QIODevice.ReadWrite)
        QPixmap.grabWindow(QApplication.desktop().winId()).save(buffer, 'png')
        strio = StringIO.StringIO()
        strio.write(buffer.data())
        buffer.close()
        del app
        strio.seek(0)
        return Image.open(strio)

    def getScreenByPIL(self):
        import ImageGrab
        img = ImageGrab.grab()
        return img

    def getScreenByWx(self):
        import wx
        wx.App()  # Need to create an App instance before doing anything
        screen = wx.ScreenDC()
        size = screen.GetSize()
        bmp = wx.EmptyBitmap(size[0], size[1])
        mem = wx.MemoryDC(bmp)
        mem.Blit(0, 0, size[0], size[1], screen, 0, 0)
        del mem  # Release bitmap
        #bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)
        myWxImage = wx.ImageFromBitmap( myBitmap )
        PilImage = Image.new( 'RGB', (myWxImage.GetWidth(), myWxImage.GetHeight()) )
        PilImage.fromstring( myWxImage.GetData() )
        return PilImage

if __== '__main__':
    s = screengrab()
    screen = s.screen()
    screen.show()
46
Alex Snet

완전성을 위해 : Xlib-그러나 전체 화면을 캡처 할 때 다소 느립니다.

from Xlib import display, X
import Image #PIL

W,H = 200,200
dsp = display.Display()
root = dsp.screen().root
raw = root.get_image(0, 0, W,H, X.ZPixmap, 0xffffffff)
image = Image.fromstring("RGB", (W, H), raw.data, "raw", "BGRX")
image.show()

PyXlib의 병목 현상 파일에서 일부 유형을 처리 한 다음 Cython을 사용하여 컴파일 할 수 있습니다. 속도가 약간 높아질 수 있습니다.


Edit : C로 함수의 핵심을 작성한 다음 python ctypes에서 사용), 여기 내가 함께 해킹 한 것입니다.

#include <stdio.h>
#include <X11/X.h>
#include <X11/Xlib.h>
//Compile hint: gcc -shared -O3 -lX11 -fPIC -Wl,-soname,prtscn -o prtscn.so prtscn.c

void getScreen(const int, const int, const int, const int, unsigned char *);
void getScreen(const int xx,const int yy,const int W, const int H, /*out*/ unsigned char * data) 
{
   Display *display = XOpenDisplay(NULL);
   Window root = DefaultRootWindow(display);

   XImage *image = XGetImage(display,root, xx,yy, W,H, AllPlanes, ZPixmap);

   unsigned long red_mask   = image->red_mask;
   unsigned long green_mask = image->green_mask;
   unsigned long blue_mask  = image->blue_mask;
   int x, y;
   int ii = 0;
   for (y = 0; y < H; y++) {
       for (x = 0; x < W; x++) {
         unsigned long pixel = XGetPixel(image,x,y);
         unsigned char blue  = (pixel & blue_mask);
         unsigned char green = (pixel & green_mask) >> 8;
         unsigned char red   = (pixel & red_mask) >> 16;

         data[ii + 2] = blue;
         data[ii + 1] = green;
         data[ii + 0] = red;
         ii += 3;
      }
   }
   XDestroyImage(image);
   XDestroyWindow(display, root);
   XCloseDisplay(display);
}

그리고 파이썬 파일 :

import ctypes
import os
from PIL import Image

LibName = 'prtscn.so'
AbsLibPath = os.path.dirname(os.path.abspath(__file__)) + os.path.sep + LibName
grab = ctypes.CDLL(AbsLibPath)

def grab_screen(x1,y1,x2,y2):
    w, h = x2-x1, y2-y1
    size = w * h
    objlength = size * 3

    grab.getScreen.argtypes = []
    result = (ctypes.c_ubyte*objlength)()

    grab.getScreen(x1,y1, w, h, result)
    return Image.frombuffer('RGB', (w, h), result, 'raw', 'RGB', 0, 1)

if __== '__main__':
  im = grab_screen(0,0,1440,900)
  im.show()
34
JHolta

이것은 X11과 Windows에서도 작동합니다 (누군가 확인하십시오). 필요 PyQt4 :

import sys
from PyQt4.QtGui import QPixmap, QApplication
app = QApplication(sys.argv)
QPixmap.grabWindow(QApplication.desktop().winId()).save('test.png', 'png')
18
Juliano

Scrot, imagemagick, pyqt, wx 및 pygtk에 대한 래퍼 프로젝트 ( pyscreenshot )가 있습니다. 그중 하나가 있으면 사용할 수 있습니다. 이 토론에는 모든 솔루션이 포함되어 있습니다.

설치:

easy_install pyscreenshot

예:

import pyscreenshot as ImageGrab

# fullscreen
im=ImageGrab.grab()
im.show()

# part of the screen
im=ImageGrab.grab(bbox=(10,10,500,500))
im.show()

# to file
ImageGrab.grab_to_file('im.png')
15
ponty

wxPython 을 사용하는 크로스 플랫폼 솔루션 :

import wx
wx.App()  # Need to create an App instance before doing anything
screen = wx.ScreenDC()
size = screen.GetSize()
bmp = wx.EmptyBitmap(size[0], size[1])
mem = wx.MemoryDC(bmp)
mem.Blit(0, 0, size[0], size[1], screen, 0, 0)
del mem  # Release bitmap
bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)
8
Snowball
import ImageGrab
img = ImageGrab.grab()
img.save('test.jpg','JPEG')

이것은 Python 이미징 라이브러리가 필요합니다

7
Slava V

이것을 사용할 수 있습니다

import os
os.system("import -window root screen_shot.png")
3
Ahir Kamlesh

짧은 검색이 나타났습니다 gtkShots GPLed python 스크린 샷 프로그램이므로 도움이 될 것 같습니다.

3
Douglas Leeder

조금 늦었지만 결코 쉬운 일이 아닙니다

import autopy
import time
time.sleep(2)
b = autopy.bitmap.capture_screen()
b.save("C:/Users/mak/Desktop/m.png")
2
pkm

python이 패키지는 Autopy

비트 맵 모듈은 화면 캡처를 할 수 있습니다 (bitmap.capture_screen) 멀티 플랫폼입니다 (Windows, Linux, Osx).

2
ouille

pyscreenshot의 출력이 검은 색 화면 PNG 이미지 파일이기 때문에 pyscreenshot 또는 scrot을 사용하여 Linux에서 스크린 샷을 만들 수 없습니다.

그러나 아무것도 설치하지 않고 Linux에서 스크린 샷을 찍는 매우 쉬운 방법이 있다는 점을 감사드립니다. 디렉토리에 아래 코드를 넣고 python demo.py로 실행하십시오.

import os
os.system("gnome-screenshot --file=this_directory.png")

또한 gnome-screenshot --help에 사용할 수있는 옵션이 많이 있습니다.

Application Options:
  -c, --clipboard                Send the grab directly to the clipboard
  -w, --window                   Grab a window instead of the entire screen
  -a, --area                     Grab an area of the screen instead of the entire screen
  -b, --include-border           Include the window border with the screenshot
  -B, --remove-border            Remove the window border from the screenshot
  -p, --include-pointer          Include the pointer with the screenshot
  -d, --delay=seconds            Take screenshot after specified delay [in seconds]
  -e, --border-effect=effect     Effect to add to the border (shadow, border, vintage or none)
  -i, --interactive              Interactively set options
  -f, --file=filename            Save screenshot directly to this file
  --version                      Print version information and exit
  --display=DISPLAY              X display to use
2
cyera

최근에 X11 라이브러리를 사용하여 스크린 샷을 찍고 이미지를 numpy 배열로 반환하는 패키지를 작성했습니다. 실제로이 스레드에서 언급되고 개선 된 제안을 사용했습니다. 현대적인 컴퓨터에서는 1080p 해상도에 60fps의 일반적인 프레임 속도가 가능합니다. 실제로 내 개발 시스템 (~ 3 세)에서 200fps를 얻을 수있었습니다. 다음은 프로젝트에 대한 링크입니다 https://github.com/mherkazandjian/fastgrab

1
mher

이 스레드 에서 :

 import os
 os.system("import -window root temp.png")
1
anderstood

오래된 질문입니다. 새로운 도구를 사용하여 답변하고 싶습니다.

python 3 (python 2,하지만 테스트하지는 않았습니다)) 및 PyQt5와 함께 작동합니다.

최소 작업 예. python Shell에 복사하여 결과를 얻으십시오.

from PyQt5.QtWidgets import QApplication
app = QApplication([])
screen = app.primaryScreen()
screenshot = screen.grabWindow(QApplication.desktop().winId())
screenshot.save('/tmp/screenshot.png')
0
rominf