图色函数
说明
- 截图函数需要Android 5.0 以上版本才能使用
- 无障碍模式下截图是需要权限的,如果弹出了运行截图,请授权
- 代理模式下的截图不需要权限,建议长期运行使用代理模式
- 图色模块的对象前缀是image,例如 image.requestScreenCapture()这样调用
- 图色模块需要对颜色进行查找,开发工具自带找色功能
设置
image.useOpencvMat 切换图片存储
- 切换图片存储模式为opencv的mat格式
- 这个函数调用会初始化OPENCV,所以打包的时候组件要包含opencv组件(找图组件)
- 适合 EC 10.18.0+
- 切换后抓图、读取图片、找图、找色等都会切换到mat格式,速度更快内存更少
- 如果让图片格式切换请参考 imageToMatFormat和matToImageFormat两个函数
- @param use 1 是 0 否
- @return
{boolean|*}
true 成功 false 失败
function main() {
let r = image.useOpencvMat(1);
logd(r)
//剩下的代码和之前一样 找色 找图等操作
}
main();
image.setInitParam 初始化参数
- 设置图色模块初始化参数,设置找图超时时间
- @param action_timeout 找图找色动作的最大时间,超时后会自动返回避免阻塞,单位是毫秒
- @param auto_click_request_dialog 是否自动点击截屏授权对话框,默认是true,自动点击
function main() {
//action_timeout 找图找色动作的最大时间,超时后会自动返回避免阻塞
// auto_click_request_dialog 是否自动点击截屏授权对话框,默认是true,自动点击
// image.setInitParam({"action_timeout":1000});
image.setInitParam(
{
"action_timeout": 20000,
"auto_click_request_dialog": false
}
);
}
main();
image.setFindColorImageMode 设置找色找图的算法模式
- 设置找色找图的算法模式
- 适合EC 9.10.0+
- @param type 1 代表老的查找算法,2代表新的查找算法
- @return
{boolean}
function main() {
image.setFindColorImageMode(2);
}
main();
申请截图
image.requestScreenCapture 申请截图权限
- 向系统申请屏幕截图权限,返回是否请求成功。
- 第一次使用该函数会弹出截图权限请求,建议选择“总是允许”。
- 这个函数只是申请截图权限,并不会真正执行截图,真正的截图函数是captureScreen()。
- 该函数在截图脚本中只需执行一次 ,而无需每次调用captureScreen()都调用一次。
- @param timeout 超时时间,单位是毫秒
- @param type 截屏的类型,0 自动选择,1 代表授权模式,2 代表无需权限模式(该模式前提条件:运行模式为代理模式)
- @return true 代表成功 false代表失败
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
}
main();
image.releaseScreenCapture 释放截屏请求
- 释放截屏请求
function main() {
image.releaseScreenCapture();
}
main();
截图
image.captureScreen 截取屏幕Image对象
- 截取当前屏幕并返回一个Image对象。
- 没有截图权限时执行该函数会返回null
- 两次调用可能返回相同的Image对象。这是因为设备截图的更新需要一定的时间,短时间内(一般来说是16ms)连续调用则会返回同一张截图。
- 截图需要转换为Bitmap格式,从而该函数执行需要一定的时间(0~20ms)。
- 另外在requestScreenCapture()执 行成功后需要一定时间后才有截图可用,因此如果立即调用captureScreen(),会等待一定时间后( 一般为几百ms)才返回截图。
- 如果区域空或则有负数的,就会是全屏
- @param retryNumber 重试次数,直到能截到图为止,默认是3
- @param x 截图的起始X坐标
- @param y 截图的起始Y坐标
- @param ex 终点X坐标
- @param ey 终点Y坐标
- @return AutoImage对象或者null
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
for (let i = 0; i < 10; i++) {
let cap = image.captureScreen(3, 0, 0, 300, 400)
logd("截图数据: " + cap)
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
main();
image.captureFullScreen 截取全屏Image对象
- 截取当前屏幕并返回一个Image对象。
- @return AutoImage对象或者null
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
for (let i = 0; i < 10; i++) {
let cap = image.captureFullScreen()
logd("截图数据: " + cap)
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
main();
image.captureFullScreenEx 截取全屏屏Image对象扩展
- 抓取全屏函数,代理模式下并且requestScreenCapture函数的type为0的时候,会使用截屏函数,尽力消除色差问题。
- @return AutoImage对象或者null
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
for (let i = 0; i < 10; i++) {
let cap = image.captureFullScreenEx()
logd("截图数据: " + cap)
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
main();
image.captureScreenBitmap 截取屏幕Bitmap对象
- 将屏幕抓取为Bitmap对象,如果中间有-1或者宽度、宽度为-1,将会是全屏
- @param format jpg或者png,代理模式下有用
- @param x 开始X坐标
- @param y 开始Y坐标
- @param ex 终点X坐标
- @param ey 终点Y坐标
- @param q 图片质量,1 - 100,越高越好,代理模 式下有用
- @return Bitmap null或者bitmap对象
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
for (let i = 0; i < 10; i++) {
let cap = image.captureScreenBitmap("jpg", 100, 100, 200, 300, 100);
logd("截图数据: " + cap)
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
main();
image.captureScreenBitmapEx 截取Bitmap对象扩展
- 将屏幕抓取为Bitmap对象,在代理模式下和captureScreenBitmap实现不一样,速度比captureScreenBitmap快
- 适合版本 EC 8.3.+
- @return Bitmap null或者bitmap对象
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
for (let i = 0; i < 10; i++) {
let cap = image.captureScreenBitmapEx();
logd("截图数据: " + cap)
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
main();
image.captureToFile 截取屏幕到文件
- 截取当前屏幕并以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
- 如果区域空或则有负数的,就会是全屏
- @param retryNumber 重试次数,直到能截到图为止,默认是3
- @param x 截图的起始X坐标
- @param y 截图的起始Y坐标
- @param ex 终点X坐标
- @param ey 终点Y坐标
- @param path 截图保存路径
- @return true 截图成功 false 代表不成功
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
let request = image.requestScreenCapture(10000, 0);
if (!request) {
request = image.requestScreenCapture(10000, 0);
}
logd("申请截图结果... " + request)
if (!request) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
home();
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
for (let i = 0; i < 10; i++) {
let cap = image.captureToFile(3, 0, 0, 300, 400, "/sdcard/a" + i + ".png");
logd("是否成功: " + cap)
sleep(1000)
}
}
main();