微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 有没有比PIL.ImageGrab.grab()有更好的方法来捕获屏幕?

我正在用python制作一个截屏程序.我目前的问题是PIL.ImageGrab.grab()在2秒后给出了相同的输出.例如,因为我认为我不清楚,在下面的程序中,几乎所有图像都是相同的,具有相同的Image.tostring()值,即使我在PIL.ImageGrab期间移动我的屏幕.抓斗循环正在执行.

>>> from PIL.ImageGrab import grab
>>> l = []
>>> import time
>>> for a in l:
        l.append(grab())
        time.sleep(0.01)


    >>> for a in range(0, 30):
        l.append(grab())
        time.sleep(0.01)


>>> b = []
>>> for a in l:
        b.append(a.tostring())


>>> len(b)
30
>>> del l
>>> last = []
>>> a = 0
>>> a = -1
>>> last = ""
>>> same = -1
>>> for pic in b:
        if b == last:
            same = same + 1
        last = b


>>> same
28
>>> 

这是一个问题,因为所有图像都是相同的,但是30个中的1个是不同的.这将成为一个绝对可怕的高质量视频.请告诉我是否有更好的替代品PIL.ImageGrab.grab().我需要捕捉整个屏幕.谢谢!

编辑:

到目前为止,看起来最好的选择是使用pywin32.我现在正在使用它,但它很慢.我并不真正关心兼容性,因为现在这个项目是个人的.每次我计算出程序的帧速率时,pywin32都是如此之慢,它是负面的.请告诉我是否有更快的替代方案.谢谢!

解决方法:

PIL.ImageGrab有很多替代品.

如果您想要跨平台,几乎每个主要的窗口库都有屏幕抓取功能.这是使用PyQt4的示例:

import sys
from PyQt4.QtGui import Qpixmap, QApplication
app = QApplication(sys.argv)
Qpixmap.grabWindow(QApplication.desktop().winId()).save('screenshot.jpg', 'jpg')

如果您想要与Qt认为“桌面”的认设置不同的东西,您需要深入了解PyQt或Qt文档.

缺点是这些跨平台窗口库在安装,分发方面通常都很重要,有时甚至是你如何构建程序.

另一种方法是使用特定于Windows的代码.虽然可以直接使用Windows API,但更简单的解决方案是PyWin32.

import win32gui, win32ui, win32con, win32api
hwin = win32gui.GetDesktopWindow()
width = win32api.GetSystemMetrics(win32con.SM_cxvIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
hwindc = win32gui.GetwindowDC(hwin)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, width, height)
memdc.SelectObject(bmp)
memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCcopY)
bmp.SaveBitmapFile(memdc, 'screenshot.bmp')

像往常一样,你必须准确指出“桌面”的含义;此版本指定当前会话的“虚拟屏幕”,如果您在控制台本地运行,则为所有监视器的组合,如果您在终端服务上运行,则为远程视图.如果您想要不同的东西,您必须阅读MSDN上的相关Win32文档.但在大多数情况下,从文档转换到PyWin32是微不足道的.

(顺便说一句,即使我说“Win32”,同样适用于Win64.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐