Auto.js学习笔记12:利用图片的相似度执行精准目标点击(基础篇)

申明本人使用的autojs是4.1.1版本

目录

images

读取本地图片images.read(path)

读取网络图片images.load(url)

复制图片images.copy(img)

保存图片images.save(image, path[, format = "png", quality = 100])

images.fromBase64(base64)

截图请求screenshotRequest

截图函数

images.captureScreen()

images.captureScreen(path)

截图方向

images.requestScreenCapture([landscape])

通过图片相似度进行按钮点击功能

images.findImage(img, template[, options])

区域找图的简便方法 images.findImageInRegion(img, template, x, y[, width, height, threshold])


images

images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。

该模块分为两个部分,找图找色部分和图片处理部分。

需要注意的是,image对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管Auto.js通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。

// 读取图片
var img = images.read("./1.png");
// 对图片进行操作
... 
// 回收图片
img.recycle();

读取本地图片images.read(path)

  • path {string} 图片路径

读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。

Image对象通过调用recycle()函数来回收。例如:

// 读取图片
var img = images.read("./1.png");

读取网络图片images.load(url)

  • url {string} 图片URL地址

加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。

复制图片images.copy(img)

img {Image} 图片
返回 {Image}
复制一张图片并返回新的副本。该函数会完全复制img对象的数据。

保存图片images.save(image, path[, format = "png", quality = 100])

  • image {Image} 图片
  • path {string} 路径
  • format {string} 图片格式,可选的值为:
    • png
    • jpeg/jpg
    • webp
  • quality {number} 图片质量,为0~100的整数值

把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。

//把图片压缩为原来的一半质量并保存
var img = images.read("/sdcard/1.png");
images.save(img, "/sdcard/1.jpg", "jpg", 50);
app.viewFile("/sdcard/1.jpg");

images.fromBase64(base64)

  • base64 {string} 图片的Base64数据
  • 返回 {Image}

解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null

截图请求screenshotRequest

const permissionsScreenshot = screenshotRequest()
if (!requestScreenCapture()) {
    toastLog("请求截图失败");
    exit();
}

截图函数

images.captureScreen()

  截图的 官方文档地址

截取当前屏幕并返回一个Image对象。

没有截图权限时执行该函数会抛出SecurityException。

该函数不会返回null,两次调用可能返回相同的Image对象。这是因为设备截图的更新需要一定的时间,短时间内(一般来说是16ms)连续调用则会返回同一张截图。

截图需要转换为Bitmap格式,从而该函数执行需要一定的时间(0~20ms)。

另外在requestScreenCapture()执行成功后需要一定时间后才有截图可用,因此如果立即调用captureScreen(),会等待一定时间后(一般为几百ms)才返回截图。

//请求横屏截图
requestScreenCapture(true);
//截图
var img = captureScreen();
//获取在点(100, 100)的颜色值
var color = images.pixel(img, 100, 100);
//显示该颜色值
toast(colors.toString(color));

images.captureScreen(path)

  • path {string} 截图保存路径

截取当前屏幕并以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。

该函数不会返回任何值。该函数也可以作为全局函数使用。

注意:captureScreen()返回的图片不需要回收。(因为那个是系统执行的截图)

返回值可以当bollean用,重点,不会返回Image对象。

代码示例

var screenshotIcon = captureScreen("/sdcard/a.png");
    if(screenshotIcon){
        var img = images.read("/sdcard/a.png");
        var smallImg = images.read(smallImgPath); //读取本地的领取图片
        var result = images.findImage(img, smallImg, {
           threshold: threshold
        })
}

截图方向

images.requestScreenCapture([landscape])

landscape {boolean} 布尔值, 表示将要执行的截屏是否为横屏。如果landscape为false, 则表示竖屏截图; true为横屏截图。

如果不指定landscape值,则截图方向由当前设备屏幕方向决定,因此务必注意执行该函数时的屏幕方向。

通过图片相似度进行按钮点击功能

images.findImage(img, template[, options])

  • img {Image} 大图片
  • template {Image} 小图片(模板)
  • options {Object} 找图选项

找图。在大图片img中查找小图片template的位置(模块匹配),找到时返回位置坐标(Point),找不到时返回null。

选项包括:

  • threshold {number} 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
  • region {Array} 找图区域。参见findColor函数关于region的说明。
  • level {number} 一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次, level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。

代码示例

var img = images.read("/sdcard/大图.png");
var templ = images.read("/sdcard/小图.png");
var result = findImage(img, templ);
if(result){
    toast("找到啦:" + result);
     click(result.x, result.y);
}else{
    toast("没找到");
}

区域找图的简便方法 images.findImageInRegion(img, template, x, y[, width, height, threshold])

images.findImage(img, template, {
    region: [x, y, width, height],
    threshold: threshold
})

结语

实际开发中遇到了很多问题,有些是没认真看文档(认真看文档、认真看文档、认真看文档)有些是理解透彻导致,最终都一个一个解决后面会发布实战篇

光看不敲是没用的
看后一定要去实践
一定要去敲代码
一定要去运行试错
这样才是有意义的学习

猜你喜欢

转载自blog.csdn.net/piyangbo/article/details/125254834