相关文章推荐
憨厚的遥控器  ·  VSCode 正则表达式 ...·  1 月前    · 
想表白的仙人掌  ·  WPF ...·  1 年前    · 

上篇文章 讲了python mss截屏,这一篇来讲讲各种方式的优劣(以最高画质)
本文测试均在Windows10x64上进行
分辨率2160x1440

先说,没用pyqt(没用过)和pywin32尽量支持全平台(win,linux,mac)

PIL.ImageGrab(win&mac)

应该大部分人用过或知道

from PIL import ImageGrab,Image
def grab_pil():
    im = ImageGrab.grab()
    im.save("pil.jpg",quality=95)

pyautogui(win&linux&mac)

应该也有不少人知道,实际上pyautogui的screenshot是调用pyscreeze的

import pyautogui
def grab_pag():
    im = pyautogui.screenshot()
    im.save("pag.jpg",quality=95)

返回PIL.Image,6倍清晰

MSS·1 内存中转换PIL

def grab_mss_pil():
    with mss.mss() as m:
        im = m.grab(m.monitors[0])
        img = Image.new("RGB",im.size)
        img.frombytes(im.rgb)
        img.save("mss-pil.jpg",quality=95)

MSS·2 文件转换PIL

import os
def grab_mss_pil2():
    with mss.mss() as m:
        im = m.grab(m.monitors[0])
        mss.tools.to_png(im.rgb,im.size,6,"temp.png")
        img = Image.open("temp.png")
        img.save("mss-pil-2.jpg",quality=95)
        os.remove("temp.png")

MSS·3 内存转换Pygame

import pygame as pg
def grab_mss_pg():
    with mss.mss() as m:
        im = m.grab(m.monitors[0])
        s = pg.image.fromstring(im.rgb,im.size,"RGB")
        pg.image.save(s,"mss-pg.jpg")
t = time.time()
grab_pil()
print("PIL",time.time() - t)
t = time.time()
grab_pag()
print("PAG",time.time() - t)
t = time.time()
grab_mss_pil()
print("MSS1",time.time() - t)
t = time.time()
grab_mss_pil2()
print("MSS2",time.time() - t)
pg.init()
t = time.time()
grab_mss_pg()
print("MSS->PG",time.time() - t)

第一次
PIL 0.1140146255493164
PAG 0.09567046165466309
MSS1 0.1569356918334961
MSS2 0.47719478607177734
MSS->PG 0.5200934410095215

第二次
PIL 0.13492321968078613
PAG 0.10294556617736816
MSS1 0.14389920234680176
MSS2 0.940852165222168
MSS->PG 0.5586795806884766

第三次
PIL 0.10824346542358398
PAG 0.09102106094360352
MSS1 0.15020394325256348
MSS2 0.46080827713012695
MSS->PG 0.46437573432922363

  • 当运行东西少时pyautogui快(为什么)
  • PIL很稳定在0.1s左右
  • 内存MSS比较稳定,1.5s左右
  • 文件MSS最慢且不稳定
  • MSS转换pg慢,0.5s左右

2022/1/27更新:pyautogui使用了functools.wraps包装,介个似乎是pyd库,似乎可以给函数约0.1s的性能提升,所以理论上照python cookbook上说的,使用local variable和这个wraps可以使mss.grab的性能更上一层楼,改天试试。

方式速度/ (s/图)
PIL约0.1s
pyautogui0.08到0.12s
MSS PIL约1.5s
MSS PIL file0.4到0.9s
MSS Pygame约0.5s

神奇的是,mss.mss().shot()方法居然约0.2s,比转PIL还慢!
本文发于CSDN 于2021/12/25 19:24

文章目录前言介绍PIL.ImageGrab(win&mac)pyautogui(win&linux&mac)MSS·1 内存中转换PILMSS·2 文件转换PILMSS·3 内存转换Pygame对比结果结论前言上篇文章讲了python mss截屏,这一篇来讲讲各种方式的优劣(以最高画质)本文测试均在Windows10x64上进行分辨率2160x1440介绍先说,没用pyqt(没用过)和pywin32尽量支持全平台(win,linux,mac)PIL.ImageGrab(    PyScreeze是Python 2和3的一个简单的跨平台屏幕截图模块。    PyScreeze可以拍摄截图,将它们保存到文件中,并在屏幕中定位图像。这是有用的,如果你有一个小的图像,比方说,一个按钮,需要点击,并希望找到它在屏幕上。    截图功能需要 Pillow模块。OSX使用Screencapture命令,该命令与操作系统一起提供。Linux使用SCROT命令,它可以通过运行sudo apt-get in
文章目录写在前面优点缺点安装使用简单使用主要方法截图为文件方法一: `m.shot`方法二: `m.grab`速度太大?用PIL补充:旧版注意 这个MSS大概是Many Screen Shot的缩写,意为多窗口截屏,是使用ctypes的截图。别看它用ctypes调用系统API,它却能跨平台(win,linux,mac)不得不说作者还是很强大的 Github 官方文档 小,压缩(whl)后仅76MB 快,我的surface上大概0.2~0.5s一张(1920x1440px)当然,
pmss (Poor Man's Screenshooter)是一个简单的 bash 前端,用于屏幕捕获实用程序 Scrot。 pmss可让您轻松捕获屏幕截图,而无需记住 Scrot 的各种选项和标志。 pmss还利用 xdotool 的强大功能使以各种方式截取屏幕截图的任务不仅成为可能,而且令人愉快。 拍摄完完美的屏幕截图后, pmss可以选择将屏幕截图匿名上传到imgur或imgur帐户,并为您提供GitHub,Reddit,论坛,留言板,网站,博客的图像共享链接。 当然pmss也会给你直接的图片链接和删除上传图片的链接。 更重要的是, pmss还将保留所有匿名上传图像的日志,以便您可以在需要时重新使用图像链接,或者在需要时使用删除链接删除上传的图像。 pmss还可以让您通过一次按键清空整个屏幕截图目录。 截取整个屏幕的截图 获取焦点窗口的屏幕截图 今天我看了一下自己的文件夹,发现了自己写了许多似乎很无聊的代码。于是乎,一个想法油然而生:“生活已经很无聊了,不如再无聊一点叭”。 说干就干,那就开一个专题,我们称之为kimol君的无聊小发明。 妙…啊~~~ 今天要做的东西,就是用python写一个截屏工具。想必大家平时截屏的时候很多都是用的微信的ALT+A或者是WINDOWS自带的截屏软件。作为技术宅的我,怎么总是用别人的东西呢? 看我的,上图: 效果还阔以,好歹这个小猫咪截出来也是有模有样的~ 一、技术实现 1. 相关库 在python中可以实现截图的库有很多,这里我用的是pyautogui,它可以对指定区域进行截屏
环境windows 10 64bitpython 3.8mss 6.1.0前言python-mss 是一个速度非常快的截图工具,支持跨平台,使用纯 python 语言开发。安装使用 pip 安装,执行命令pipinstallmsspython-mss 还提供了命令行工具,使用 mss 就可以直接截取屏幕,默认是全屏其它可使用的参数,可以通过 mss -h 来查看$mss-h usage:...
简单介绍mss An ultra fast cross-platform multiple screenshots module in pure Python using ctypes.  具体去官网:https://github.co... 红框内的是获得当前监视器设备的全屏尺寸。也可以可以不要,可以直接给w,h赋值,指定宽度和高度。红框上面的是获得设备准备条件。 第一个红线,是左边距和上边距填充背景色黑色,默认(0,0)就好,也可以自己试试。这里不加图了。 第二个红线就是指定的图片宽和高(>0)。第三个红线,所截图的左上角的坐标,若小于0,越界部分则填充黑色。 该代码使用 `pyautogui` 库进行截屏操作,使用 `pyautogui.screenshot()` 函数可以截取整个屏幕,并将截图存储到文件 `screenshot.png` 中。 该代码可以在 Python 3 中运行,需要先安装 `pyautogui` 库。