Python+uiautomator2指定区域截图

想区域截图,但是在网上找了一圈,没有什么有用的信息,基本都是全屏截图的信息。最后只能自己尝试着摸索了。

已知d.screenshot()是截取整个屏幕,尝试根据元素截图d(resourceId="xx.xx.xx").screenshot截图,发现可以截取指定元素区域,具体代码如下

d = u2.connect("192.168.10.10")
d(resourceId="com.xxx.xxx:id/tv_close").screenshot().save("test.png")

既然能截取元素区域的图片,那肯定能够截取指定区域的图片,遂查看screenshot的实现逻辑(在_selector.py里),代码如下

def screenshot(self) -> Image.Image:
    im = self.session.screenshot()
    return im.crop(self.bounds())

主要就是self.bounds()这个函数,继续点进去查看,发现截图区域的坐标是调用元素的info信息获取的

def bounds(self):
    """
    Returns:
        left_top_x, left_top_y, right_bottom_x, right_bottom_y
    """
    info = self.info
    bounds = info.get('visibleBounds') or info.get("bounds")
    lx, ly, rx, ry = bounds['left'], bounds['top'], bounds['right'], bounds['bottom'] # yapf: disable
    return (lx, ly, rx, ry)

所以,我们只需要重写一下screenshot函数即可,传入我们指定的坐标。

(只简单重写,本着能用就行的原则,部分异常未做处理)

    def screenshot(self,bounds=None) -> Image.Image:
        im = self.session.screenshot()
        if isinstance(bounds, tuple) and len(bounds)==4:
            try:
                ret = im.crop(bounds)
            except:
                raise "poition error"
                return False
            else:
                return ret
        return im.crop(self.bounds())

截图时传入 (lx, ly, rx, ry)  4个坐标即可

缺点就是,调用的时候只能用  d.(元素定位信息).screenshot((lx, ly, rx, ry)).save("xx.png"),不能直接使用d.screenshot()这种方法调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值