我正在用python制作截屏程序。 我当前的问题是PIL.ImageGrab.grab()给了我2秒后相同的输出。 例如,我觉得我不清楚,在下面的程序中,几乎所有的图像都是相同的,都有相同的Image.tostring()值,尽pipe我在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 >>>
这是一个问题,因为所有的图像都是一样的,但是有三分之一是不同的。 这将使一个绝对可观的质量video。 请告诉我,如果有更好的质量替代PIL.ImageGrab.grab()。 我需要捕捉整个屏幕。 谢谢!
编辑:
到目前为止,看起来最好的select是使用pywin32。 我现在正在使用,但速度很慢。 我并不在意兼容性,因为现在这个项目是个人的。 每次我计算出程序的帧速率时,pywin32都是如此之慢,是负面的。 请告诉我,如果有更快的select。 谢谢!
有许多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')
像往常一样使用Win32,你必须确切地指定你的意思是“桌面”; 此版本指定当前会话的“虚拟屏幕”,如果您在控制台本地运行,则为所有监视器的组合;如果在终端服务上运行,则为远程视图。 如果你想要不同的东西,你将不得不在MSDN上阅读相关的Win32文档。 但是大多数情况下,从文档翻译到PyWin32是微不足道的。
(顺便说一下,即使我说“Win32”,相同的所有作品为Win64。)