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

xiaoxiao · August 14, 2019 · 320 hits

在我们做UI自动化的时候,可能会遇到一种情况,点击某个button或者icon后,只有颜色变化,控件id不变,导致无法判断是否已经点击成功。因此,我们可以通过获取该icon中心坐标的颜色来进行判断,点击之前获取一次颜色值,点击后再获取一次颜色值,两者对比即可。其中RGBA分别代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间(透明度)。
下面的例子实现了获取手机设备屏幕指定坐标点的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)

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up