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’)
这样就可以完成截图并剪裁的操作了。