Python Python3 获取手机屏幕指定坐标点的 RGBA 和 16 进制颜色

xiaoxiao · 2019年08月14日 · 最后由 rhyme 回复于 2019年10月24日 · 312 次阅读

下面的例子实现了获取手机设备屏幕指定坐标点的 RGBA 和 16 进制颜色值。实现思路比较简单:
1.截图保存到手机 sdcard
2.adb pull 到电脑当前目录
3.清除 sdcard 卡保存的截图
4.根据指定坐标点获取 RGBA 值
5.根据 RGBA 值转化成 16 进制颜色值
相关代码如下:

# -*- coding: utf-8 -*-
# @file: test.py
# @author: xiaoxiao
# @date  : 2019/8/14

from PIL import Image
import os
import time

# 获取当前目录路径
path = os.path.abspath(os.path.dirname(__file__))

# 获取图片指定坐标点颜色值RGBA
def get_RGBA(image_path, pixelX, pixelY):
    '''
    :param image_path: a str, exp: /xxx/2019-08-14_17-26-01.png
    :param pixelX: int, exp: 280
    :param pixelY: int, exp: 650
    :return RGBA: a tuple, exp:(59, 201, 255, 255)
    '''
    img_src = Image.open(image_path)
    img_src = img_src.convert('RGBA')
    str_strlist = img_src.load()
    RGBA = str_strlist[pixelX, pixelY]
    img_src.close()
    return RGBA

# 获取手机屏幕截图,并保存在当前目录,文件名通过结合当前时间命名
def screen_shot():
    '''
    :return img_name: a str, exp: 2019-08-14_17-26-01.png
    '''
    img_name = str(time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime(time.time()))) + '.png'
    # 1.adb截图保存到手机/sdcard/目录
    cmd_screen_cap = 'adb shell screencap -p /sdcard/' + img_name
    os.popen(cmd_screen_cap)
    # 2.将手机截图pull到电脑当前目录
    while True:
        time.sleep(1)
        cmd_pull = 'adb pull /sdcard/' + img_name + ' ' + path + '/'
        os.popen(cmd_pull)
        try:
            Image.open(path + '/' + img_name) # 判断pull出来的图片是否能正常打开
            break # 如果打开正常整个,则跳出循环
        except: # 否则,图片打开异常的话,再次执行pull操作
            continue
    # 3.将手机截图从/sdcard/目录中删除
    cmd_delete_sdcard = 'adb shell rm -r /sdcard/' + img_name
    os.popen(cmd_delete_sdcard)
    return img_name


# 将RGBA转换成颜色16进制,这里也支持RGB的转换
def RGBA_to_Hex(RGBA):
    '''
    :param RGBA: a tuple, exp: (59, 201, 255, 255)
    :return hex_str: a str, exp: #3BC9FFFF
    '''
    hex_str = '#'
    for i in RGBA:
        num = int(i) # 将RGBA的数值转换成数字类型
        hex_str = hex_str + str(hex(num))[2:].replace('x', '0').upper()
    return hex_str


# 将颜色16进制转换成RGBA
def Hex_to_RGBA(hex_str):
    '''
    :param hex_str: a str, exp:#3BC9FFFF
    :return RGB or RGBA: a tuple, exp: (59, 201, 255, 255)
    '''
    r = str(int(hex_str[1:3], 16))
    g = str(int(hex_str[3:5], 16))
    b = str(int(hex_str[5:7], 16))
    temp_list = []
    if len(hex_str) == 9:
        a = str(int(hex_str[7:9], 16))
        rgba = r + ',' + g + ',' + b + ',' + a
        for s in rgba.split(','):
            temp_list.append(int(s)) # 逐个将RGBA保存到list中
        RGBA = tuple(temp_list) # 将list转成tuple
        return RGBA
    else:
        rgb = r + ',' + g + ',' + b
        for s in rgb.split(','):
            temp_list.append(int(s))
        RGB = tuple(temp_list)
        return RGB


img_name = screen_shot()
img_path = path + '/' + img_name
print(img_path)
while not os.path.exists(img_name):
    time.sleep(1)
img_RGBA = get_RGBA(img_path, 280, 650)
print(img_RGBA)
img_hex = RGBA_to_Hex(img_RGBA)
print(img_hex)

截图如图:

我们可以通过看图工具,找到对应的坐标点位置,如图,我这里选取了坐标点 (280, 650) 附近的位置。
代码执行结果如下:

(59, 201, 255, 255)
#3BC9FFFF

我们可以简单通过 RGB 颜色工具对比查看结果正确性,打开:https://www.sioe.cn/yingyong/yanse-rgb-16 输入对应的 RGB 和 16 进制颜色值,如图可以看到,和我们之前截图选取的坐标点颜色大体无异。(这里在线工具我只找到 RGB 工具,没找到 RGBA)

共收到 1 条回复 时间 点赞

这想法不错

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册