我想通过python脚本截取屏幕截图,并毫不干扰地保存它。

我只对Linux解决方案感兴趣,应该支持任何基于X的环境。

任何原因您不能使用scrot?

很想检查以下建议方法的性能。

新链接:manpages.ubuntu.com/manpages/karmic/man1/scrot.1.html(@ArtOfWarfare)

@Mark-:-//遗憾的是,Scrot没有OS X附带(我知道,这是一个Linux问题。通常,适用于Linux的任何内容也可以逐字地适用于OSX。)

嗯,是的,它在OS 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借来的

这在使用Glade的基于GUI的应用程序中无法正常工作,您能否改进此代码。

当我执行此代码时(在virtualbox中使用linux mint 16),生成的图像是完全黑色的。你知道为什么吗

有时,颜色编码已关闭。它很烦人。看看github.com/JDong820/neobot/blob/master/Linux/Robot/screen.py对您有没有帮助?注意对get_rowstride的调用。

在一堂课中汇编所有答案。

输出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 __name__ == '__main__':

s = screengrab()

screen = s.screen()

screen.show()

自发布以来,我不知道是否对wxWidgets进行了更改,但是getScreenByWx方法因wx._core.PyNoAppError: The wx.App object must be created first!失败。有趣的是,如果您在python shell中逐行输入代码,则代码可以正常工作,但是在脚本中却失败了。

您应该测试您的代码!或者,不是您的,如果您要发布它...在getScreenByWx中,您应该a)将myBitmap替换为bmp,然后b)将wx.App()保存到变量中。在getScreenByGtk中,将(pb != None)替换为pb is None。并且不要使用Qt,所以-您不能创建两次QApplication-您的应用将在尝试第二次创建时崩溃。

仅出于完整性考虑:

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对其进行编译。这样可以提高速度。

编辑:

我们可以用C编写函数的核心,然后在ctypes中的python中使用它,这是我一起学习的内容:

#include

#include

#include

//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);

}

然后是python文件:

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

如果不是至少比其他答案更多的投票,那是值得的金。扎实的工作和本机!干杯!

对于那些正在寻找快速方法的用户:对于大小为1000 x 1000的图片,此方法平均需要25ms。

@JHolta,您知道改变捕获图像质量的方法吗? (以加快速度)

不。当前,它只是按原样复制桌面映像,因此映像的任何转换都会产生开销。因此,在不降低台式机实际质量的情况下,您对这种想法很不满意。无论如何,当前的开销大概是在Python的末端,我们预先分配了一个缓冲区(可以在c中完成),而另一个较慢的部分是PIL读取该缓冲区,这两个都可以优化,并且也许放在C端。

这很好用,但是我不得不使用#include而不是#include。同样为了进行编译,我不得不将-lX11移到末尾,如下所示:gcc -shared -O3 -Wall -fPIC -Wl,-soname,prtscn -o prtscn.so prtscn.c -lX11。

经过进一步的压力测试,当连续捕获许多帧时,这会以各种方式泄漏资源。您必须释放X11显示屏,我认为默认情况下它限制为255个客户端。即使您增加了该限制,但由于还没有释放图像/窗口,最终将耗尽内存。香港专业教育学院提交了编辑,上面解决了这些问题。

这是最基本的答案,也是性能最佳的答案。

@Mrlenny Im也对加速感兴趣。我认为一种选择是降低整个X环境的位深度,以便XGetImage(这是主要的工作)实际上返回较低质量的图像。

这个可以在X11上运行,也许也可以在Windows上运行(请检查一下)。需要PyQt4:

import sys

from PyQt4.QtGui import QPixmap, QApplication

app = QApplication(sys.argv)

QPixmap.grabWindow(QApplication.desktop().winId()).save('test.png', 'png')

请注意PyQts许可,该许可比Python和Qt更具限制性。 riverbankcomputing.co.uk/软件/ pyqt / license

它是开箱即用地在我的Linux安装上运行的唯一解决方案。我不知道为什么,但是我到处都有PyQt4,而缺少PyWX,PyGtk和ImageGrab。 - 谢谢 :)。

该代码可以正常工作(在Windows 7 x64-Python 2.7.5; Pythonxy发行版上)。也可以使用Jpeg(例如... .save(d:/test.jpg,jpeg))

我有一个用于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')

ImportError:无法导入名称gtkpixbuf

使用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)

引用,注释,解释和python代码中的上下文。 blog.pythonlibrary.org/2010/04/16/或blog.pythonlibrary.org/2010/04/16/

import ImageGrab

img = ImageGrab.grab()

img.save('test.jpg','JPEG')

这需要Python Imaging Library

仅适用于Windows:pythonware.com/library/pil/handbook/imagegrab.htm

你可以用这个

import os

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

一旦您可以从后台程序获取图像,这是一个好方法,但是很高兴知道,如果该程序聚焦,它将返回一个异常。

我无法在Linux中使用pyscreenshot或scrot截屏,因为pyscreenshot的输出只是黑屏png图像文件。

但是,谢天谢地,在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

有点晚,但是没关系,简单的是

import autopy

import time

time.sleep(2)

b = autopy.bitmap.capture_screen()

b.save("C:/Users/mak/Desktop/m.png")

这个Autopy有一个python包

位图模块可以进行屏幕抓取(bitmap.capture_screen)

它是多平台的(Windows,Linux,Osx)。

从这个线程:

import os

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

这是一个老问题。我想用新工具回答。

适用于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')

您是否有平均时间完成此功能? 只是值得,如果值得

@Mrlenny 300毫秒(完整代码),165毫秒(最后三行代码)。

尝试一下:

#!/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."

这是什么废话? 一半的导入是无用的,存在一个永不退出的while循环(并使用1而不是True),具有if (pb != None):而不是仅if pb:,具有一些毫无意义的原始字符串。

python linux上屏幕截图_在Linux上通过Python脚本拍摄屏幕截图相关推荐

  1. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  2. linux 版本号 笔记本_在笔记本电脑上安装Linux完全版

    当前,笔记本电脑越来越多地成为工程师.技术人员的标准 办公配置.随着Linux操作系统影响的逐步深入,许许多多的Linux使用者希望能够在自己的笔记本电脑上运行Linux操作系统,以便随时随地地使用. ...

  3. linux打开端口_在Linux上打开端口

    linux打开端口 Before we learn about opening a port on Linux, let's understand what network ports are. A ...

  4. python简易搭建环境_在Windows上搭建Python2.7环境

    介绍 介绍 国人喜欢跟风,有人带节奏,就会有大批的人跟着走,这种心理时常会被利用,Python这个语言其实是最不适合初学者学习的语言,它的语法不伦不类,它的定位不清不楚,它能解决的问题很小众,它确被带 ...

  5. python连接不上数据库_绕不过去的Python连接MySQL数据库

    本文首发于<深度学习与Python> 不管是机器学习.web开发或者爬虫,数据库都是绕不过去的.那么今天我们就来介绍Python如何Mysql数据库进行连接以及数据的交换.主要分为以下几个 ...

  6. python在windows上安装_在Windows上安装Python | 严佳冬

    1.首先根据自己windows系统的版本,确认是32位还是64位,从Python的官方网站下载Python 3.4对应的程序版本.(网络慢的可以移步国内网盘直接下载:http://pan.baidu. ...

  7. python搭建django环境_在BAE上搭建python,django环境小记

    BAE 是百度推出的一个云平台,类似于谷歌GAE,新浪SAE, 但谷歌经常被 "和谐",而SAE的使用我也未能申请成功,这里PS 一下新浪. 好在百度 今年3.9日正式开放了BAE ...

  8. python在屏幕上画画_想学画画?python满足你!

    python中的绘图工具有不少,比如Matplotlib等等,但这些只能用来画表格,今天我们来介绍一款可以用来画画的库--turtle. 一.绘图原理 我们通过控制初始位置为(0,0)的海龟进行移动, ...

  9. linux 科学计算器_探索Linux作为科学计算平台

    linux 科学计算器 科学界的Linux Linux在科学界中占有举足轻重的地位也就不足为奇了. 从高性能计算集群到可视化软件的解决方案比比皆是. 甚至还有一个完整的基于Red Hat Enterp ...

最新文章

  1. 抢购系统架构设计原理参考文档
  2. python 函数(二)
  3. CMFCTabCtrl的使用
  4. SAP Spartacus OccEndpointsService单元测试的依赖注入
  5. 荷兰人发明的新客机是劈叉的!乘客坐在机翼上
  6. anguarjs 上传图片预览_JS控制上传图片个数,预览上传图片
  7. linux7自动挂载怎么做,CentOS7 Virtual Box 开机自动挂载共享文件夹
  8. soundpool android,android – 如何获取Soundpool的持续时间
  9. 思科路由器配置命令大全
  10. java在线编辑word_java web实现在线编辑word,并将word导出(一)
  11. excel选择性粘贴为何是html,Excel2016中选择性粘贴功能的使用方法
  12. IAR调试stm8的优化设置
  13. vue 用户点击不同的导航菜单,显示对应菜单所展示的区域
  14. 打造属于自己的量化投资系统2——利用backtrader创建简单移动平均线策略
  15. 每一步都要确保投资人利益—MDU价格保障机制之销毁
  16. L1-044 稳赢 (15分)
  17. java 自定义json解析注解 复杂json解析 工具类
  18. Vue中使用iconfont的精美图标——Symbol图标
  19. (转)先锋基金如何玩转智能投顾?
  20. 填充阴影线(45°细线、剖面线)——Visio制图总结(五)

热门文章

  1. wps表格l制作甘特图_WPS表格制作进度计划横道图的方法
  2. SuperVariMag 超导磁体系统 — SVM 系列
  3. 消除数据库表中的重复组
  4. 直播回顾丨年终业绩怎么冲?增长黑盒、有赞、网易云商联合给你支招啦
  5. 快速找到好书・好博客・好论坛
  6. 必读的数据库领域论文
  7. 基于python下django框架 实现校园网站系统详细设计
  8. 小程序分销商城能帮助商家解决哪些问题?
  9. Oracle VM VirtualBox虚拟MS-DOS时失败,提示内存不能为“written”
  10. VS内存泄漏检测工具Visual Leak Detector(debug|release)