تأخذ لقطة طريق بيثون السيناريو.[لينكس]
-
09-06-2019 - |
سؤال
كنت تريد أن تأخذ لقطة طريق بيثون السيناريو بشكل مخفي حفظه.
أنا مهتم فقط في لينكس حل ، ينبغي أن تدعم أي X القائمة على البيئة.
المحلول
هذا يعمل دون الحاجة إلى استخدام 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
نصائح أخرى
تجميع جميع الإجابات في فئة واحدة.النواتج بيل الصورة.
#!/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 __name__ == '__main__':
s = screengrab()
screen = s.screen()
screen.show()
فقط للتأكد من اكتمالها: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()
يمكن للمرء أن محاولة trow بعض أنواع في عنق الزجاجة الملفات في PyXlib ومن ثم ترجمة ذلك باستخدام Cython.التي يمكن أن تزيد من السرعة قليلا.
تحرير: ونحن يمكن أن يكتب جوهر وظيفة في ج ، ومن ثم استخدامها في بيثون من 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 __name__ == '__main__':
im = grab_screen(0,0,1440,900)
im.show()
هذا واحد يعمل على X11 ، وربما على ويندوز أيضا (شخص ما ، يرجى مراجعة).يحتاج PyQt4:
import sys
from PyQt4.QtGui import QPixmap, QApplication
app = QApplication(sys.argv)
QPixmap.grabWindow(QApplication.desktop().winId()).save('test.png', 'png')
لدي مشروع المجمع (pyscreenshot) بالنسبة scrot, imagemagick, pyqt, wx و pygtk.إذا كان لديك واحد منهم يمكنك استخدامها.جميع حلول مدرجة من هذه المناقشة.
تثبيت:
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')
عبر منصة الحل باستخدام 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)
import ImageGrab
img = ImageGrab.grab()
img.save('test.jpg','JPEG')
وهذا يتطلب Python Imaging Library
قصير اتضح gtkShots يبدو أنها قد تساعدك, كما انها GPLed الثعبان لقطة البرنامج, لذلك يجب أن يكون ما تحتاج إليه في ذلك.
يمكنك استخدام هذا
import os
os.system("import -window root screen_shot.png")
هناك حزمة بايثون لهذا Autopy
الصورة النقطية وحدة يمكن أن شاشة الاستيلاء على (صورة نقطية.capture_screen) فمن multiplateform (ويندوز, لينكس, ماك).
متأخرا بعض الشيء ولكن باللك من السهل واحد هو
import autopy
import time
time.sleep(2)
b = autopy.bitmap.capture_screen()
b.save("C:/Users/mak/Desktop/m.png")
من هذا الموضوع:
import os
os.system("import -window root temp.png")
أنا لا يمكن أن تأخذ لقطة في لينكس مع pyscreenshot أو scrot لأن الإخراج من pyscreenshot
كان مجرد شاشة سوداء png image file.
ولكن الحمد لله كان هناك طريقة سهلة جدا لأخذ لقطات الشاشة في لينكس دون تركيب أي شيء.فقط ضع رمز أدناه في الدليل الخاص بك وتشغيل مع 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
لقد كتبت مؤخرا حزمة يأخذ لقطة باستخدام X11 مكتبة ترجع الصورة كما numpy مجموعة.أنا في الواقع تستخدم بعض الاقتراحات التي ذكر في هذا الموضوع و تحسين عليهم.نموذجي معدل الإطار 60+ fps بالنسبة 1080p القرار على آلة الحديثة.في الواقع على التنمية بلدي آلة (وهذا هو ~3 عاما) تمكنت من الحصول على 200 إطارا في الثانية.هنا هو رابط المشروع https://github.com/mherkazandjian/fastgrab
انها مسألة قديمة.أود الإجابة عليه باستخدام أدوات جديدة.
يعمل مع بيثون 3 (يجب أن تعمل مع بيثون 2 ولكن لم اختبار) و PyQt5.
الحد الأدنى من العمل على سبيل المثال.نسخ إلى شل بايثون و الحصول على النتيجة.
from PyQt5.QtWidgets import QApplication
app = QApplication([])
screen = app.primaryScreen()
screenshot = screen.grabWindow(QApplication.desktop().winId())
screenshot.save('/tmp/screenshot.png')
محاولة:
#!/usr/bin/python
import gtk.gdk
import time
import random
import socket
import fcntl
import struct
import getpass
import os
import paramiko
while 1:
# generate a random time between 120 and 300 sec
random_time = random.randrange(20,25)
# wait between 120 and 300 seconds (or between 2 and 5 minutes)
print "Next picture in: %.2f minutes" % (float(random_time) / 60)
time.sleep(random_time)
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])
ts = time.asctime( time.localtime(time.time()) )
date = time.strftime("%d-%m-%Y")
timer = time.strftime("%I:%M:%S%p")
filename = timer
filename += ".png"
if (pb != None):
username = getpass.getuser() #Get username
newpath = r'screenshots/'+username+'/'+date #screenshot save path
if not os.path.exists(newpath): os.makedirs(newpath)
saveas = os.path.join(newpath,filename)
print saveas
pb.save(saveas,"png")
else:
print "Unable to get the screenshot."