Tech Note · 2023-01-29 0

poco 获取当前元素的截图

Q:使用Poco的截图方法来截取整个屏幕,然后使用Python来剪裁图片只留下当前元素

A:使用CV2库处理, 先import库:

import cv2
import base64
import numpy as np
from datetime import datetime
from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco()

# 传入一个UIObjectProxy对象,获取它的截图
def get_element_snapshot(self, item=None, save=False):
    # 先判断传入的item是否是一个存在的UI对象
    if not item.exists():
        logging.INFO("传入的item不是一个存在的UI对象!")
    # 使用poco获取全屏截图
    screenshot = poco.snapshot()
    # 将截图转换成 numpy 数组
    image = cv2.imdecode(
        np.fromstring(base64.b64decode(screenshot[0]), np.uint8),
        cv2.IMREAD_COLOR)
    logging.debug("全图宽高:{}".format(image.shape[:2]))
    pos = item.get_position()
    size = item.get_size()
    x1, y1, x2, y2 = pos[0] - (size[0] * 0.5), pos[1] - (size[1] * 0.5), pos[0] + (size[0] * 0.5), pos[1] + (size[1] * 0.5)
    x1 = max(x1, 0) * image.shape[1]
    y1 = max(y1, 0) * image.shape[0]
    x2 = min(x2, poco.get_screen_size()[0]) * image.shape[1]
    y2 = min(y2, poco.get_screen_size()[1]) * image.shape[0]
    logging.debug("coordinate: x1={}, x2={}, y1={}, y2={}".format(x1, x2, y1, y2))
    target_image = image[int(y1):int(y2), int(x1):int(x2)]
    # 如果需要保存图像,则保存
    if save:
        # 目标文件夹
        folder_path = os.path.join("log", "images")
        # 如果文件夹不存在,创建文件夹
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
        # 文件名
        file_name = datetime.now().strftime("%y%m%d_%H%M%S") + ".png"
        # 完整路径
        full_path = os.path.join(folder_path, file_name)
        cv2.imwrite(full_path, target_image)
    return target_image

此方法会获得PIL格式的图片,airtest无法识别,推荐使用上文的cv2

A:
首先,安装PIL库:
pip install pillow

接下来,你可以使用Poco的截图方法来截取整个屏幕:

python

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco()
screenshot = poco.screenshot()

最后,使用PIL库中的Image类来打开截图,并使用crop方法来剪裁图片:

python

from PIL import Image
img = Image.open(screenshot)

获取当前元素的坐标

x, y, width, height = element.get_bounds()

使用crop方法剪裁图片

img = img.crop((x, y, x + width, y + height))

保存剪裁后的图片

img.save(‘screenshot.png’)

这样就可以完成截图并剪裁的操作了。