回答
在 Hamibot 中识别屏幕文字的颜色,核心思路是通过屏幕截图获取图像数据,然后在文字所在的坐标区域进行颜色采样或匹配。由于 Android 系统不直接暴露 UI 控件的文字颜色属性,你需要结合坐标定位或 OCR 获取文字位置后,使用图像 API 提取颜色。
你可以按照以下步骤实现:
1. 基础实现步骤
- 申请屏幕截图权限并捕获当前屏幕。
- 确定文字的大致坐标区域(可通过
text()控件查找、固定坐标或 OCR 获取边界)。 - 使用
images.pixel获取单点颜色,或使用images.findColor/images.findMultiColors在区域内匹配目标颜色。 - 根据实际显示效果调整匹配算法与阈值,以应对抗锯齿、阴影或背景干扰。
2. 示例代码(兼容 Rhino 1.7.15)
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog("未授予屏幕截图权限");
hamibot.exit();
}
sleep(1000);
// 假设已知文字区域坐标 (x, y, width, height)
var x = 100, y = 200, w = 200, h = 50;
var img = captureScreen();
if (!img) {
toastLog("截图失败");
hamibot.exit();
}
// 方法1:直接读取区域中心点颜色
var centerX = x + Math.floor(w / 2);
var centerY = y + Math.floor(h / 2);
var color = images.pixel(img, centerX, centerY);
toastLog("中心点颜色值: " + colors.toString(color));
// 方法2:在区域内查找是否包含指定颜色(带容错)
var targetColor = "#333333"; // 替换为你预期的文字颜色
var threshold = 10; // 颜色匹配容差,通常 5~15
var point = images.findColor(img, targetColor, {
region: [x, y, w, h],
threshold: threshold,
algorithm: "rgb+" // 使用加权RGB欧氏距离,抗干扰能力较强
});
if (point) {
toastLog("匹配成功,坐标: " + point.x + ", " + point.y);
} else {
toastLog("未找到匹配颜色");
}
// 务必释放截图内存
img.recycle();
3. 最佳实践与注意事项
- 抗锯齿与渐变处理:现代 UI 的文字边缘通常带有抗锯齿或半透明过渡,单点采样容易取到背景色。建议在文字区域内按网格采样多个点,统计出现频率最高的颜色作为主色。
- 动态位置适配:若文字位置不固定,优先使用
text("目标文字").findOne().bounds()获取控件边界,再计算采样区域。 - 算法选择:
"rgb+":适合常规颜色匹配,对亮度变化有一定容忍度。"hs":基于 HSV 色调匹配,适合忽略明暗变化、只关注色相的场景(如区分红/蓝/绿文字)。
- 环境干扰:深色模式、系统主题切换或屏幕亮度调节会改变实际渲染颜色。建议在固定测试环境下运行,或加入动态颜色校准逻辑。
- 内存管理:
captureScreen()返回的图像对象占用较大内存,使用完毕后必须调用img.recycle(),频繁截图时建议控制执行频率。
如果你能提供具体的应用场景(例如:固定坐标、动态列表、或需要区分多行文字颜色),我可以为你提供更精准的坐标计算与采样策略。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实