无需写入磁盘即可截屏

时间:2017-12-25 05:53:26

标签: python byte screenshot python-mss

我想要一个python脚本,可以截取屏幕而不立即将其直接保存到磁盘上。基本上是否有一个带有函数的模块,它返回原始字节,然后我可以手动将其写入文件中?

import some_screenshot_module
raw_data = some_screenshot_module.return_raw_screenshot_bytes()
f = open('screenshot.png','wb')
f.write(raw_data)
f.close()

我已经检查了mss,pyscreenshot和PIL但我找不到我需要的东西。我发现了一个看起来像我正在寻找的函数,称为frombytes。但是,从frombytes函数中检索字节并将其保存到文件后,我无法将其视为.BMP,.PNG,.JPG。是否有一个函数可以返回我可以保存到文件中的原始字节,也可以是具有类似函数的模块?

2 个答案:

答案 0 :(得分:2)

MSS 3.1.2开始,使用提交dd5298,您可以轻松完成此操作:

import mss
import mss.tools


with mss.mss() as sct:
    # Use the 1st monitor
    monitor = sct.monitors[1]

    # Grab the picture
    im = sct.grab(monitor)

    # Get the entire PNG raw bytes
    raw_bytes = mss.tools.to_png(im.rgb, im.size)

    # ...

此更新已在PyPi上提供。

原始回答

使用MSS模块,您可以访问原始字节:

import mss
import mss.tools


with mss.mss() as sct:
    # Use the 1st monitor
    monitor = sct.monitors[1]

    # Grab the picture
    im = sct.grab(monitor)

    # From now, you have access to different attributes like `rgb`
    # See https://python-mss.readthedocs.io/api.html#mss.tools.ScreenShot.rgb
    # `im.rgb` contains bytes of the screen shot in RGB _but_ you will have to
    # build the complete image because it does not set needed headers/structures
    # for PNG, JPEG or any picture format.
    # You can find the `to_png()` function that does this work for you,
    # you can create your own, just take inspiration here:
    # https://github.com/BoboTiG/python-mss/blob/master/mss/tools.py#L11

    # If you would use that function, it is dead simple:
    # args are (raw_data: bytes, (width, height): tuple, output: str)
    mss.tools.to_png(im.rgb, im.size, 'screenshot.png')

使用部分屏幕的另一个例子:https://python-mss.readthedocs.io/examples.html#part-of-the-screen

以下是更多信息的文档:https://python-mss.readthedocs.io/api.html

答案 1 :(得分:1)

你仍然可以使用pyscreenshot模块和PIL和grab_to_file函数,只需使用命名管道而不是实际文件。

如果你在linux上,你可以使用os.mkfifo来创建管道,然后在一个线程中打开fifo进行读取,并在另一个线程中调用pyscreenshot.grab_to_file(因为打开fifo后它必须是不同的线程用于写入块,直到另一个线程打开它以进行读取,反之亦然)

这是一个可行的代码片段:

import os
import multiprocessing
import pyscreenshot

fifo_name = "/tmp/fifo.png"


def read_from_fifo(file_name):
    f = open(file_name,"rb")
    print f.read()
    f.close()

os.mkfifo(fifo_name)
proc = multiprocessing.Process(target=read_from_fifo, args=(fifo_name,))
proc.start()

pyscreenshot.grab_to_file(fifo_name)

在这种情况下,我只是将原始字节打印到屏幕上,但你可以随心所欲地用它做什么

另请注意,即使内容永远不会写入磁盘,但磁盘上有一个临时文件,但数据永远不会缓存在其中