[MSS]-2 截屏数据与PIL转换

前言

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值