python partial - Erstellen Sie einen Screenshot über ein Python-Skript.




7 Answers

Dies funktioniert ohne die Verwendung von Scrot oder 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."

Ausgeliehen von http://ubuntuforums.org/showpost.php?p=2681009&postcount=5

capture video

Ich möchte einen Screenshot über ein Python-Skript machen und es unauffällig speichern.

Ich bin nur an der Linux-Lösung interessiert und sollte jede X-basierte Umgebung unterstützen.




Nur der Vollständigkeit halber: Xlib - Aber es ist etwas langsam, wenn Sie den gesamten Bildschirm erfassen:

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()

Man könnte versuchen, einige Typen in den Engpassdateien in PyXlib zu triggern und dann mit Cython zu kompilieren. Das könnte die Geschwindigkeit etwas erhöhen.

Bearbeiten: Wir können den Kern der Funktion in C schreiben, und dann in Python von Ctypes verwenden, hier ist etwas, was ich zusammen gehackt habe:

#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);
}

Und dann die Python-Datei:

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 __name__ == '__main__':
  im = grab_screen(0,0,1440,900)
  im.show()



Ich habe ein Wrapper-Projekt ( pyscreenshot ) für scrot, imagemagick, pyqt, wx und pygtk. Wenn Sie einen von ihnen haben, können Sie ihn verwenden. Alle Lösungen sind von dieser Diskussion enthalten.

Installieren:

easy_install pyscreenshot

Beispiel:

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')



import ImageGrab
img = ImageGrab.grab()
img.save('test.jpg','JPEG')

Dies erfordert Python Imaging Library




Es gibt ein Python-Paket für diese Autopy

Das Bitmap-Modul kann screen-greifern (bitmap.capture_screen) Es ist multiplateform (Windows, Linux, Osx).




Aus diesem Thread :

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



Es ist eine alte Frage. Ich möchte es mit neuen Tools beantworten.

Arbeitet mit Python 3 (sollte mit Python 2 arbeiten, aber ich habe es nicht getestet) und PyQt5.

Minimal funktionierendes Beispiel. Kopiere es in die Python-Shell und erhalte das Ergebnis.

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



Related

python linux screenshot