前言
MSS作为一个跨平台的调用C-api的截屏工具,只有3KB,不依赖任何库。这就导致只能截屏,不能处理。下面给出与PIL转换的方法之前的说明
最简单的方法
获取元组类型RGB:img.pixels
不要括号
import mss
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)
#save时95的满级quality(品质)可以保持原来的高清晰度
del img
注意:此时内存占用还是近10MB!
转换成仅百余KB的数据
实现思路:用jpg模式save,得到jpg格式的图像数据(有文件头)
import io
import mss
class ImageConvert(io.BytesIO):
"假的保存"
def write(self,data):
if not hasattr(self,"data"):
self.data = b""
self.data += data
def get_data(monitor=_monitor,quality=95):
bio = ImageConvert()
bio.name = "temp.jpg"#确保时jpg格式,temp这个可以改
img = m.grab(monitor)
pil = Image.new("RGB",img.size)
pil.frombytes(img.rgb)
pil.save(bio,quality=quality)#默认最高质量
del img,pil
return bio.data
m = mss.mss()
_monitor = m.monitors[0]#默认截的是全屏
BytesIO.name是虚拟的文件名,通过这个来控制jpg
现在大小变小了,要网上传输也方便多了
获取单个数据
这个比较简单
单个位置的RGB
x,y = 0,0
import mss
m = mss.mss()
img = m.grab(m.monitors[0])
print(img.pixel(x,y))
所有的R,G,B,A
def r(img):
return img.raw[2::4]
def g(img):
return img.raw[1::4]
def b(img):
return img.raw[0::4]
def a(img):#没啥意义
return img.raw[3::4]
##########
def r_g_b(img,r=0,g=1,b=2):
"传入rgb的顺序,返回图像"
"从mss.screenshot.ScreenShot扣下来改的"
rgb = bytearray(img.height * img.width * 3)
raw = img.raw
rgb[r::3] = raw[2::4]
rgb[g::3] = raw[1::4]
rgb[b::3] = raw[0::4]
return bytes(rgb)
def bgr(img):
"听说cv2是这个格式?"
return r_g_b_(img,b=0,g=1,r=2)
总结
jpg yyds!
其实mss是不需要close的,也就不需要with语句了,用with可能是习惯?或是排除错误吧。
本文发于CSDN于2022/1/12 18:30