写在前面

这个MSS大概是Many Screen Shot的缩写,意为多窗口截屏,是使用ctypes的截图。别看它用ctypes调用系统API,它却能跨平台(win,linux,mac)不得不说作者还是很强大的
Github 官方文档
一秒安装

优点

  • 小,压缩(whl)后仅76KB解压后共3.14MB其中3MB还是测试图片。。。
  • 无包依赖
  • 快,我的surface上大概0.2~0.5s一张(1920x1440px)当然,不是特别快
  • 清晰,比PIL和pyautogui(中的pyscreeze,实际上还是调用PIL)的清晰的多:
    6倍
    6倍放大还很清晰,如果PIL要的话,就需要1.7s了

缺点

  • 有人可能还觉得慢
  • 占用内存大(由于png格式)

安装

最新版只有76KB,需要py3.5以上。下面的版本至少要MSS1.0,内测版太不完善了。

使用

导入用import mss就可以了

简单使用

with mss.mss() as m:
    pass

主要方法

方法参数意义
m.grab截图区只截图,返回ScreenShot对象
m.shotsave的参数保存第一个显示器的截图
m.save显示器,输出格式,回调这是一个迭代器

m.monitors保存着显示器的分辨率
m.rgb m.bgra是图像数据
推荐使用m.shotm.grab

截图为文件

方法一: m.shot

with mss.mss() as m:
    mss.shot()
    #名称: monitor-1.png

方法二: m.grab

###
import mss.tools
###
rect = (0,0,0+200,0+200) #PIL风格
rect = dict(top=0,bottom=200,left=0,right=200)#mss风格
output = "screen.png"#png图片
with mss.mss() as m:
    img = mss.grab(rect)
    mss.tools.to_png(img.rgb,img.size,6,name)
    #名称: screen.png
to_png参数意义
img.rgb图像数据
img.size大小
9level,压缩等级,默认6
name上面的名字

速度

with mss.mss() as m:
    rect = m.monitors[0]
    t = time.time()
    img = m.grab(rect)
    mss.tools.to_png(img.rgb,img.size,9,"grab.png")
    print(time.time()-t)
    
    t = time.time()
    m.shot()
    print(time.time()-t)
    
    t = time.time()
    next(m.save(mon=1))#迭代1遍,即1张
    print(time.time()-t)

结果:
0.3559601306915283 <—m.grab
0.5034677982330322 <—m.shot
0.42186999320983887 <—m.save
即,grab最快

占用太大?

一张图片有8MB,5 ~ 9级压缩1MB,0级…有9MB!这时候JPG就有用了,因为它是有损压缩的,完了只剩200 ~ 300KB了!

用PIL

import mss
import mss.tools
from PIL import Image
with mss.mss() as m:
    rect = m.monitors[0]
    t = time.time()
    img = m.grab(rect)
    
    pim = Image.new("RGB",img.size)
    pim.frombytes(img.rgb)
    pim.save("grab.jpg",quality=95)
    #95的满级quality(品质)可以保持原来的高清晰度
    del img,pim

这样就不会用几百张图片溢出内存啦!

补充:旧版

import mss
m = mss.mss()
#......
m.grab()
m.shot()
m.save()
#......
m.close()

用上面的方法可以不用with

from platform import system
from mss import *

systems = {
    'Darwin' : MSSMac,
    'Linux'  : MSSLinux,
    'Windows': MSSWindows
}
try:
    m = systems[system()]
    #.....
    m.shot()
    #......
except KeyError:
    err = 'System "{0}" not implemented.'.format(system())
    raise NotImplementedError(err)

上面是0.0.2版(绝对不推荐!)

注意

MSS3.0就还支持py3.3了,最少也要装这个!

本文发于CSDN于2021/12/25 10:07
圣诞快乐!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐