使用findImage方法的时候,需要寻找的图片应该存放在什么位置

已存档
wrekemdkwh · 9 天前
第 1 条补充
·
9 天前

我有多张需要找的图片使用images。load方法怎么实现遍历我要找的图片

第 2 条补充
·
8 天前

保存失败:{"code":1050,"message":"请求额度不足,前往控制台获取更多 https://hamibot.com/account/quotas","documentation_url":"https://docs.hamibot.com/rest/overview"}

回答

Hamibot AI
1
· 9 天前

使用 findImage 方法时,需要寻找的模板图片通常存放在设备的内部存储目录中,例如 /sdcard/ 目录下。你需要确保脚本有权限读取该路径,并且路径填写正确。

通过 images.read() 函数加载本地图片,然后传入 findImage 进行匹配。路径必须是绝对路径。

以下是一个完整的代码示例:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
    toastLog('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
}
sleep(1000);

// 读取存放在 /sdcard/ 目录下的模板图片
var template = images.read('/sdcard/模板图片.png');

// 判断图片是否加载成功
if (!template) {
    toastLog('图片加载失败,请检查路径');
    hamibot.exit();
}

// 截图并找图
var p = findImage(captureScreen(), template, {
    threshold: 0.8
});

if (p) {
    toastLog('找到啦:' + p);
} else {
    toastLog('没找到');
}
hamibot.exit();

注意事项:

  1. 图片路径必须完整,例如 /sdcard/xxx.png
  2. 确保图片文件确实存在于指定路径,否则 images.read() 会返回 null。
  3. 对屏幕截图进行找图时,需要申请屏幕截图权限 requestScreenCapture()
  4. 找图相似度 threshold 可根据实际情况调整,范围 0~1,默认 0.9。

补充回答 1

使用 images.load 方法遍历多张网络图片时,你需要将图片的 URL 地址存储在一个数组中,然后通过循环逐个加载并进行找图操作。由于 images.load 加载的是网络图片,需要注意网络稳定性,并且每次加载后的 Image 对象必须手动回收以避免内存泄漏。

以下是一个完整的代码示例,展示如何遍历 URL 数组并查找图片:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
    toastLog('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
}
sleep(1000);

// 定义需要寻找的图片 URL 数组
var imageUrls = [
    "https://example.com/image1.png",
    "https://example.com/image2.png",
    "https://example.com/image3.png"
];

var found = false;
var screen = captureScreen();

// 遍历 URL 数组
for (var i = 0; i < imageUrls.length; i++) {
    var url = imageUrls[i];
    // 加载网络图片
    var template = images.load(url);
    
    // 判断图片是否加载成功
    if (template) {
        toastLog('正在查找第 ' + (i + 1) + ' 张图片...');
        // 在屏幕截图中查找模板
        var p = findImage(screen, template, {
            threshold: 0.8
        });
        
        if (p) {
            toastLog('找到图片:' + url + ' 位置:' + p);
            found = true;
            // 回收模板图片
            template.recycle();
            break; // 找到后退出循环
        } else {
            toastLog('未找到第 ' + (i + 1) + ' 张图片');
        }
        // 回收模板图片,非常重要
        template.recycle();
    } else {
        toastLog('图片加载失败:' + url);
    }
}

// 屏幕截图不需要回收,但模板图片必须回收
if (!found) {
    toastLog('所有图片均未找到');
}
hamibot.exit();

关键点说明:

  1. 内存回收images.load 返回的 Image 对象占用内存,使用完毕后必须调用 recycle() 方法回收,否则容易导致脚本内存溢出崩溃。
  2. 空值检查:网络加载可能失败,images.load 失败时返回 null,使用前必须判断对象是否存在。
  3. 截图复用:示例中只截取了一次屏幕 captureScreen(),在循环中复用这张截图进行找图,效率比每次循环都截图更高。
  4. 网络延迟:加载网络图片受网速影响,如果图片较多或较大,建议适当增加超时处理或考虑先将图片下载到本地使用 images.read 读取,这样更稳定且速度更快。

补充回答 2

这个错误表明你的 REST API 请求额度 已耗尽。错误码 1050 specifically 指向请求额度不足。

错误原因

Hamibot 对 REST API 的调用次数有限制。每个账户每月有一定的免费请求额度,当该额度用尽时,涉及 API 调用的操作(如保存脚本配置、触发远程运行等)会失败并返回此错误。

额度规则

  • 免费额度:每月 100 次。
  • 重置时间:每月 1 号 00:00:00 自动重置。
  • 用途:每次调用 REST API 接口消耗 1 次额度。

解决方案

  1. 购买额度
    前往控制台购买额外的请求额度。
    地址:https://hamibot.cn/account/quotas

  2. 等待重置
    如果不紧急,可以等待到下个月 1 号,免费额度会自动刷新。

  3. 检查使用情况
    你可以通过 API 查询当前额度使用情况,确认剩余次数。

    示例代码:

    // 文档地址 https://docs.hamibot.com/
    var res = http.request('https://api.hamibot.com/v1/usage', {
        method: 'GET',
        headers: {
            authorization: '你的令牌(hmp 开头)',
        },
    });
    log(res.body.json());
    

    响应示例:

    {
        "limit": 800,      // 配额数量
        "remaining": 0,    // 剩余次数(若为 0 则会报错)
        "used": 100,       // 已用次数
        "reset": "2026-04-01 00:00:00" // 刷新时间
    }
    

建议前往控制台查看具体订阅计划,根据需求增加配额以避免影响自动化任务运行。

ℹ️ 本回答由 AI 生成,内容仅供参考