图色函数
设置
image.setInitParam 初始化参数
- 设置图色模块初始 化参数
- @param params 参数待定
function main() {
image.setInitParam({});
}
main();
image.useOpencvMat 初始化参数
- 切换图片存储模式为opencv的mat格式
- 适合EC iOS 4.6.0+
- 切换后抓图、读取图片、找图、找色等都会切换到mat格式,速度更快内存更少
- 实测内存减少50%-80%,CPU减少20%-30%,速度提升100%-200%
- 如果让图片格式切换请参考 imageToMatFormat和matToImageFormat两个函数
- @param use 1 是 0 否
- @return
{boolean|*}true 成功 false 失败
function main() {
let r = image.useOpencvMat(1);
logd(r)
//剩下的代码和之前一样 找色 找图等操作
}
main();
代理模式普通截图 jpg
image.captureFullScreenEx 截取全屏Image对象
- 抓取全屏,格式是JPG
- @param ext 扩展参数,可以调整截图的方式和质量,可以分别是
- fetchImageMode: 1 代表截图 jpg格式的方式1 2 代表截图 jpg格式方式2 3代表png格式,png不支持质量参数 ,根据自己机器情况调用
- fetchImageQuality: 图片质量,fetchImageMode =1的时候,支持 1, 50, 100,三种不同的质量标准
- 当 fetchImageMode =2 的时候,支持1-100图片质量
- @return
{null|AutoImage}
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
for (let i = 0; i < 10; i++) {
console.time(1)
let cap = image.captureFullScreenEx({"fetchImageMode": "1", "fetchImageQuality": 50})
logd("截图数据: " + cap + " 耗时: " + console.timeEnd(1))
image.saveTo(cap, "b.jpg");
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
image.captureFullScreen 截取全屏Image对象
- 截取当前屏幕并返回一个Image对象, 这个格式是jpg。
- @return AutoImage对象或者null
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
for (let i = 0; i < 10; i++) {
let cap = image.captureFullScreen()
logd("截图数据: " + cap)
sleep(1000)
//图片要回收
image.recycle(cap)
}
}
main();
image.captureFullScreenUIImage 截屏UIImage对象
- 截屏UIImage对象
- 适配EC 4.2.0+
- @param ext 扩展参数,可以调整截图的方式和质量,可以分别是
- type: 1 代表截图 jpg格式的方式1
- 2 代表截图 jpg格式方式 2
- 3 代表png格式,png不支持质量参数 ,根据自己机器情况调用
- quality: 图片质量,type=1的时候,支持 1, 50, 100,三种不同的质量标准
- 当type =2 的时候,支持1-100图片质量
- @return swift中的UIImage对象 或者null
function main() {
logd("isServiceOk " + isServiceOk());
startEnv()
logd("isServiceOk " + isServiceOk());
setComputeMode(1)
let img1 = image.captureFullScreen();
logd(img1)
// 测试1
let uiimage = image.autoImageToUIImage(img1)
logd("autoImageToUIImage uiimage " + uiimage)
let x = pluginLoader.callMethodAny(name, clzName, "testMethod", uiimage)
logd(x)
image.recycle(img1)
let img2 = image.captureFullScreenUIImage({})
let xX = pluginLoader.callMethodAny(name, clzName, "testMethod", img2)
logd(xX)
let au = image.uiimageToAutoImage(uiimage)
logd("au " + au)
// 保存到文件中
image.saveTo(au, file.getSandBoxFilePath("a.jpg"))
image.recycle(au)
image.recycle(img2)
}
main();
快捷指令截图
提示
- 快捷指令截图需要配合脱机版本的服务才行,具体请看 OTG-HID文档截图配置,快捷指令截图
- 当然也可以不使用OTG HID,单独配置快捷指令截图也行,配置方法都一样
image.getShortcutImage 获取 快捷指令的截图
- 获取快捷指令的截图
- 内部实现循环获取
- 如果手机是横屏的,但是截图显示不是横屏,可以通旋转函数进行旋转成横屏
- 适配EC 脱机版本 6.6.0+
- @param timeout 超时时间 单位是毫秒
- @return
{AutoImage|null}AutoImage对象
function test_shortcut_screen() {
//开头 释放所有ocr资源,防止之前未释放的资源占用
ocrMut.releaseAll();
logd("开始执行脚本...")
let ocrtest = ocrMut.newOcr()
let modelPath = file.getSandBoxFilePath("")
let detName = "det"
let recName = "rec"
// 内部自带的ocr模型
let paddleNcnnOcrMap1 = {"type": "paddleNcnnOcrV5", "numThread": 2, "padding": 32, "maxSideLen": 640}
// 使用外部的模型
let paddleOnnxOcrMap2 = {
"type": "paddleNcnnOcrV5", "numThread": 2, "padding": 32, "maxSideLen": 640,
"modelsDir": modelPath,
"keysName": "keys.txt",
"detName": detName,
"recName": recName
}
let inited = ocrtest.initOcr(paddleNcnnOcrMap1)
if (!inited) {
loge("inited ocr error : " + ocrtest.getErrorMsg())
return
} else {
logd("ocr inited ok")
}
// 可以先停止 也可以 不停止
// image.stopShortcutHttpServer();
// 直接启动,整个程序运行期间启动一次就行,或者从 app设置中启动
let b = image.startShortcutHttpServer(0)
if (!b) {
logw("启动快捷指令接收服务失败 {}", image.shortcutHttpServerLastError())
return;
}
image.useOpencvMat(1)
logd("开始截屏,快捷指令的快捷键需要提前绑定,请参考文档建立快捷指令和绑定快捷键")
for (let i = 0; i < 100; i++) {
sleep(1000)
logd("第 " + (i + 1) + " 截屏")
//测试代码快捷指令绑定的是 gui+A 发送指令 然后获取即可
//logd(otgEvent.keyPressChar("gui", "A"))
let img = image.getShortcutImage(10 * 1000);
if (img) {
logd("快捷指令截图成功 " + img)
logd("图像宽度和高度 {},{}", img.getWidth(), img.getHeight())
let ss = file.getSandBoxFilePath("a.png");
img.saveTo(ss)
logd("图像保存到: " + ss)
} else {
continue
}
console.time(1)
// 这里也可以设置动态的参数
let ocrResult = ocrtest.ocrImage(img, 20000, {"numThread": 2, "padding": 32})
logd("ocrResult " + JSON.stringify(ocrResult));
if (ocrResult) {
logd("ocr结果-》 " + JSON.stringify(ocrResult));
for (var j = 0; j < ocrResult.length; j++) {
var value = ocrResult[j];
logd("文字 : " + value.label + " " + value.x + "," + value.y + "," + (value.x + value.width) + "," + (value.y + value.height));
}
} else {
logw("未识别到结果");
}
logd("耗时: {} ms", console.timeEnd(1))
sleep(100)
image.recycle(img)
sleep(200)
}
//脚本运行完成了释放即可 不需要每次用完都释放
ocrtest.releaseAll()
}
test_shortcut_screen();
image.startShortcutHttpServer 启动快捷指令接收服务
- 启动快捷指令接收服务
- 用来接收快捷指令发送过来的图像数据
- 可以从APP设置中 启动的服务也可以使用脚本调用这个函数启动
- 适配EC 脱机版本 6.6.0+
- @param port 监听端口(1-65535)传递为0的情况就使用默认的端口
- @return
{boolean}true代表启动成功 false代表启动失败
// 代码例子参考 image.getShortcutImage
image.stopShortcutHttpServer 停止快捷指令接收服务
- 停止快捷指令截图接收服务
- 适配EC 脱机版本 6.6.0+
- @return
{boolean}true代表启动成功 false 代表启动失败
// 代码例子参考 image.getShortcutImage
image.shortcutHttpServerBaseUrl 获取接收服务URL
- 获取接收服务URL
- 这个一般用不上
- 适配EC 脱机版本 6.6.0+
- @return
{string}服务地址
// 代码例子参考 image.getShortcutImage
image.shortcutHttpServerLastError 获取截屏服务错误信息
- 获取截屏服务错误信息
- 快捷指令截屏接收服务的最近错误信息
- (例如启动失败原因)
- 适配EC 脱机版本 6.6.0+
- @return
{string}null或者"" 代表没有错误
// 代码例子参考 image.getShortcutImage
录屏截图
提示
- 录屏截图需要配合脱机版本的服务才行,具体请看 OTG-HID文档截图配置,系统录屏截图
- 当然也可以不使用OTG HID,单独配置录屏截图也行,配置方法都一样
- IDEA开发工具中,无 自动化抓图功能,先点抓图设置按钮,设置为**录屏模式(手机录屏)**才能正常使用
image.getSystemScreenCapImage 获取录屏截图
- 获取系统录屏截图
- 如果手机是横屏的,但是截图显示不是横屏,可以通旋转函数进行旋转成横屏
- 适配EC 脱机版本 6.6.0+
- @param timeout 超时时间,毫秒
- @return
{AutoImage|null}null代表截图失败
function check_record_img_ok() {
let picNum = 0;
let ok = false;
for (let i = 0; i < 5; i++) {
let img = image.getSystemScreenCapImage(1000);
if (img) {
picNum++;
logd("收到了录屏数据 {},{}", img.getWidth(), img.getHeight())
img.recycle();
// 收到超过2张图像 判断为成功
if (picNum > 2) {
ok = true;
break
}
}
}
if (ok) {
return true;
}
return false;
}
function check_record_ok() {
// 直接启动,整个程序运行期间启动一次就行,或者从 app设置中启动
let b = image.startSystemScreenCapServer()
if (!b) {
logw("启动录屏接收数据服务失败")
return;
}
// 设置帧率和质量 先设置,才能启动录屏 否则不生效
// 也可以从app设置中启动系统录屏和设置参数
image.setSystemScreenCapFps(10)
image.setSystemScreenCapJpegQuality(80)
if (image.isSystemScreenCapBroadcasting()) {
logd("录屏服务已经启动,开始检查是否可以获取图像")
if (check_record_img_ok()) {
return true
}
if (!image.startSystemScreenCapBroadcast()) {
logw("开启录屏广播失败: " + image.systemScreenCapLastError())
return false;
}
logd("等待用户手动选择确定")
sleep(5000)
return check_record_img_ok();
} else {
if (!image.startSystemScreenCapBroadcast()) {
logw("开启录屏广播失败: " + image.systemScreenCapLastError())
return false;
}
logd("等待用户手动选择确定")
sleep(5000)
return check_record_img_ok();
}
}
function test_system_screenrecord() {
if (!check_record_ok()) {
logw("无法获取录屏数据,请检查或者到APP设置中-系统录屏设置-手动启动")
return;
}
logd("开始获取数据")
for (let i = 0; i < 10; i++) {
sleep(1000)
logd("第 " + (i + 1) + " 截屏")
let img = image.getSystemScreenCapImage(10 * 1000);
if (img) {
logd("录屏数据 " + img)
logd("图像宽度和高度 {},{}", img.getWidth(), img.getHeight())
let ss = file.getSandBoxFilePath("a.png");
img.saveTo(ss)
logd("图像保存到: " + ss)
img.recycle();
}
}
}
test_system_screenrecord();
image.startSystemScreenCapServer 启动录屏接收服务
- 启动录屏接收服务
- 一定先开启这个才能接收图像,也可以从APP设置-系统录屏选项中启动
- 适配EC 脱机版本 6.6.0+
- @return
{boolean}true 代表成功 false 代表失败
// 代码例子参考 image.getSystemScreenCapImage
image.stopSystemScreenCapServer 启动录屏接收服务
- 停止录屏接收服务
- 适配EC 脱机版本 6.6.0+
- @return
{boolean}true 代表成功 false 代表失败
// 代码例子参考 image.getSystemScreenCapImage
image.startSystemScreenCapBroadcast 启动系统录屏
- 启动系统录屏
- 适配EC 脱机版本 6.6.0+
- 这个需APP在前台才行,或者去APP设置-系统录屏设置中启动(启动后系统弹出框,会有ScreenCapture这个选项选择后,点击开始直播)
- (弹出/触发系统 Broadcast Picker,需要用户确认/点一下)
- @return
{boolean}true 代表成功 false 代表失败
// 代码例子参考 image.getSystemScreenCapImage
image.isSystemScreenCapBroadcasting 录屏否正在运行
- 录屏否正在运行
- 适配EC 脱机版本 6.6.0+
- 这个不一定准确,所以在文档演示代码中,也使用了获取图像数据进行判断
- @return
{boolean}true 代表正在启动录屏,false代表不在录屏
// 代码例子参考 image.getSystemScreenCapImage
image.setSystemScreenCapFps 设置系统录屏帧率
- 设置系统录屏帧率
- (fps,每秒张数),例如 10=每秒10张。
- 不要设置太大
- 注意:扩展每次开始广播时会先读取配置
- 适配EC 脱机版本 6.6.0+
- @param fps 帧率 1-60
- @return
{boolean}true 代表成功 false 代表失败
// 代码例子参考 image.getSystemScreenCapImage
image.setSystemScreenCapJpegQuality 设置录屏图片质量
- 设置录屏图片质量
- JPEG 图片质量(1-100)
- 适配EC 脱机版本 6.6.0+
- @param q 质量 1-100 越大越清晰,资源消耗越多
- @return
{boolean}true 代表成功 false 代表失败
// 代码例子参考 image.getSystemScreenCapImage
image.systemScreenCapLastError 获取录屏错误信息
- 获取录屏错误信息
- 适配EC 脱机版本 6.6.0+
- @return
{string}null或者空无错误,其他是错误信息
// 代码例子参考 image.getSystemScreenCapImage
比色
image.cmpColor 多点比色
- 单点或者多点比色,找到所有符合标准的点,如果都符合返回true,否则是false
- @param image1 图片
- @param points 字符串类似这样 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
- @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
- @param x 区域的X起始坐标,默认填写0全屏查找
- @param y 区域的Y起始坐标,默认填写0全屏查找
- @param ex 终点X坐标,默认填写0全屏查找
- @param ey 终点Y坐标,默认填写0全屏查找
- @return 布尔型,true代表找到了 false代表未找到
function main() {
let req = startEnv();
if (!req) {
logd("申请权限失败");
return;
}
let aimage = image.captureFullScreen();
if (aimage != null) {
let points3 = "205|1130|0xff944b-0x101010,211|1158|0xff8e42,191|1175|0xfcfbf7";
let points = image.cmpColor(aimage, points3, 0.9, 0, 0, 0, 0);
logd("points " + points);
//图片要回收
image.recycle(aimage)
}
}
main();