function PointIndex(javaPoint) { this.x = 0; this.y = 0; this.index = -1; if (javaPoint != null) { this.x = javaPoint["x"]; this.y = javaPoint["y"]; this.index = javaPoint["index"]; } } PointIndex.get = function () { return new PointIndex(null); }; PointIndex.jsonToObject = function (res) { if (res == null || res == "") { return null; } res = JSON.parse(res); if (res == null) { return null; } return new Point(res); }; PointIndex.prototype.setX = function (x) { this.x = x; return this; }; PointIndex.prototype.setY = function (y) { this.y = y; return this; }; PointIndex.prototype.setIndex = function (index) { this.index = index; return this; }; PointIndex.prototype.toJSONString = function () { return JSON.stringify(this); }; function ImageWrapper() { } var image = new ImageWrapper(); /** * 设置图色模块初始化参数,可用于多分辨率兼容 * @param param * auto_click_request_dialog: true 自动点击截图权限对话框 * auto_detect_orientation: true 自动检测方向 false 不检测方向 */ ImageWrapper.prototype.setInitParam = function (param) { if (imageWrapper == null) { return; } imageWrapper.setInitParam(JSON.stringify(param)); }; /** * 切换图片存储模式为opencv的mat格式 * 这个函数调用会初始化OPENCV,所以打包的时候组件要包含opencv组件(找图组件) * 适合 EC 10.18.0+ * 切换后抓图、读取图片、找图、找色等都会切换到mat格式,速度更快内存更少 * 如果让图片格式切换请参考 imageToMatFormat和matToImageFormat两个函数 * @param use 1 是 0 否 * @return {boolean} true 成功 false 失败 */ ImageWrapper.prototype.useOpencvMat = function (use) { if (imageWrapper == null) { return false; } return imageWrapper.useOpencvMat(use); }; /** * 截屏时候如果转换mat失败,可以是这个函数试试,一般用不上 * 这个函数调用会初始化OPENCV,所以打包的时候组件要包含opencv组件 * 先转为bitmap再转为mat * 适合 EC 10.18.0+ * @param use 1 是 0 否 * @return {boolean} true 成功 false 失败 */ ImageWrapper.prototype.setConvertMatWithBitmap = function (use) { if (imageWrapper == null) { return false; } return imageWrapper.setConvertMatWithBitmap(use); }; /** * 设置找色找图的算法模式 * 适合EC 9.10.0+ * @param type 1 代表老的查找算法,2代表新的查找算法 * @return {boolean} */ ImageWrapper.prototype.setFindColorImageMode = function (type) { if (imageWrapper == null) { return false; } return imageWrapper.setFindColorImageMode(type); }; /** * 转换Mat存储格式 * 适合 EC 10.18.0+ * @param img {AutoImage} 图片对象 * @return {null|AutoImage} MAT存储格式的AutoImage 对象或者null */ ImageWrapper.prototype.imageToMatFormat = function (img) { if (img == null) { return null; } let xd = imageWrapper.imageToMatFormat(img.uuid); if (xd != null && xd != undefined && xd != "") { return new AutoImage(javaString2string(xd)); } return null; }; /** * 转换普通image存储格式 * 适合 EC 10.18.0+ * @param img {AutoImage} 图片对象 * @return {null|AutoImage} 普通存储格式的AutoImage 对象或者null */ ImageWrapper.prototype.matToImageFormat = function (img) { if (img == null) { return null; } let xd = imageWrapper.matToImageFormat(img.uuid); if (xd != null && xd != undefined && xd != "") { return new AutoImage(javaString2string(xd)); } return null; }; /** * 初始化OPENCV 类库 * 如果使用找图请先调用这个函数,第一次初始化需要复制类库,时间可能较长,以后再次执行就很快 * @return {boolean} true 代表成功 false代表失败 */ ImageWrapper.prototype.initOpenCV = function () { if (imageWrapper == null) { return false; } return imageWrapper.initOpenCV(); }; /** * 向系统申请屏幕截图权限,返回是否请求成功。 *
* 第一次使用该函数会弹出截图权限请求,建议选择“总是允许”。 *
** 这个函数只是申请截图权限,并不会真正执行截图,真正的截图函数是captureScreen()。 *
* 该函数在截图脚本中只需执行一次,而无需每次调用captureScreen()都调用一次。 ** 建议在本软件界面运行该函数,在其他软件界面运行时容易出现一闪而过的黑屏现象。 *
** 该值的格式为0xAARRGGBB,是一个"32位整数" *
* 坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
*
* @param image1 图片
* @param x 要获取的像素的横坐标。
* @param y 要获取的像素的纵坐标。
* @return {number}
*/
ImageWrapper.prototype.pixelInImage = function (image1, x, y) {
if (imageWrapper == null || image1 == null) {
return null;
}
return imageWrapper.pixelInImage(image1.uuid, x, y);
};
/**
* 找图。在大图片image中查找小图片template的位置(模块匹配),找到时返回位置坐标区域(Rect),找不到时返回null。
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param image1 大图片
* @param template 小图片(模板)
* @param x 找图区域 x 起始坐标
* @param y 找图区域 y 起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
* @return {null|Rect[]} 区域坐标对象数组或者null
*/
ImageWrapper.prototype.findImage = function (image1, template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
if (imageWrapper == null || image1 == null || template == null) {
return null;
}
var res = imageWrapper.findImage(image1.uuid, template.uuid, x, y, ex - x, ey - y, weakThreshold, threshold, limit, method);
return this.toRectList(res);
};
/**
* 找图。在大图片image中查找小图片template的位置(模块匹配),找到时返回位置坐标区域(Rect),找不到时返回null。
* 找图函数缩放找图,比findImage更精准
* 适合版本 EC 9.41.0+
* @param image1 大图片
* @param template 小图片(模板)
* @param x 找图区域 x 起始坐标
* @param y 找图区域 y 起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
* @return {null|Rect[]} 区域坐标对象数组或者null
*/
ImageWrapper.prototype.findImage2 = function (image1, template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
if (imageWrapper == null || image1 == null || template == null) {
return null;
}
var res = imageWrapper.findImage2(image1.uuid, template.uuid, x, y, ex - x, ey - y, weakThreshold, threshold, limit, method);
return this.toRectList(res);
};
/**
* 找图。在当前屏幕中查找小图片template的位置(模块匹配),找到时返回位置坐标区域(Rect),找不到时返回null。
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
* @param template 小图片(模板)
* @param x 找图区域 x 起始坐标
* @param y 找图区域 y 起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
* @return {null|Rect[]} 区域坐标对象数组或者null
*/
ImageWrapper.prototype.findImageEx = function (template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
if (imageWrapper == null || template == null) {
return null;
}
var res = imageWrapper.findImageCurrentScreen(template.uuid, x, y, ex - x, ey - y, weakThreshold, threshold, limit, method);
return this.toRectList(res);
};
/**
* OpenCV模板匹配封装
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param image1 大图片
* @param template 小图片(模板)
* @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param rect 找图区域。参见findColor函数关于 rect 的说明
* @param maxLevel 默认为-1,一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
* level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
* @return {null|Match[]} 匹配到的集合
*/
ImageWrapper.prototype.matchTemplate = function (image1, template, weakThreshold, threshold, rect, maxLevel, limit, method) {
if (imageWrapper == null || image1 == null || template == null) {
return null;
}
var drect = rect == null ? null : rect.toJSONString();
var res = imageWrapper.matchTemplate(image1.uuid, template.uuid, weakThreshold, threshold, drect, maxLevel, limit, method);
if (res == null || res == "") {
return null;
}
try {
var d = JSON.parse(res);
var x = [];
for (var i = 0; i < d.length; i++) {
x.push(new Match(d[i]));
}
return x;
} catch (e) {
}
return null;
};
/**
* OpenCV模板匹配封装
* 包含缩放找图功能
* 适配版本 EC 9.41.0+
* @param image1 大图片
* @param template 小图片(模板)
* @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param rect 找图区域。参见findColor函数关于 rect 的说明
* @param maxLevel 默认为-1,一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
* level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
* @return {null|Match[]} 匹配到的集合
*/
ImageWrapper.prototype.matchTemplate2 = function (image1, template, weakThreshold, threshold, rect, maxLevel, limit, method) {
if (imageWrapper == null || image1 == null || template == null) {
return null;
}
var drect = rect == null ? null : rect.toJSONString();
var res = imageWrapper.matchTemplate2(image1.uuid, template.uuid, weakThreshold, threshold, drect, maxLevel, limit, method);
if (res == null || res == "") {
return null;
}
try {
var d = JSON.parse(res);
var x = [];
for (var i = 0; i < d.length; i++) {
x.push(new Match(d[i]));
}
return x;
} catch (e) {
}
return null;
};
/**
* OpenCV模板匹配封装,在当前屏幕截图中进行匹配
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param template 小图片(模板)
* @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param rect 找图区域。参见findColor函数关于 rect 的说明
* @param maxLevel 默认为-1,一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
* level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
* @return {null|Match[]} 匹配到的集合
*/
ImageWrapper.prototype.matchTemplateEx = function (template, weakThreshold, threshold, rect, maxLevel, limit, method) {
if (imageWrapper == null || template == null) {
return null;
}
var drect = rect == null ? null : rect.toJSONString();
var res = imageWrapper.matchTemplateCurrentScreen(template.uuid, weakThreshold, threshold, drect, maxLevel, limit, method);
if (res == null || res == "") {
return null;
}
var d = JSON.parse(res);
var x = [];
for (var i = 0; i < d.length; i++) {
x.push(new Match(d[i]));
}
return x;
};
/**
* 找非色
* 在图片中找到颜色和color完全不相等的点,如果没有找到,则返回null。
* 适配EC 9.22.0+
* 兼容版本: Android 5.0 以上
* @param image1 图片
* @param color 要寻找的颜色,用ec工具可以生成
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标
* @param y 区域的Y起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param limit 限制个数
* @param orz 方向,分别从1-8
* @return {null|PointIndex[]}多个 PointIndex 坐标点数组或者null
*/
ImageWrapper.prototype.findNotColor = function (image1, color, threshold, x, y, ex, ey, limit, orz) {
if (imageWrapper == null || image1 == null) {
return null;
}
color = this.convertFirstColorArrayToString2(color);
// allNotEquals 这个是用于处理全部判断相等 展示保留,全部设置为true
let res = imageWrapper.findNotColor(image1.uuid, color, threshold, x, y, ex - x, ey - y, limit, orz, true);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (let i = 0; i < d.length; i++) {
x1.push(new PointIndex(d[i]));
}
return x1;
} catch (e) {
}
return null;
};
/**
* 在图片中找到颜色和color完全相等的点,;如果没有找到,则返回null。
* 运行环境: 无限制
* 兼容版本: Android 5.0 以上
* @param image1 图片
* @param color 要寻找的颜色
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标
* @param y 区域的Y起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param limit 限制个数
* @param orz 方向,分别从1-8
* @return {null|PointIndex[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findColor = function (image1, color, threshold, x, y, ex, ey, limit, orz) {
if (imageWrapper == null || image1 == null) {
return null;
}
color = this.convertFirstColorArrayToString2(color);
let res = imageWrapper.findColor(image1.uuid, color, threshold, x, y, ex - x, ey - y, limit, orz);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (let i = 0; i < d.length; i++) {
x1.push(new PointIndex(d[i]));
}
return x1;
} catch (e) {
}
return null;
};
/**
* 在图片中找到颜色和color完全相等的点,参数从JSON中获取如果没有找到,则返回null。
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param image 图片
* @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
* @return {null|PointIndex[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findColorJ = function (image1, jsonFileName) {
if (imageWrapper == null || image1 == null) {
return null;
}
var data = readResString(jsonFileName + ".json");
if (data == null || data == "") {
return null;
}
data = JSON.parse(data);
var firstColor = data['firstColor'];
var threshold = data['threshold'];
var x = data['x'];
var y = data['y'];
var ex = data['ex'];
var ey = data['ey'];
var limit = data['limit'];
var orz = data['orz']
return this.findColor(image1.uuid, firstColor, threshold, x, y, ex - x, ey - y, limit, orz);
};
/**
* 在当前屏幕中找到颜色和color完全相等的点,如果没有找到,则返回null。
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param color 要寻找的颜色
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标
* @param y 区域的Y起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param limit 限制个数
* @param orz 方向,分别从1-8
* @return {null|PointIndex[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findColorEx = function (color, threshold, x, y, ex, ey, limit, orz) {
if (imageWrapper == null) {
return null;
}
color = this.convertFirstColorArrayToString2(color);
let res = imageWrapper.findColorCurrentScreen(color, threshold, x, y, ex - x, ey - y, limit, orz);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (var i = 0; i < d.length; i++) {
x1.push(new PointIndex(d[i]));
}
return x1;
} catch (e) {
return null;
}
};
/**
* 在当前屏幕中找到颜色和color完全相等的点,参数从JSON中获取如果没有找到,则返回null。
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
* @return {null|PointIndex[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findColorExJ = function (jsonFileName) {
if (imageWrapper == null) {
return null;
}
var data = readResString(jsonFileName + ".json");
if (data == null || data == "") {
return null;
}
data = JSON.parse(data);
var firstColor = data['firstColor'];
var threshold = data['threshold'];
var x = data['x'];
var y = data['y'];
var ex = data['ex'];
var ey = data['ey'];
var limit = data['limit'];
var orz = data['orz']
return this.findColorCurrentScreen(firstColor, threshold, x, y, ex - x, ey - y, limit, orz);
};
/**
* 多点找色,找到所有符合标准的点,类似于按键精灵的多点找色
*
* 整张图片都找不到时返回null
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param image1 要找色的图片
* @param firstColor 第一个点的颜色
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param points 字符串类似这样 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
* @param x 区域的X起始坐标
* @param y 区域的Y起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param limit 限制个数
* @param orz 方向,分别从1-8
* @return {null|Point[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findMultiColor = function (image1, firstColor, points, threshold, x, y, ex, ey, limit, orz) {
if (imageWrapper == null || image1 == null) {
return null;
}
firstColor = this.convertFirstColorArrayToString(firstColor);
points = this.convertMultiColorArrayToString(points);
let res = imageWrapper.findMultiColor(image1.uuid, firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (let i = 0; i < d.length; i++) {
x1.push(new Point(d[i]));
}
return x1;
} catch (e) {
}
return null;
};
/**
* 多点找色,找到所有符合标准的点,参数从JSON文件中读取,类似于按键精灵的多点找色
*
* 整张图片都找不到时返回null
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param image1 要找色的图片
* @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
* @return {null|Point[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findMultiColorJ = function (image1, jsonFileName) {
//String image, String firstColor, String points, float threshold, int x, int y, int w, int h,int limit
if (imageWrapper == null || image1 == null) {
return null;
}
var data = readResString(jsonFileName + ".json");
if (data == null || data == "") {
return null;
}
data = JSON.parse(data);
var firstColor = data['firstColor'];
var threshold = data['threshold'];
var points = data['points'];
var x = data['x'];
var y = data['y'];
var ex = data['ex'];
var ey = data['ey'];
var limit = data['limit'];
var orz = data['orz'];
return imageWrapper.findMultiColor(image1.uuid, firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
};
/**
* 多点找色,找到所有符合标准的点,自动抓取当前屏幕的图片,类似于按键精灵的多点找色
*
* 整张图片都找不到时返回null
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param firstColor 第一个点的颜色
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param points 字符串类似这样 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
* @param x 区域的X起始坐标
* @param y 区域的Y起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param limit 限制个数
* @param orz 方向,分别从1-8
* @return {null|Point[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findMultiColorEx = function (firstColor, points, threshold, x, y, ex, ey, limit, orz) {
//String firstColor, String points, float threshold, int x, int y, int w, int h
if (imageWrapper == null) {
return null;
}
firstColor = this.convertFirstColorArrayToString(firstColor);
points = this.convertMultiColorArrayToString(points);
let res = imageWrapper.findMultiColorCurrentScreen(firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (let i = 0; i < d.length; i++) {
x1.push(new Point(d[i]));
}
return x1;
} catch (e) {
}
return null;
};
/**
* 多点找色,找到所有符合标准的点,自动抓取当前屏幕的图片,参数从JSON文件中读取,类似于按键精灵的多点找色
* 整张图片都找不到时返回null
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
* @return {null|Point[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findMultiColorExJ = function (jsonFileName) {
if (imageWrapper == null) {
return null;
}
var data = readResString(jsonFileName + ".json");
if (data == null || data == "") {
return null;
}
data = JSON.parse(data);
var firstColor = data['firstColor'];
var threshold = data['threshold'];
var points = data['points'];
var x = data['x'];
var y = data['y'];
var ex = data['ex'];
var ey = data['ey'];
var limit = data['limit'];
var orz = data['orz'];
return imageWrapper.findMultiColorCurrentScreen(firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
};
/**
* 单点或者多点比色,找到所有符合标准的点,如果都符合返回true,否则是false
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param image1 图片
* @param points 字符串类似这样 6|1|0x969696-0x000010,2|3|0x969696-0x000010
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标,默认填写0全屏查找
* @param y 区域的Y起始坐标,默认填写0全屏查找
* @param ex 终点X坐标,默认填写0全屏查找
* @param ey 终点Y坐标,默认填写0全屏查找
* @return {boolean} true代表找到了 false代表未找到
*/
ImageWrapper.prototype.cmpColor = function (image1, points, threshold, x, y, ex, ey) {
if (imageWrapper == null || image1 == null) {
return false;
}
points = this.convertMultiColorArrayToString(points);
let index = imageWrapper.cmpColor(image1.uuid, points, threshold, x, y, ex - x, ey - y);
if (index === -1) {
return false;
}
return true;
};
/**
* 单点或者多点比色,找到所有符合标准的点,默认自己截图,如果都符合返回true,否则是false
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
*
* @param points 字符串类似这样 6|1|0x969696-0x000010,2|3|0x969696-0x000010
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标,默认填写0全屏查找
* @param y 区域的Y起始坐标,默认填写0全屏查找
* @param ex 终点X坐标,默认填写0全屏查找
* @param ey 终点Y坐标,默认填写0全屏查找
* @return {boolean} true代表找到了 false代表未找到
*/
ImageWrapper.prototype.cmpColorEx = function (points, threshold, x, y, ex, ey) {
if (imageWrapper == null) {
return false;
}
points = this.convertMultiColorArrayToString(points);
let index = imageWrapper.cmpColorCurrentScreen(points, threshold, x, y, ex - x, ey - y);
if (index === -1) {
return false;
}
return true;
};
/**
* 多点或者多点数组比色,找到所有符合标准的点,依次查找,如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
* @param image1 图片
* @param points 数组类似这样 ["6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"]
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标,默认填写0全屏查找
* @param y 区域的Y起始坐标,默认填写0全屏查找
* @param ex 终点X坐标,默认填写0全屏查找
* @param ey 终点Y坐标,默认填写0全屏查找
* @return {number} 如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
*/
ImageWrapper.prototype.cmpMultiColor = function (image1, points, threshold, x, y, ex, ey) {
if (imageWrapper == null || image1 == null) {
return -1;
}
if (points != null) {
// "6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"
// 类似这样的字符串 直接 转成数组的 JSON
if ((typeof points) == "string") {
return imageWrapper.cmpMultiColor(image1.uuid, JSON.stringify([points]), threshold, x, y, ex - x, ey - y);
}
//走老的逻辑
if ((typeof points[0]) == "string") {
if (/#|0x/.test(points[0])) {
return imageWrapper.cmpMultiColor(image1.uuid, JSON.stringify(points), threshold, x, y, ex - x, ey - y);
}
}
let newPoint = [];
for (let i = 0; i < points.length; i++) {
newPoint[i] = this.convertMultiCmpColorArrayToString(points[i]);
}
return imageWrapper.cmpMultiColor(image1.uuid, JSON.stringify(newPoint), threshold, x, y, ex - x, ey - y);
}
return -1;
};
/**
* 多点或者多点数组比色,找到所有符合标准的点,自动截屏,依次查找,如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
* @param points 数组类似这样 ["6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"]
* @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
* @param x 区域的X起始坐标,默认填写0全屏查找
* @param y 区域的Y起始坐标,默认填写0全屏查找
* @param ex 终点X坐标,默认填写0全屏查找
* @param ey 终点Y坐标,默认填写0全屏查找
* @return {number} 如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
*/
ImageWrapper.prototype.cmpMultiColorEx = function (points, threshold, x, y, ex, ey) {
if (imageWrapper == null) {
return -1;
}
if (points != null) {
// "6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"
// 类似这样的字符串 直接 转成数组的 JSON
if ((typeof points) == "string") {
return imageWrapper.cmpMultiColorCurrentScreen(JSON.stringify([points]), threshold, x, y, ex - x, ey - y);
}
//走老的逻辑
if ((typeof points[0]) == "string") {
if (/#|0x/.test(points[0])) {
return imageWrapper.cmpMultiColorCurrentScreen(JSON.stringify(points), threshold, x, y, ex - x, ey - y);
}
}
let newPoint = [];
for (let i = 0; i < points.length; i++) {
newPoint[i] = this.convertMultiCmpColorArrayToString(points[i]);
}
return imageWrapper.cmpMultiColorCurrentScreen(JSON.stringify(newPoint), threshold, x, y, ex - x, ey - y);
}
return -1;
};
/**
* 取得宽度
* @param img 图片对象
* @return {number}
*/
ImageWrapper.prototype.getWidth = function (img) {
if (img == null) {
return 0;
}
return imageWrapper.getWidth(img.uuid);
};
/**
* 取得高度
* @param img 图片对象
* @return {number}
*/
ImageWrapper.prototype.getHeight = function (img) {
if (img == null) {
return 0;
}
return imageWrapper.getHeight(img.uuid);
};
/**
* 保存到文件中
* @param img 图片对象
* @param path 路径
* @return {boolean} true代表成功,false 代表失败
*/
ImageWrapper.prototype.saveTo = function (img, path) {
if (img == null) {
return false;
}
return imageWrapper.saveTo(img.uuid + "", path);
};
/**
* 转成base64的字符串
* @param img 图片对象
* @return {string}
*/
ImageWrapper.prototype.toBase64 = function (img) {
if (img == null) {
return null;
}
return javaString2string(imageWrapper.toBase64(img.uuid, "jpg", 100));
};
/**
* 转成base64的字符串, jpg格式较小,可以减少内存
* @param img 图片对象
* @param format 格式 jpg或者 png
* @param q 质量 1-100,质量越大 越清晰
* @return {string}
*/
ImageWrapper.prototype.toBase64Format = function (img, format, q) {
if (img == null) {
return null;
}
return javaString2string(imageWrapper.toBase64(img.uuid, format, q));
};
/**
* 剪切图片
* @param img 图片对象
* @param x x起始坐标
* @param y y起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @return {null|AutoImage} 对象或者null
*/
ImageWrapper.prototype.clip = function (img, x, y, ex, ey) {
if (img == null) {
return null;
}
var xd = imageWrapper.clip(img.uuid, x, y, ex - x, ey - y);
if (xd != null && xd != undefined && xd != "") {
return new AutoImage(javaString2string(xd));
}
return null;
};
/**
* 缩放图片
* 适合EC 9.42.0+
* @param img 图片对象
* @param w 目标宽度
* @param h 目标高度
* @return {null|AutoImage} 对象或者null
*/
ImageWrapper.prototype.scaleImage = function (img, w, h) {
if (img == null) {
return null;
}
var xd = imageWrapper.scaleImage(img.uuid, w, h);
if (xd != null && xd != undefined && xd != "") {
return new AutoImage(javaString2string(xd));
}
return null;
};
/**
* 取得图片的某个点的颜色值
* @param img 图片对象
* @param x x坐标点
* @param y y坐标点
* @return {number} 颜色值
*/
ImageWrapper.prototype.pixel = function (img, x, y) {
if (img == null) {
return 0;
}
return imageWrapper.pixel(img.uuid, x, y);
};
/**
* 将整型的颜色值转成16进制RGB字符串
* @param color 整型值
* @return {null|string} 颜色字符串
*/
ImageWrapper.prototype.argb = function (color) {
if (color == null) {
return null;
}
return imageWrapper.argb(color);
};
/**
* 取得Bitmap图片的某个点的颜色值
* @param bitmap 图片对象
* @param x x坐标点
* @param y y坐标点
* @return {number} 颜色值
*/
ImageWrapper.prototype.getPixelBitmap = function (bitmap, x, y) {
if (imageWrapper == null) {
return 0;
}
return imageWrapper.getPixelBitmap(bitmap, x, y);
};
/**
* 取得Bitmap图片的某个区域点的颜色值,等同于 Bitmap.getPixels
* @param bitmap 图片对象
* @param arraySize 要返回的区域数组的大小
* @param offset 写入到pixels[]中的第一个像素索引值
* @param stride pixels[]中的行间距个数值(必须大于等于位图宽度)。可以为负数
* @param x 从位图中读取的第一个像素的x坐标值。
* @param y 从位图中读取的第一个像素的y坐标值
* @param width 从每一行中读取的像素宽度
* @param height 读取的行数
* @return {number} 颜色值数组
*/
ImageWrapper.prototype.getPixelsBitmap = function (bitmap, arraySize, offset, stride, x, y, width, height) {
if (imageWrapper == null) {
return null;
}
return imageWrapper.getPixelsBitmap(bitmap, arraySize, offset, stride, x, y, width, height);
};
/**
* 是否被回收了
* @param img 图片对象
* @return {boolean} true代表已经被回收了
*/
ImageWrapper.prototype.isRecycled = function (img) {
if (img == null) {
return false;
}
try {
let d = img.getClass();
if (d == "class android.graphics.Bitmap") {
return img.isRecycled();
}
} catch (e) {
}
if (img.uuid == null) {
return false;
}
return imageWrapper.isRecycled(img.uuid);
};
/**
* 回收图片
* @param img 图片对象
* @return {boolean}
*/
ImageWrapper.prototype.recycle = function (img) {
if (img == null) {
return false;
}
try {
let d = img.getClass();
if (d == "class android.graphics.Bitmap") {
img.recycle();
return true;
}
} catch (e) {
}
if (img.uuid == null) {
return false;
}
return imageWrapper.recycle(img.uuid);
};
/**
* 回收所有图片
* @return {boolean}
*/
ImageWrapper.prototype.recycleAllImage = function () {
return imageWrapper.recycleAllImage();
}
/**
*
* @param res
* @return {null|Rect[]}
*/
ImageWrapper.prototype.toRectList = function (res) {
if (res == null || res == "") {
return null;
}
var ps = JSON.parse(res);
if (ps == null) {
return null;
}
var d = [];
for (var i = 0; i < ps.length; i++) {
d.push(new Rect(ps[i]));
}
return d;
};
/**
* 对AutoImage图片进行二值化
* @param img AutoImage图片对象
* @param type 二值化类型,一般写1即可
* 0 灰度值大于阈值为最大值,其他值为
* 1 灰度值大于阈值为0,其他值为最大值
* 2 灰度值大于阈值的为阈值,其他值不变
* 3 灰度值大于阈值的不变,其他值为0
* 4 灰度值大于阈值的为零,其他值不变
* 7 暂不支持
* 8 大津法自动寻求全局阈值
* 16 三角形法自动寻求全局阈值
* @param threshold 二值化系数,0 ~ 255
* @return {null|AutoImage} 对象或者null
*/
ImageWrapper.prototype.binaryzation = function (img, type, threshold) {
if (img == null) {
return null;
}
var xd = imageWrapper.binaryzation(img.uuid, type, threshold);
if (xd != null && xd != undefined && xd != "") {
return new AutoImage(javaString2string(xd));
}
return null;
};
/**
* 自适应二值化,使用了opencv的adaptiveThreshold函数实现
* 适合版本 EC 8.3.0+
* @param img AutoImage图片对象
* @param map MAP 参数
* diameter : 去噪直径 参考opencv的bilateralFilter函数
* adaptiveMethod:自适应二值化方式分别是0和1 ,ADAPTIVE_THRESH_MEAN_C=0,ADAPTIVE_THRESH_GAUSSIAN_C = 1
* blockSize:计算单位是像素的邻域块,邻域块取多大,就由这个值作决定,3,5,7这样的奇数
* c: 偏移值调整量,
* {
* "diameter":20,
* "adaptiveMethod":1,
* "c":9,"blockSize":51}
* @return {null|AutoImage}
*/
ImageWrapper.prototype.binaryzationEx = function (img, map) {
if (img == null) {
return null;
}
var xd = imageWrapper.binaryzationEx(img.uuid, JSON.stringify(map));
if (xd != null && xd != undefined && xd != "") {
return new AutoImage(javaString2string(xd));
}
return null;
};
/**
* 自适应二值化,使用了opencv的adaptiveThreshold函数实现
* 适合版本 EC 8.3.0+
* @param bitmap Bitmap 图片对象
* @param map MAP 参数
* diameter : 去噪直径 参考opencv的bilateralFilter函数
* adaptiveMethod:自适应二值化方式分别是0和1 ,ADAPTIVE_THRESH_MEAN_C=0,ADAPTIVE_THRESH_GAUSSIAN_C = 1
* blockSize:计算单位是像素的邻域块,邻域块取多大,就由这个值作决定,3,5,7这样的奇数
* c: 偏移值调整量,
* {"diameter":20,
* "adaptiveMethod":1,
* "c":9,"blockSize":51}
* @return {null|Bitmap} 对象或者null
**/
ImageWrapper.prototype.binaryzationBitmapEx = function (bitmap, map) {
if (bitmap == null) {
return null;
}
return imageWrapper.binaryzationBitmapEx(bitmap, JSON.stringify(map));
};
/**
* 对安卓的 Bitmap 图片进行二值化
* @param bitmap Bitmap 图片对象
* @param type 二值化类型,一般写1即可
* 0 灰度值大于阈值为最大值,其他值为
* 1 灰度值大于阈值为0,其他值为最大值
* 2 灰度值大于阈值的为阈值,其他值不变
* 3 灰度值大于阈值的不变,其他值为0
* 4 灰度值大于阈值的为零,其他值不变
* 7 暂不支持
* 8 大津法自动寻求全局阈值
* 16 三角形法自动寻求全局阈值
* @param threshold 二值化系数,0 ~ 255
* @return {null|Bitmap} 对象或者null
*/
ImageWrapper.prototype.binaryzationBitmap = function (bitmap, type, threshold) {
if (bitmap == null) {
return null;
}
return imageWrapper.binaryzationBitmap(bitmap, type, threshold);
};
/**
* 剪裁图片,请自行判断参数,正确性
* @param bitmap 图片
* @param x 开始X坐标
* @param y 开始Y坐标
* @param w 剪裁宽度
* @param h 剪裁高度
* @return {null|Bitmap} 安卓的Bitmap对象
*/
ImageWrapper.prototype.clipBitmap = function (bitmap, x, y, w, h) {
if (bitmap == null) {
return null;
}
return imageWrapper.clipBitmap(bitmap, x, y, w, h);
};
/**
* 缩放bitmap
* 适合EC 9.42.0+
* @param bitmap 图片
* @param w 目标宽度
* @param h 目标高度
* @return {null|Bitmap} 安卓的Bitmap对象
*/
ImageWrapper.prototype.scaleBitmap = function (bitmap, w, h) {
if (bitmap == null) {
return null;
}
return imageWrapper.scaleBitmap(bitmap, w, h);
};
/**
* base64字符串转为Bitmap图片
* @param data base64 数据
* @param flag base64格式的标示,一般为0,
* 可选参数为 :0 默认, 1 无填充模式,2 无换行模式,4 换行模式
* @return {null|Bitmap} 安卓的Bitmap对象
*/
ImageWrapper.prototype.base64Bitmap = function (data, flag) {
if (data == null) {
return null;
}
return imageWrapper.base64Bitmap(data, flag);
};
/**
* 将AutoImage转换为安卓原生的Bitmap对象
* @param img {AutoImage}
* @return {null|Bitmap} 对象
*/
ImageWrapper.prototype.imageToBitmap = function (img) {
if (img == null) {
return null;
}
return imageWrapper.imageToBitmap(img.uuid);
};
/**
* 将安卓原生的Bitmap对象转换为AutoImage
* 适合EC 6.15.0+版本
* @param img {Bitmap}对象
* @return {null|AutoImage} 对象
*/
ImageWrapper.prototype.bitmapToImage = function (bitmap) {
var xd = imageWrapper.bitmapToImage(bitmap);
if (xd != null && xd != undefined && xd != "") {
return new AutoImage(javaString2string(xd));
}
return null;
};
/**
* bitmap转为base64
* @param bitmap 图片
* @param format 格式,jpg或者png
* @param q 质量 1 - 100
* @return {string} base64字符串
*/
ImageWrapper.prototype.bitmapBase64 = function (bitmap, format, q) {
if (bitmap == null) {
return null;
}
var d = imageWrapper.bitmapBase64(bitmap, format, q);
return javaString2string(d);
};
/**
* 保存bitmap图像
* @param bitmap 图片
* @param format 要保存图像格式,有 png,jpg,webp
* @param q 要保存图像质量,1-100
* @param path 要保存图像路径
* @return {boolean} true 成功 false 失败
*/
ImageWrapper.prototype.saveBitmap = function (bitmap, format, q, path) {
if (bitmap == null) {
return false;
}
return imageWrapper.saveBitmap(bitmap, format, q, path);
};
/**
* 旋转Bitmap
* 支持EC 10.11.0+
* @param bitmap 安卓的bitmap对象
* @param degree 度数,-90代表逆时针旋转90度,home键在右,90度代表顺时针旋转90度,home键在左
* @return {null|Bitmap} 对象或者null
*/
ImageWrapper.prototype.rotateBitmap = function (bitmap, degree) {
if (bitmap == null) {
return false;
}
return imageWrapper.rotateBitmap(bitmap, degree);
};
/**
* 旋转图片
* 支持EC 10.11.0+
* @param img 图片对象
* @param degree 度数,-90代表逆时针旋转90度,home键在右,90度代表顺时针旋转90度,home键在左
* @return {null|AutoImage} 对象或者null
*/
ImageWrapper.prototype.rotateImage = function (img, degree) {
if (img == null) {
return null;
}
let uuid = imageWrapper.rotateImage(img.uuid, degree);
if (uuid != null && uuid != undefined && uuid != "") {
return new AutoImage(uuid);
}
return null;
};
/**
*
* @param res
* @return {null|AutoImage}
*/
ImageWrapper.prototype.readResAutoImage = function (res) {
if (res == null) {
return null;
}
let uuid = imageWrapper.readResAutoImage(res);
if (uuid != null && uuid != undefined && uuid != "") {
return new AutoImage(uuid);
}
return null;
};
/**
* 使用系统的screencap命令截图AutoImage,适合root或者代理模式, 有root权限或者开启了代理服务
* 适合版本 EC 6.8.0+
* @param root 是否优先使用root方式截图
* @return {null|AutoImage} 对象或者null
*/
ImageWrapper.prototype.screencapImage = function (root) {
let xd = imageWrapper.screencapImage(root);
if (xd != null && xd != undefined && xd != "") {
return new AutoImage(javaString2string(xd));
}
return null;
};
/**
* 使用系统的screencap命令截图为bitmap,适合root或者代理模式, 有root权限或者开启了代理服务
* 适合版本 EC 6.8.0+
* @param root 是否优先使用root方式截图
* @return {Bitmap} 对象
*/
ImageWrapper.prototype.screencapBitmap = function (root) {
return imageWrapper.screencapBitmap(root);
};
function OCRWrapper() {
}
function OcrInst(s) {
this.ocrUtil = s;
}
var ocr = new OCRWrapper();
OCRWrapper.prototype.newOcr = function () {
let u = ocrWrapper.newOcr();
if (u == null) {
return null;
}
let ins = new OcrInst(u);
return ins;
}
/**
* 初始化OCR模块
* @param map map参数表
* key分别为:
* type : OCR类型,值分别为 tess = Tesseract模块,baiduOnline=百度在在线识别模块,paddleocr=百度离线的paddleocr,easyedge=百度AI OCR
* ocrLite = ocrLite, paddleOcrOnline = EC自带的PC端的paddleOcr服务程序
* 如果类型是 tess,请将训练的模型放到 /sdcard/tessdata/ 文件夹下
* - 参数设置为 : {"type":"tess","language":"chi_sim","debug":false,"ocrEngineMode":3}
* - language: 语言数据集文件, 例如 chi_sim.traineddata 代表是中文简体语言,参数就填写 chi_sim,多个可以用+链接,例如:chi_sim+eng+num
* - ocrEngineMode: 识别引擎类型,0 OEM_TESSERACT_ONLY , 1 OEM_LSTM_ONLY,2 OEM_TESSERACT_LSTM_COMBINED,3 OEM_DEFAULT
* - rilLevel: PageIteratorLevel 参数,-1 自适应, 0: RIL_BLOCK, 1: RIL_PARA, 2: RIL_TEXTLINE, 3: RIL_WORD, 4:RIL_SYMBOL
* - debug: 代码是否设置调试模式,一般设置false即可
* - path: 放tessdata的文件夹路径,不要加上tessdata,是tessdata文件夹的父级
* 如果类型是 baiduOnline, 参数设置为 : {"type":"baiduOnline","ak":"xxx","sk":"xx"}
* - ak = api key,sk = secret key, 百度OCR文档地址 : https://ai.baidu.com/ai-doc/OCR/Ck3h7y2ia
* 如果类型是 ocrLite,
* - 参数设置为 : {"type":"ocrLite","numThread":4,"padding":10,"maxSideLen":0}
* - numThread: 线程数量。
* - padding: 图像预处理,在图片外周添加白边,用于提升识别率,文字框没有正确框住所有文字时,增加此值。
* - maxSideLen: 按图片最长边的长度,此值为0代表不缩放,例:1024,如果图片长边大于1024则把图像整体缩小到1024再进行图像分割计算,如果图片长边小于1024则不缩放,如果图片长边小于32,则缩放到32。
* 如果类型设置为: paddleOcrOnline 请到网盘中下载**EasyClick-PaddleOcr.zip文件解压运行**
* - 例子{
* "type": "paddleOcrOnline",
* "ocrType":"ONNX_PPOCR_V3",
* "padding": 50,
* "maxSideLen": 0,
* "boxScoreThresh": 0.5,
* "boxThresh": 0.3,
* "unClipRatio": 1.6,
* "doAngleFlag": 0,
* "mostAngleFlag": 0
* }
* - ocrType : 模型 ONNX_PPOCR_V3,ONNX_PPOCR_V4,NCNN_PPOCR_V3
* - serverUrl:paddle ocr服务器地址,可以在其他电脑部署,然后中控链接,例如 192.168.2.8,部署在电脑就改ip地址即可,端口是 9022 可以不写
* - padding 图像外接白框,用于提升识别率,文字框没有正确框住所有文字时,增加此值。默认50。
* - maxSideLen 按图像长边进行总体缩放,放大增加识别耗时但精度更高,缩小减小耗时但精度降低,maxSideLen为0表示不缩放。
* - boxScoreThresh 文字框置信度门限,文字框没有正确框住所有文字时,减小此值
* - boxThresh 同上,自行试验。
* - unClipRatio 单个文字框大小倍率,越大时单个文字框越大。
* - doAngleFlag 启用(1)/禁用(0) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测,默认关闭。
* - mostAngleFlag 启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用,默认关闭。
* - limit 代表每1秒执行ocr请求个数 默认1000。可以适当降低减少cpu占用
* - checkImage 检查数据是否是图像(1是 0否)默认关闭。
* @return {boolean} 布尔型 成功或者失败
*/
OcrInst.prototype.initOcr = function (map) {
if (map == null) {
return ocrWrapper.initOcr(this.ocrUtil, null);
}
return ocrWrapper.initOcr(this.ocrUtil, JSON.stringify(map));
};
/**
* 初始化OCR远程服务,只有使用easyedge和paddleocr的时候需要调用
* @param timeout 超时时间,毫秒
* @return {boolean} 成功或者失败
*/
OcrInst.prototype.initOcrServer = function (timeout) {
return ocrWrapper.initOcrServer(this.ocrUtil, timeout);
};
/**
* OCR远程服务连接上,只有使用easyedge和paddleocr的时候可用
* @return {bool} 成功或者失败
*/
OCRWrapper.prototype.isOcrServerOk = function () {
return ocrWrapper.isOcrServerOk(this.ocrUtil);
};
/**
* 设置OCR实现方式
* @param type 值分别为 tess = Tesseract模块,baiduOnline=百度在在线识别模块
* @return {boolean} 成功或者失败
*/
OcrInst.prototype.setOcrType = function (type) {
return ocrWrapper.setOcrType(this.ocrUtil, type);
};
/**
* 设置是否守护OCR服务
* 适合版本 EC 6.9.0+
* @param daemon true 代表守护,false代表不守护
* @param delay 每次守护间隔,单位是毫秒
* @return {boolean} 成功或者失败
*/
OcrInst.prototype.setDaemonServer = function (daemon, delay) {
return ocrWrapper.setDaemonServer(this.ocrUtil, daemon, delay);
};
/**
* 释放OCR占用的资源
* @return {boolean} 成功或者失败
*/
OcrInst.prototype.releaseAll = function () {
return ocrWrapper.releaseAll(this.ocrUtil);
};
/**
* 获取错误消息
* @return {string} null代表没有错误
*/
OcrInst.prototype.getErrorMsg = function () {
return ocrWrapper.getErrorMsg(this.ocrUtil);
};
/**
* 对Bitmap进行OCR,返回的是JSON数据,其中数据类似于与:
*
* [{
* "label": "奇趣装扮三阶盘化",
* "confidence": 0.48334712,
* "x": 11,
* "y": 25,
* "width": 100,
* "height": 100
* }]
*
* label: 代表是识别的文字
* confidence:代表识别的准确度
* x: 代表X开始坐标
* Y: 代表Y开始坐标
* width: 代表宽度
* height: 代表高度
* @param bitmap 图片
* @param timeout 超时时间 单位毫秒
* @param extra 扩展参数,map形式,例如 {"token":"xxx"}
* @return {null|JSON} JSON对象
*/
OcrInst.prototype.ocrBitmap = function (bitmap, timeout, extra) {
if (bitmap == null) {
return null;
}
var d = ocrWrapper.ocrBitmap(this.ocrUtil, bitmap, timeout, JSON.stringify(extra));
if (d != null && d != "") {
return JSON.parse(d);
}
return d;
};
/**
*
* @param img
* @param timeout
* @param extra
* @return {null|JSON} JSON对象
*/
OcrInst.prototype.ocrImage = function (img, timeout, extra) {
if (img == null) {
return null;
}
let bitmap = image.imageToBitmap(img)
if (bitmap == null) {
return null
}
let d = ocrWrapper.ocrBitmap(this.ocrUtil, bitmap, timeout, JSON.stringify(extra));
if (bitmap != null) {
bitmap.recycle();
bitmap = null;
}
if (d != null && d != "") {
return JSON.parse(d);
}
return d;
};
/**
*
* @param arr
* @return {string|null}
*/
ImageWrapper.prototype.convertFirstColorArrayToString = function (arr) {
if (arr) {
if (typeof arr == "string") {
return arr;
}
if (arr[1] == null || arr[1].length <= 0 || "" == arr[1]) {
return arr[0];
}
return arr[0] + "-" + arr[1];
}
return null;
}
/**
*
* @param arr
* @return {string|null|*}
*/
ImageWrapper.prototype.convertMultiColorArrayToString = function (arr) {
if (arr) {
if (typeof arr == "string") {
return arr;
}
//转换成类似的字符串 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
let length = arr.length;
let result = "";
for (let i = 0; i < length; i = i + 4) {
if (result.length > 0) {
result = result + ","
}
let p = arr[i + 3];
if (p == null || p.length <= 0 || "" == p) {
result = result + arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2];
} else {
result = result + arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2] + "-" + arr[i + 3];
}
}
return result;
}
return null;
}
/**
*
* @param arr
* @return {string|null}
*/
ImageWrapper.prototype.convertFirstColorArrayToString2 = function (arr) {
if (arr) {
if (typeof arr == "string") {
return arr;
}
//转换成类似的字符串 0x969696-0x000010,0x969696,0x969696
let length = arr.length;
let result = "";
for (let i = 0; i < length; i = i + 2) {
if (result.length > 0) {
result = result + ","
}
let p = arr[i + 1];
if (p == null || p.length <= 0 || "" == p) {
result = result + arr[i];
} else {
result = result + arr[i] + "-" + arr[i + 1];
}
}
return result;
}
return null;
}
/**
*
* @param arr
* @return {string|null|string[]}
*/
ImageWrapper.prototype.convertMultiCmpColorArrayToString = function (arr) {
if (arr) {
if (typeof arr == "string") {
return arr;
}
//转换成类似的字符串 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
let length = arr.length;
let result = [];
for (let i = 0; i < length; i = i + 4) {
let p = arr[i + 3];
if (p == null || p.length <= 0 || "" == p) {
let tmp = arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2];
result.push(tmp)
} else {
let tmp = arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2] + "-" + arr[i + 3];
result.push(tmp)
}
}
return result;
}
return null;
}
/**
* 通过颜色找图,支持透明图,这个不需要处理话opencv
*
* 整张图片都找不到时返回null
*
* 运行环境: 无限制
*
* 兼容版本: Android 5.0 以上
* @param image1 大图片
* @param template 小图片(模板)
* @param x 找图区域 x 起始坐标
* @param y 找图区域 y 起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @return {null|Point[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findImageByColor = function (image1, template, x, y, ex, ey, threshold, limit) {
if (imageWrapper == null || image1 == null || template == null) {
return null;
}
let res = imageWrapper.findImageByColor(image1.uuid, template.uuid, x, y, ex - x, ey - y, threshold, limit);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (let i = 0; i < d.length; i++) {
x1.push(new Point(d[i]));
}
return x1;
} catch (e) {
}
return null;
};
/**
* 通过颜色找图,支持透明图,这个不需要处理话opencv
*
* 整张图片都找不到时返回null
* @param image1 大图片
* @param template 小图片(模板)
* @param x 找图区域 x 起始坐标
* @param y 找图区域 y 起始坐标
* @param ex 终点X坐标
* @param ey 终点Y坐标
* @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
* @param extra 扩展函数,map结构例如
* {"firstColorOffset":"#101010","firstColorThreshold":1.0,"firstColorOffset":"#101010","otherColorThreshold":0.9,"cmpColorSucThreshold":1.0}
*
firstColorOffset: 第一个匹配到的颜色偏色,例如 #101010
* firstColorThreshold: 第一个匹配到的颜色偏色系数,例如 0.9
* firstColorOffset: 剩下需要找的颜色 偏色,例如 #101010
* otherColorThreshold: 剩下需要找的颜色 偏色系数,例如 0.9
* cmpColorSucThreshold: 成功匹配多少个颜色系数 就认为是成功的,例如 0.9 = 90%个点
* startX: 第一个点从哪里开始找的X坐标
* startY: 第一个点从哪里开始找的Y坐标
* @return {null|Point[]} 坐标点数组或者null
*/
ImageWrapper.prototype.findImageByColorEx = function (image1, template, x, y, ex, ey, limit, extra) {
if (imageWrapper == null || image1 == null || template == null) {
return;
}
if (extra) {
extra = JSON.stringify(extra);
}
let res = imageWrapper.findImageByColorEx(image1.uuid, template.uuid, x, y, ex - x, ey - y, limit, extra);
if (res == null || res == "") {
return null;
}
try {
let d = JSON.parse(res);
let x1 = [];
for (let i = 0; i < d.length; i++) {
x1.push(new Point(d[i]));
}
return x1;
} catch (e) {
}
return null;
};
function Yolov8Wrapper() {
}
let yolov8Api = new Yolov8Wrapper();
function Yolov8Util(instance) {
this.yolov8Instance = instance;
}
/**
* 获取YOLOV8错误消息
* 适配EC 10.15.0+
* @return {string} 字符串
*/
Yolov8Util.prototype.getErrorMsg = function () {
return ocrWrapper.getYolov8ErrorMsg(this.yolov8Instance);
}
/**
* 获取 yolov8 默认配置
* 适配EC 10.15.0+
* @param model_name 模型名称 默认写 yolov8s-640 即可
* @param input_size yolov8训练时候的imgsz参数,默认写640即可
* @param box_thr 检测框系数,默认写0.25即可
* @param iou_thr 输出系数,,默认写0.35 即可
* @param bind_cpu 是否绑定CPU,选项为ALL,BIG,LITTLE 三个,默认写ALL
* @param use_vulkan_compute 是否启用硬件加速,1是,0否
* @param obj_names JSON数组,训练的时候分类名称例如 ["star","common","face"]
* @return {JSON|null|*} 数据
*/
Yolov8Util.prototype.getDefaultConfig = function (model_name, input_size, box_thr, iou_thr, bind_cpu, use_vulkan_compute, obj_names) {
if ((typeof obj_names) == "string") {
obj_names = obj_names.split(",");
}
let data = {
"name": "yolov8s-640",
"input_size": 640,
"box_thr": 0.25,
"iou_thr": 0.35,
"ver": 8,
"bind_cpu": "ALL",
"use_vulkan_compute": 0,
"input_name": "in0",
"names": [],
"outputs": [
{
"name": "out0",
"stride": 0,
"anchors": [
0,
0
]
}
]
}
data["name"] = model_name;
data["names"] = obj_names;
data["input_size"] = input_size;
data["box_thr"] = box_thr;
data["num_thread"] = 4;
data["iou_thr"] = iou_thr;
data["use_vulkan_compute"] = use_vulkan_compute;
data["bind_cpu"] = bind_cpu;
return data;
}
/**
* 初始化yolov8模型
* 具体如何生成param和bin文件,请参考文件的yolo使用章节,通过yolo的pt转成ncnn的param、bin文件
* 适配EC 10.15.0+
* @param map 参数表 参考 getDefaultConfig函数获取默认的参数
* @param paramPath param文件路径
* @param binPath bin文件路径
* @return {boolean} true代表成功 false代表失败
*/
Yolov8Util.prototype.initYoloModel = function (map, paramPath, binPath) {
if (map == null) {
return false;
}
let data = JSON.stringify(map);
return ocrWrapper.initYoloModel(this.yolov8Instance, data, paramPath, binPath);
}
/**
* 检测图片
* 适配EC 10.15.0+
* 返回数据例如
* [{"name":"heart","confidence":0.92,"left":957,"top":986,"right":1050,"bottom":1078}]
* name: 代表是分类,confidence:代表可信度,left,top,right,bottom代表结果坐标选框
* @param bitmap 安卓的bitmap对象
* @param obj_names JSON数组,不写代表不过滤,写了代表只取填写的分类
* @return {string|null} 字符串数据
*/
Yolov8Util.prototype.detectBitmap = function (bitmap, obj_names) {
if (bitmap == null) {
return null;
}
if (obj_names == null || obj_names == undefined) {
obj_names = "[]"
} else {
obj_names = JSON.stringify(obj_names)
}
return ocrWrapper.detectBitmap(this.yolov8Instance, bitmap, obj_names);
}
/**
* 检测Image
* 适配EC 10.16.0+
* 返回数据例如
* [{"name":"heart","confidence":0.92,"left":957,"top":986,"right":1050,"bottom":1078}]
* name: 代表是分类,confidence:代表可信度,left,top,right,bottom代表结果坐标选框
* @param img AutoImage对象
* @param obj_names JSON数组,不写代表不过滤,写了代表只取填写的分类
* @return {string|null} 字符串数据
*/
Yolov8Util.prototype.detectImage = function (img, obj_names) {
let bitmap = image.imageToBitmap(img)
if (bitmap == null) {
return null
}
if (obj_names == null || obj_names == undefined) {
obj_names = "[]"
} else {
obj_names = JSON.stringify(obj_names)
}
let result = ocrWrapper.detectBitmap(this.yolov8Instance, bitmap, obj_names);
if (bitmap != null) {
try {
bitmap.recycle();
} catch (e) {
}
bitmap = null;
}
return result;
}
/**
* 释放yolov8资源
* 适配EC 10.15.0+
* @return {boolean}
*/
Yolov8Util.prototype.release = function () {
return ocrWrapper.releaseYolo(this.yolov8Instance);
}
/**
* 初始化yolov8实例
* 适配EC 10.15.0+
* @return {Yolov8Util} 实例对象
*/
Yolov8Wrapper.prototype.newYolov8 = function () {
let instance = ocrWrapper.newYolov8();
return new Yolov8Util(instance)
}