实现原理:安卓adb截图传到电脑,然后用python裁剪获得两张数字图片,使用ddddocr识别数字,比较大小,再用adb命令模拟安卓手势实现><

import os
import ddddocr
from time import sleep
from PIL import Image
 
def take_screenshot(path):
    """从设备截取屏幕并保存到指定路径。"""
    os.system(f'adb shell screencap -p > {path}')
 
    # 读取截取的屏幕截图并替换行结束符
    with open(path, 'rb') as f:
        return f.read().replace(b'\r\n', b'\n')
 
def process_image(image_path, crop_area):
    """打开图片,裁剪并返回裁剪后的图片。"""
    with Image.open(image_path) as img:
        return img.crop(crop_area)
 
def extract_text(img):
    """提取图片中的文本。"""
    with open(img, 'rb') as f:
        img_bytes = f.read()
    res = ocr.classification(img_bytes)
    return res.replace(' ', '').replace('\n', '')
 
def compare_numbers(x, y):
    """比较两个数字并相应地执行滑动操作。"""
    try:
        x_int, y_int = int(x), int(y)
        if x_int > y_int:
            print(f"{x} > {y}")
            os.system("adb shell input swipe 450 1800 850 1900 1")
            os.system("adb shell input swipe 850 1900 450 2000 1")
        else:
            print(f"{x} < {y}")
            os.system("adb shell input swipe 850 1800 450 1900 1")
            os.system("adb shell input swipe 450 1900 850 2000 1")
    except ValueError:
        print("数字格式无效。")
 
def main():
    """主程序逻辑。"""
    screenshot_path = 'screenshot.png'
 
    # 截取屏幕并保存
    screenshot = take_screenshot(screenshot_path)
    with open(screenshot_path, 'wb') as f:
        f.write(screenshot)
 
    # 定义裁剪区域(左,上,右,下)分别是两个数字在图片中的区域坐标
    crop_areas = [
        (330, 720, 530, 880),
        (730, 720, 930, 880)
    ]
 
    cropped_images = []
    for i, crop_area in enumerate(crop_areas, start=1):
        cropped_image = process_image(screenshot_path, crop_area)
        cropped_image_path = f"screenshot{i}.png"
        cropped_image.save(cropped_image_path)
        cropped_images.append(cropped_image_path)
 
    # 从裁剪后的图片中提取文本
    texts = [extract_text(image) for image in cropped_images]
 
    # 比较提取的数字
    compare_numbers(texts[0], texts[1])
 
 
if __name__ == '__main__':
    ocr = ddddocr.DdddOcr(show_ad=False)
    while True:
        main()
        sleep(0.2)

这段代码实现了一个自动滑动操作的功能。主要逻辑如下:

  1. 导入所需的模块和库。
  2. 定义一个函数take_screenshot,用于从设备截取屏幕截图并保存到指定路径。
  3. 定义一个函数process_image,用于打开图片、裁剪并返回裁剪后的图片。
  4. 定义一个函数extract_text,用于提取图片中的文本。
  5. 定义一个函数compare_numbers,用于比较两个数字并相应地执行滑动操作。
  6. 定义主程序逻辑main
    • 截取屏幕并保存为screenshot.png
    • 定义两个裁剪区域,分别是两个数字在图片中的区域坐标。
    • 遍历裁剪区域,将裁剪后的图片保存并存储路径。
    • 从裁剪后的图片中提取文本。
    • 比较提取的两个数字。
  7. 在主程序部分,创建一个DdddOcr对象,用于识别文字。
  8. 使用while True循环,不断执行主程序,间隔0.2秒执行一次。

该代码主要通过调用adb命令实现屏幕截图、滑动等操作,并使用dddocr库进行文字识别。不过,其中还有一些细节需要注意,比如截图和图片处理的作用、数字比较的逻辑等。如需详细了解,请参考相关文档和代码注释。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐