panchengyong
10 days ago b2d3f7caf927e5b83ec52efb74f1f818dbb15236
rpa/libs/image.js
@@ -47,6 +47,8 @@
/**
 * 设置图色模块初始化参数,可用于多分辨率兼容
 * @param param
 * auto_click_request_dialog: true 自动点击截图权限对话框
 * auto_detect_orientation: true 自动检测方向 false 不检测方向
 */
ImageWrapper.prototype.setInitParam = function (param) {
    if (imageWrapper == null) {
@@ -54,12 +56,43 @@
    }
    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|*}
 * @return {boolean}
 */
ImageWrapper.prototype.setFindColorImageMode = function (type) {
    if (imageWrapper == null) {
@@ -68,10 +101,44 @@
    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 布尔型 true 代表成功 false代表失败
 * @return {boolean} true 代表成功 false代表失败
 */
ImageWrapper.prototype.initOpenCV = function () {
    if (imageWrapper == null) {
@@ -100,7 +167,7 @@
 * @param timeout 超时时间,单位是毫秒
 * @param type 截屏的类型,0 自动选择,1 代表授权模式,2 代表无需权限模式(该模式前提条件:运行模式为代理模式)
 *
 * @return 布尔型 true 代表成功 false代表失败
 * @return {boolean} true 代表成功 false代表失败
 */
ImageWrapper.prototype.requestScreenCapture = function (timeout, type) {
    if (imageWrapper == null) {
@@ -137,7 +204,7 @@
 * @param y 截图的起始Y坐标
 * @param ex 终点X坐标
 * @param ey 终点Y坐标
 * @return AutoImage AutoImage对象或者null
 * @return {null|AutoImage} AutoImage对象或者null
 */
ImageWrapper.prototype.captureScreen = function (retryNumber, x, y, ex, ey) {
    if (imageWrapper == null) {
@@ -158,7 +225,7 @@
 * @param ex 终点X坐标
 * @param ey 终点Y坐标
 * @param q 图片质量,1 - 100,代理模式下有用
 * @return Bitmap null或者bitmap对象
 * @return {null|Bitmap} null或者bitmap对象
 */
ImageWrapper.prototype.captureScreenBitmap = function (format, x, y, ex, ey, q) {
    if (imageWrapper == null) {
@@ -169,7 +236,7 @@
/**
 * 将屏幕抓取为Bitmap对象,在代理模式下和captureScreenBitmap实现不一样,速度比captureScreenBitmap快
 * 适合版本 EC 8.3.+
 * @return Bitmap null或者bitmap对象
 * @return {null|Bitmap} null或者bitmap对象
 */
ImageWrapper.prototype.captureScreenBitmapEx = function () {
    if (imageWrapper == null) {
@@ -225,7 +292,7 @@
 * @param ex 终点X坐标
 * @param ey 终点Y坐标
 * @param path 截图保存路径
 * @return 布尔型 true 截图成功 false 代表不成功
 * @return {boolean} true 截图成功 false 代表不成功
 */
ImageWrapper.prototype.captureToFile = function (retryNumber, x, y, ex, ey, path) {
    if (imageWrapper == null) {
@@ -244,7 +311,7 @@
 * 兼容版本: Android 5.0 以上
 *
 * @param path 图片路径
 * @return AutoImage AutoImage对象或者null
 * @return {null|AutoImage} AutoImage对象或者null
 */
ImageWrapper.prototype.readImage = function (path) {
    if (imageWrapper == null) {
@@ -264,7 +331,7 @@
 * [注意]: 这个函数是将图片读取到app进程中,如果你使用的是代理模式并且已经打开了代理服务,请使用readImage函数
 * 适合版本: EC 9.41.0+
 * @param path 图片路径
 * @return AutoImage AutoImage对象或者null
 * @return {null|AutoImage} AutoImage对象或者null
 */
ImageWrapper.prototype.readImageNotAgent = function (path) {
    if (imageWrapper == null) {
@@ -282,7 +349,7 @@
 * 适合版本: EC 9.41.0+
 * [注意]: 这个函数是将图片读取到app进程中,如果你使用的是代理模式并且已经打开了代理服务,请使用 bitmapToImage 函数
 * @param bitmap {Bitmap}对象
 * @return {AutoImage} 对象
 * @return {null|AutoImage} 对象
 */
ImageWrapper.prototype.bitmapToImageNotAgent = function (bitmap) {
    if (imageWrapper == null) {
@@ -300,7 +367,7 @@
 * 适合版本: EC 9.41.0+
 * [注意]: 这个函数是将图片读取到app进程中,如果你使用的是代理模式并且已经打开了代理服务,请使用 readResAutoImage 函数
 * @param res {string} res文件夹下的文件路径
 * @return {AutoImage} 对象
 * @return {null|AutoImage} 对象
 */
ImageWrapper.prototype.readResAutoImageNotAgent = function (res) {
    if (res == null) {
@@ -321,7 +388,7 @@
 * 兼容版本: Android 5.0 以上
 *
 * @param path 图片路径
 * @return Bitmap android的bitmap对象或者null
 * @return {null|Bitmap} android的bitmap对象或者null
 */
ImageWrapper.prototype.readBitmap = function (path) {
    if (imageWrapper == null) {
@@ -340,7 +407,7 @@
 * @param image1 图片
 * @param x     要获取的像素的横坐标。
 * @param y     要获取的像素的纵坐标。
 * @return 整型
 * @return {number}
 */
ImageWrapper.prototype.pixelInImage = function (image1, x, y) {
    if (imageWrapper == null || image1 == null) {
@@ -367,7 +434,7 @@
 * @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 Rect 区域坐标对象数组或者null
 * @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) {
@@ -390,7 +457,7 @@
 * @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 Rect 区域坐标对象数组或者null
 * @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) {
@@ -414,7 +481,7 @@
 * @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 Rect 区域坐标对象数组或者null
 * @return {null|Rect[]} 区域坐标对象数组或者null
 */
ImageWrapper.prototype.findImageEx = function (template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
    if (imageWrapper == null || template == null) {
@@ -441,7 +508,7 @@
 *                      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 Match集合 匹配到的集合
 * @return {null|Match[]} 匹配到的集合
 */
ImageWrapper.prototype.matchTemplate = function (image1, template, weakThreshold, threshold, rect, maxLevel, limit, method) {
    if (imageWrapper == null || image1 == null || template == null) {
@@ -452,12 +519,17 @@
    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]));
    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 x;
    return null;
};
/**
@@ -473,7 +545,7 @@
 *                      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 Match集合 匹配到的集合
 * @return {null|Match[]} 匹配到的集合
 */
ImageWrapper.prototype.matchTemplate2 = function (image1, template, weakThreshold, threshold, rect, maxLevel, limit, method) {
    if (imageWrapper == null || image1 == null || template == null) {
@@ -484,12 +556,18 @@
    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]));
    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 x;
    return null;
};
/**
 * OpenCV模板匹配封装,在当前屏幕截图中进行匹配
@@ -506,7 +584,7 @@
 *                      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 Match集合 匹配到的集合
 * @return {null|Match[]} 匹配到的集合
 */
ImageWrapper.prototype.matchTemplateEx = function (template, weakThreshold, threshold, rect, maxLevel, limit, method) {
    if (imageWrapper == null || template == null) {
@@ -540,7 +618,7 @@
 * @param ey 终点Y坐标
 * @param limit 限制个数
 * @param orz 方向,分别从1-8
 * @return 多个 PointIndex 坐标点数组或者null
 * @return {null|PointIndex[]}多个 PointIndex 坐标点数组或者null
 */
ImageWrapper.prototype.findNotColor = function (image1, color, threshold, x, y, ex, ey, limit, orz) {
    if (imageWrapper == null || image1 == null) {
@@ -553,13 +631,18 @@
    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) {
    let d = JSON.parse(res);
    let x1 = [];
    for (let i = 0; i < d.length; i++) {
        x1.push(new PointIndex(d[i]));
    }
    return x1;
    return null;
};
/**
 * 在图片中找到颜色和color完全相等的点,;如果没有找到,则返回null。
@@ -574,7 +657,7 @@
 * @param ey 终点Y坐标
 * @param limit 限制个数
 * @param orz 方向,分别从1-8
 * @return 多个 PointIndex 坐标点数组或者null
 * @return {null|PointIndex[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findColor = function (image1, color, threshold, x, y, ex, ey, limit, orz) {
    if (imageWrapper == null || image1 == null) {
@@ -587,12 +670,17 @@
        return null;
    }
    let d = JSON.parse(res);
    let x1 = [];
    for (let i = 0; i < d.length; i++) {
        x1.push(new PointIndex(d[i]));
    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 x1;
    return null;
};
@@ -605,7 +693,7 @@
 *
 * @param image 图片
 * @param jsonFileName     res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
 * @return 多个 PointIndex 坐标点数组或者null
 * @return {null|PointIndex[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findColorJ = function (image1, jsonFileName) {
    if (imageWrapper == null || image1 == null) {
@@ -642,7 +730,7 @@
 * @param ey 终点Y坐标
 * @param limit 限制个数
 * @param orz 方向,分别从1-8
 * @return 多个 PointIndex 坐标点数组或者null
 * @return {null|PointIndex[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findColorEx = function (color, threshold, x, y, ex, ey, limit, orz) {
    if (imageWrapper == null) {
@@ -653,12 +741,17 @@
    if (res == null || res == "") {
        return null;
    }
    let d = JSON.parse(res);
    let x1 = [];
    for (var i = 0; i < d.length; i++) {
        x1.push(new PointIndex(d[i]));
    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;
    }
    return x1;
};
@@ -670,7 +763,7 @@
 * 兼容版本: Android 5.0 以上
 *
 * @param jsonFileName     res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
 * @return 多个 PointIndex 坐标点数组或者null
 * @return {null|PointIndex[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findColorExJ = function (jsonFileName) {
    if (imageWrapper == null) {
@@ -712,7 +805,7 @@
 * @param ey 终点Y坐标
 * @param limit 限制个数
 * @param orz 方向,分别从1-8
 * @return 多个Point 坐标点数组或者null
 * @return {null|Point[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findMultiColor = function (image1, firstColor, points, threshold, x, y, ex, ey, limit, orz) {
    if (imageWrapper == null || image1 == null) {
@@ -724,12 +817,17 @@
    if (res == null || res == "") {
        return null;
    }
    let d = JSON.parse(res);
    let x1 = [];
    for (let i = 0; i < d.length; i++) {
        x1.push(new Point(d[i]));
    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 x1;
    return null;
};
@@ -744,7 +842,7 @@
 *
 * @param image1      要找色的图片
 * @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
 * @return 多个Point 坐标点数组或者null
 * @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
@@ -787,7 +885,7 @@
 * @param ey 终点Y坐标
 * @param limit 限制个数
 * @param orz 方向,分别从1-8
 * @return 多个Point 坐标点数组或者null
 * @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
@@ -823,7 +921,7 @@
 * 兼容版本: Android 5.0 以上
 *
 * @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
 * @return 多个Point 坐标点数组或者null
 * @return {null|Point[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findMultiColorExJ = function (jsonFileName) {
    if (imageWrapper == null) {
@@ -859,7 +957,7 @@
 * @param y 区域的Y起始坐标,默认填写0全屏查找
 * @param ex 终点X坐标,默认填写0全屏查找
 * @param ey 终点Y坐标,默认填写0全屏查找
 * @return 布尔型,true代表找到了 false代表未找到
 * @return {boolean} true代表找到了 false代表未找到
 */
ImageWrapper.prototype.cmpColor = function (image1, points, threshold, x, y, ex, ey) {
    if (imageWrapper == null || image1 == null) {
@@ -885,7 +983,7 @@
 * @param y 区域的Y起始坐标,默认填写0全屏查找
 * @param ex 终点X坐标,默认填写0全屏查找
 * @param ey 终点Y坐标,默认填写0全屏查找
 * @return 布尔型,true代表找到了 false代表未找到
 * @return {boolean} true代表找到了 false代表未找到
 */
ImageWrapper.prototype.cmpColorEx = function (points, threshold, x, y, ex, ey) {
    if (imageWrapper == null) {
@@ -911,7 +1009,7 @@
 * @param y 区域的Y起始坐标,默认填写0全屏查找
 * @param ex 终点X坐标,默认填写0全屏查找
 * @param ey 终点Y坐标,默认填写0全屏查找
 * @return 整型,如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
 * @return {number} 如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
 */
ImageWrapper.prototype.cmpMultiColor = function (image1, points, threshold, x, y, ex, ey) {
    if (imageWrapper == null || image1 == null) {
@@ -949,7 +1047,7 @@
 * @param y 区域的Y起始坐标,默认填写0全屏查找
 * @param ex 终点X坐标,默认填写0全屏查找
 * @param ey 终点Y坐标,默认填写0全屏查找
 * @return 整型,如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
 * @return {number} 如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
 */
ImageWrapper.prototype.cmpMultiColorEx = function (points, threshold, x, y, ex, ey) {
    if (imageWrapper == null) {
@@ -980,7 +1078,7 @@
/**
 * 取得宽度
 * @param img 图片对象
 * @return int
 * @return {number}
 */
ImageWrapper.prototype.getWidth = function (img) {
    if (img == null) {
@@ -992,7 +1090,7 @@
/**
 * 取得高度
 * @param img 图片对象
 * @return int
 * @return {number}
 */
ImageWrapper.prototype.getHeight = function (img) {
    if (img == null) {
@@ -1005,7 +1103,7 @@
 * 保存到文件中
 * @param img 图片对象
 * @param path 路径
 * @return bool true代表成功,false 代表失败
 * @return {boolean} true代表成功,false 代表失败
 */
ImageWrapper.prototype.saveTo = function (img, path) {
    if (img == null) {
@@ -1016,7 +1114,7 @@
/**
 * 转成base64的字符串
 * @param img 图片对象
 * @return string
 * @return {string}
 */
ImageWrapper.prototype.toBase64 = function (img) {
    if (img == null) {
@@ -1030,7 +1128,7 @@
 * @param img 图片对象
 * @param format 格式  jpg或者 png
 * @param q 质量  1-100,质量越大 越清晰
 * @return 字符串
 * @return {string}
 */
ImageWrapper.prototype.toBase64Format = function (img, format, q) {
    if (img == null) {
@@ -1045,7 +1143,7 @@
 * @param y y起始坐标
 * @param ex 终点X坐标
 * @param ey 终点Y坐标
 * @return AutoImage 对象或者null
 * @return {null|AutoImage} 对象或者null
 */
ImageWrapper.prototype.clip = function (img, x, y, ex, ey) {
    if (img == null) {
@@ -1064,7 +1162,7 @@
 * @param img 图片对象
 * @param w 目标宽度
 * @param h 目标高度
 * @return AutoImage 对象或者null
 * @return {null|AutoImage} 对象或者null
 */
ImageWrapper.prototype.scaleImage = function (img, w, h) {
    if (img == null) {
@@ -1083,7 +1181,7 @@
 * @param img 图片对象
 * @param x x坐标点
 * @param y y坐标点
 * @return int 颜色值
 * @return {number} 颜色值
 */
ImageWrapper.prototype.pixel = function (img, x, y) {
    if (img == null) {
@@ -1095,7 +1193,7 @@
/**
 * 将整型的颜色值转成16进制RGB字符串
 * @param color 整型值
 * @return {string} 颜色字符串
 * @return {null|string} 颜色字符串
 */
ImageWrapper.prototype.argb = function (color) {
    if (color == null) {
@@ -1110,7 +1208,7 @@
 * @param bitmap 图片对象
 * @param x x坐标点
 * @param y y坐标点
 * @return int 颜色值
 * @return {number} 颜色值
 */
ImageWrapper.prototype.getPixelBitmap = function (bitmap, x, y) {
    if (imageWrapper == null) {
@@ -1130,7 +1228,7 @@
 * @param y           从位图中读取的第一个像素的y坐标值
 * @param width      从每一行中读取的像素宽度
 * @param height    读取的行数
 * @return int 颜色值数组
 * @return {number} 颜色值数组
 */
ImageWrapper.prototype.getPixelsBitmap = function (bitmap, arraySize, offset, stride, x, y, width, height) {
    if (imageWrapper == null) {
@@ -1142,7 +1240,7 @@
/**
 * 是否被回收了
 * @param img 图片对象
 * @return bool true代表已经被回收了
 * @return {boolean} true代表已经被回收了
 */
ImageWrapper.prototype.isRecycled = function (img) {
    if (img == null) {
@@ -1165,7 +1263,7 @@
/**
 * 回收图片
 * @param img 图片对象
 * @return {*}
 * @return {boolean}
 */
ImageWrapper.prototype.recycle = function (img) {
    if (img == null) {
@@ -1176,7 +1274,6 @@
        let d = img.getClass();
        if (d == "class android.graphics.Bitmap") {
            img.recycle();
            return true;
        }
    } catch (e) {
@@ -1189,7 +1286,19 @@
    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;
@@ -1218,7 +1327,7 @@
 * 8    大津法自动寻求全局阈值<br/>
 * 16    三角形法自动寻求全局阈值<br/>
 * @param threshold 二值化系数,0 ~ 255
 * @return AutoImage 对象或者null
 * @return {null|AutoImage} 对象或者null
 */
ImageWrapper.prototype.binaryzation = function (img, type, threshold) {
    if (img == null) {
@@ -1268,7 +1377,7 @@
 *   {"diameter":20,
 *   "adaptiveMethod":1,
 *   "c":9,"blockSize":51}
 * @return Bitmap 对象或者null
 * @return {null|Bitmap} 对象或者null
 **/
ImageWrapper.prototype.binaryzationBitmapEx = function (bitmap, map) {
    if (bitmap == null) {
@@ -1290,7 +1399,7 @@
 * 8    大津法自动寻求全局阈值<br/>
 * 16    三角形法自动寻求全局阈值<br/>
 * @param threshold 二值化系数,0 ~ 255
 * @return Bitmap 对象或者null
 * @return {null|Bitmap} 对象或者null
 */
ImageWrapper.prototype.binaryzationBitmap = function (bitmap, type, threshold) {
    if (bitmap == null) {
@@ -1306,7 +1415,7 @@
 * @param y 开始Y坐标
 * @param w 剪裁宽度
 * @param h 剪裁高度
 * @return {Bitmap} 安卓的Bitmap对象
 * @return {null|Bitmap} 安卓的Bitmap对象
 */
ImageWrapper.prototype.clipBitmap = function (bitmap, x, y, w, h) {
    if (bitmap == null) {
@@ -1320,7 +1429,7 @@
 * @param bitmap 图片
 * @param w 目标宽度
 * @param h 目标高度
 * @return {Bitmap} 安卓的Bitmap对象
 * @return {null|Bitmap} 安卓的Bitmap对象
 */
ImageWrapper.prototype.scaleBitmap = function (bitmap, w, h) {
    if (bitmap == null) {
@@ -1333,7 +1442,7 @@
 * @param data base64 数据
 * @param flag base64格式的标示,一般为0,
 * 可选参数为 :0 默认, 1 无填充模式,2 无换行模式,4 换行模式
 * @return {Bitmap} 安卓的Bitmap对象
 * @return {null|Bitmap} 安卓的Bitmap对象
 */
ImageWrapper.prototype.base64Bitmap = function (data, flag) {
    if (data == null) {
@@ -1344,7 +1453,7 @@
/**
 * 将AutoImage转换为安卓原生的Bitmap对象
 * @param img {AutoImage}
 * @return {Bitmap} 对象
 * @return {null|Bitmap} 对象
 */
ImageWrapper.prototype.imageToBitmap = function (img) {
    if (img == null) {
@@ -1357,7 +1466,7 @@
 * 将安卓原生的Bitmap对象转换为AutoImage
 * 适合EC 6.15.0+版本
 * @param img {Bitmap}对象
 * @return {AutoImage} 对象
 * @return {null|AutoImage} 对象
 */
ImageWrapper.prototype.bitmapToImage = function (bitmap) {
    var xd = imageWrapper.bitmapToImage(bitmap);
@@ -1388,7 +1497,7 @@
 * @param format 要保存图像格式,有 png,jpg,webp
 * @param q 要保存图像质量,1-100
 * @param path 要保存图像路径
 * @return {bool} true 成功 false 失败
 * @return {boolean} true 成功 false 失败
 */
ImageWrapper.prototype.saveBitmap = function (bitmap, format, q, path) {
    if (bitmap == null) {
@@ -1401,7 +1510,7 @@
 * 支持EC 10.11.0+
 * @param bitmap 安卓的bitmap对象
 * @param degree 度数,-90代表逆时针旋转90度,home键在右,90度代表顺时针旋转90度,home键在左
 * @return Bitmap 对象或者null
 * @return {null|Bitmap} 对象或者null
 */
ImageWrapper.prototype.rotateBitmap = function (bitmap, degree) {
    if (bitmap == null) {
@@ -1416,7 +1525,7 @@
 * 支持EC 10.11.0+
 * @param img 图片对象
 * @param degree 度数,-90代表逆时针旋转90度,home键在右,90度代表顺时针旋转90度,home键在左
 * @return AutoImage 对象或者null
 * @return {null|AutoImage} 对象或者null
 */
ImageWrapper.prototype.rotateImage = function (img, degree) {
    if (img == null) {
@@ -1429,10 +1538,14 @@
    return null;
};
/**
 *
 * @param res
 * @return {null|AutoImage}
 */
ImageWrapper.prototype.readResAutoImage = function (res) {
    if (res == null) {
        return false;
        return null;
    }
    let uuid = imageWrapper.readResAutoImage(res);
    if (uuid != null && uuid != undefined && uuid != "") {
@@ -1446,7 +1559,7 @@
 * 使用系统的screencap命令截图AutoImage,适合root或者代理模式, 有root权限或者开启了代理服务
 * 适合版本 EC 6.8.0+
 * @param root 是否优先使用root方式截图
 * @return AutoImage 对象或者null
 * @return {null|AutoImage} 对象或者null
 */
ImageWrapper.prototype.screencapImage = function (root) {
    let xd = imageWrapper.screencapImage(root);
@@ -1530,7 +1643,7 @@
 *  - mostAngleFlag 启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用,默认关闭。<br/>
 *  - limit 代表每1秒执行ocr请求个数 默认1000。可以适当降低减少cpu占用<br/>
 *  - checkImage 检查数据是否是图像(1是 0否)默认关闭。<br/>
 * @return {bool} 布尔型 成功或者失败
 * @return {boolean} 布尔型 成功或者失败
 */
OcrInst.prototype.initOcr = function (map) {
    if (map == null) {
@@ -1542,7 +1655,7 @@
/**
 * 初始化OCR远程服务,只有使用easyedge和paddleocr的时候需要调用
 * @param timeout 超时时间,毫秒
 * @return {bool} 成功或者失败
 * @return {boolean} 成功或者失败
 */
OcrInst.prototype.initOcrServer = function (timeout) {
    return ocrWrapper.initOcrServer(this.ocrUtil, timeout);
@@ -1560,7 +1673,7 @@
/**
 * 设置OCR实现方式
 * @param type 值分别为 tess = Tesseract模块,baiduOnline=百度在在线识别模块
 * @return {bool} 成功或者失败
 * @return {boolean} 成功或者失败
 */
OcrInst.prototype.setOcrType = function (type) {
    return ocrWrapper.setOcrType(this.ocrUtil, type);
@@ -1572,7 +1685,7 @@
 * 适合版本 EC 6.9.0+
 * @param daemon true 代表守护,false代表不守护
 * @param delay 每次守护间隔,单位是毫秒
 * @return {bool} 成功或者失败
 * @return {boolean} 成功或者失败
 */
OcrInst.prototype.setDaemonServer = function (daemon, delay) {
    return ocrWrapper.setDaemonServer(this.ocrUtil, daemon, delay);
@@ -1581,7 +1694,7 @@
/**
 * 释放OCR占用的资源
 * @return {bool} 成功或者失败
 * @return {boolean} 成功或者失败
 */
OcrInst.prototype.releaseAll = function () {
    return ocrWrapper.releaseAll(this.ocrUtil);
@@ -1618,7 +1731,7 @@
 * @param bitmap 图片
 * @param timeout 超时时间 单位毫秒
 * @param extra 扩展参数,map形式,例如 {"token":"xxx"}
 * @return {JSON} JSON对象
 * @return {null|JSON} JSON对象
 */
OcrInst.prototype.ocrBitmap = function (bitmap, timeout, extra) {
    if (bitmap == null) {
@@ -1630,7 +1743,13 @@
    }
    return d;
};
/**
 *
 * @param img
 * @param timeout
 * @param extra
 * @return {null|JSON} JSON对象
 */
OcrInst.prototype.ocrImage = function (img, timeout, extra) {
    if (img == null) {
        return null;
@@ -1650,6 +1769,11 @@
    return d;
};
/**
 *
 * @param arr
 * @return {string|null}
 */
ImageWrapper.prototype.convertFirstColorArrayToString = function (arr) {
    if (arr) {
        if (typeof arr == "string") {
@@ -1664,7 +1788,11 @@
    return null;
}
/**
 *
 * @param arr
 * @return {string|null|*}
 */
ImageWrapper.prototype.convertMultiColorArrayToString = function (arr) {
    if (arr) {
        if (typeof arr == "string") {
@@ -1690,7 +1818,11 @@
    return null;
}
/**
 *
 * @param arr
 * @return {string|null}
 */
ImageWrapper.prototype.convertFirstColorArrayToString2 = function (arr) {
    if (arr) {
        if (typeof arr == "string") {
@@ -1716,7 +1848,11 @@
    return null;
}
/**
 *
 * @param arr
 * @return {string|null|string[]}
 */
ImageWrapper.prototype.convertMultiCmpColorArrayToString = function (arr) {
    if (arr) {
        if (typeof arr == "string") {
@@ -1756,7 +1892,7 @@
 * @param ey 终点Y坐标
 * @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
 * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
 * @return 多个Point 坐标点数组或者null
 * @return {null|Point[]} 坐标点数组或者null
 */
ImageWrapper.prototype.findImageByColor = function (image1, template, x, y, ex, ey, threshold, limit) {
    if (imageWrapper == null || image1 == null || template == null) {
@@ -1766,12 +1902,18 @@
    if (res == null || res == "") {
        return null;
    }
    let d = JSON.parse(res);
    let x1 = [];
    for (let i = 0; i < d.length; i++) {
        x1.push(new Point(d[i]));
    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 x1;
    return null;
};
/**
 * 通过颜色找图,支持透明图,这个不需要处理话opencv
@@ -1793,7 +1935,7 @@
 * cmpColorSucThreshold: 成功匹配多少个颜色系数 就认为是成功的,例如 0.9 = 90%个点<Br/>
 * startX: 第一个点从哪里开始找的X坐标<Br/>
 * startY: 第一个点从哪里开始找的Y坐标<Br/>
 * @return 多个Point 坐标点数组或者null
 * @return {null|Point[]}  坐标点数组或者null
 */
ImageWrapper.prototype.findImageByColorEx = function (image1, template, x, y, ex, ey, limit, extra) {
    if (imageWrapper == null || image1 == null || template == null) {
@@ -1806,12 +1948,18 @@
    if (res == null || res == "") {
        return null;
    }
    let d = JSON.parse(res);
    let x1 = [];
    for (let i = 0; i < d.length; i++) {
        x1.push(new Point(d[i]));
    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 x1;
    return null;
};
function Yolov8Wrapper() {
@@ -1827,7 +1975,7 @@
/**
 * 获取YOLOV8错误消息
 * 适配EC 10.15.0+
 * @return string 字符串
 * @return {string} 字符串
 */
Yolov8Util.prototype.getErrorMsg = function () {
    return ocrWrapper.getYolov8ErrorMsg(this.yolov8Instance);
@@ -1838,12 +1986,12 @@
 * 适配EC 10.15.0+
 * @param model_name 模型名称 默认写  yolov8s-640 即可
 * @param input_size yolov8训练时候的imgsz参数,默认写640即可
 * @param input_size 检测框系数,默认写0.25即可
 * @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数据
 * @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") {
@@ -1874,6 +2022,7 @@
    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;
@@ -1887,7 +2036,7 @@
 * @param map 参数表 参考 getDefaultConfig函数获取默认的参数
 * @param paramPath param文件路径
 * @param binPath bin文件路径
 * @return boolean true代表成功 false代表失败
 * @return {boolean} true代表成功 false代表失败
 */
Yolov8Util.prototype.initYoloModel = function (map, paramPath, binPath) {
    if (map == null) {
@@ -1905,7 +2054,7 @@
 * name: 代表是分类,confidence:代表可信度,left,top,right,bottom代表结果坐标选框
 * @param bitmap 安卓的bitmap对象
 * @param obj_names JSON数组,不写代表不过滤,写了代表只取填写的分类
 * @return string 字符串数据
 * @return {string|null} 字符串数据
 */
Yolov8Util.prototype.detectBitmap = function (bitmap, obj_names) {
    if (bitmap == null) {
@@ -1919,10 +2068,43 @@
    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
 * @return {boolean}
 */
Yolov8Util.prototype.release = function () {
    return ocrWrapper.releaseYolo(this.yolov8Instance);
@@ -1931,7 +2113,7 @@
/**
 * 初始化yolov8实例
 * 适配EC 10.15.0+
 * @return  Yolov8Util 实例对象
 * @return  {Yolov8Util} 实例对象
 */
Yolov8Wrapper.prototype.newYolov8 = function () {
    let instance = ocrWrapper.newYolov8();