panchengyong
10 days ago b2d3f7caf927e5b83ec52efb74f1f818dbb15236
commit | author | age
bc5e1e 1 function PointIndex(javaPoint) {
X 2     this.x = 0;
3     this.y = 0;
4     this.index = -1;
5     if (javaPoint != null) {
6         this.x = javaPoint["x"];
7         this.y = javaPoint["y"];
8         this.index = javaPoint["index"];
9     }
10 }
11
12 PointIndex.get = function () {
13     return new PointIndex(null);
14 };
15 PointIndex.jsonToObject = function (res) {
16     if (res == null || res == "") {
17         return null;
18     }
19     res = JSON.parse(res);
20     if (res == null) {
21         return null;
22     }
23     return new Point(res);
24 };
25 PointIndex.prototype.setX = function (x) {
26     this.x = x;
27     return this;
28 };
29 PointIndex.prototype.setY = function (y) {
30     this.y = y;
31     return this;
32 };
33 PointIndex.prototype.setIndex = function (index) {
34     this.index = index;
35     return this;
36 };
37 PointIndex.prototype.toJSONString = function () {
38     return JSON.stringify(this);
39 };
40
41
42 function ImageWrapper() {
43
44 }
45
46 var image = new ImageWrapper();
47 /**
48  * 设置图色模块初始化参数,可用于多分辨率兼容
49  * @param param
b2d3f7 50  * auto_click_request_dialog: true 自动点击截图权限对话框
P 51  * auto_detect_orientation: true 自动检测方向 false 不检测方向
bc5e1e 52  */
X 53 ImageWrapper.prototype.setInitParam = function (param) {
54     if (imageWrapper == null) {
55         return;
56     }
57     imageWrapper.setInitParam(JSON.stringify(param));
58 };
b2d3f7 59 /**
P 60  * 切换图片存储模式为opencv的mat格式
61  * 这个函数调用会初始化OPENCV,所以打包的时候组件要包含opencv组件(找图组件)
62  * 适合 EC  10.18.0+
63  * 切换后抓图、读取图片、找图、找色等都会切换到mat格式,速度更快内存更少
64  * 如果让图片格式切换请参考 imageToMatFormat和matToImageFormat两个函数
65  * @param use 1 是 0 否
66  * @return {boolean}  true 成功 false 失败
67  */
68 ImageWrapper.prototype.useOpencvMat = function (use) {
69     if (imageWrapper == null) {
70         return false;
71     }
72     return imageWrapper.useOpencvMat(use);
73 };
74
75 /**
76  * 截屏时候如果转换mat失败,可以是这个函数试试,一般用不上
77  * 这个函数调用会初始化OPENCV,所以打包的时候组件要包含opencv组件
78  * 先转为bitmap再转为mat
79  * 适合 EC  10.18.0+
80  * @param use 1 是 0 否
81  * @return {boolean}  true 成功 false 失败
82  */
83 ImageWrapper.prototype.setConvertMatWithBitmap = function (use) {
84     if (imageWrapper == null) {
85         return false;
86     }
87     return imageWrapper.setConvertMatWithBitmap(use);
88 };
89
bc5e1e 90
X 91 /**
92  * 设置找色找图的算法模式
93  * 适合EC 9.10.0+
94  * @param type 1 代表老的查找算法,2代表新的查找算法
b2d3f7 95  * @return {boolean}
bc5e1e 96  */
X 97 ImageWrapper.prototype.setFindColorImageMode = function (type) {
98     if (imageWrapper == null) {
99         return false;
100     }
101     return imageWrapper.setFindColorImageMode(type);
102 };
103
b2d3f7 104
P 105 /**
106  * 转换Mat存储格式
107  * 适合 EC  10.18.0+
108  * @param img {AutoImage} 图片对象
109  * @return {null|AutoImage} MAT存储格式的AutoImage 对象或者null
110  */
111 ImageWrapper.prototype.imageToMatFormat = function (img) {
112     if (img == null) {
113         return null;
114     }
115     let xd = imageWrapper.imageToMatFormat(img.uuid);
116     if (xd != null && xd != undefined && xd != "") {
117         return new AutoImage(javaString2string(xd));
118     }
119     return null;
120 };
121
122 /**
123  * 转换普通image存储格式
124  * 适合 EC  10.18.0+
125  * @param img {AutoImage} 图片对象
126  * @return {null|AutoImage} 普通存储格式的AutoImage 对象或者null
127  */
128 ImageWrapper.prototype.matToImageFormat = function (img) {
129     if (img == null) {
130         return null;
131     }
132     let xd = imageWrapper.matToImageFormat(img.uuid);
133     if (xd != null && xd != undefined && xd != "") {
134         return new AutoImage(javaString2string(xd));
135     }
136     return null;
137 };
bc5e1e 138 /**
X 139  * 初始化OPENCV 类库
140  * 如果使用找图请先调用这个函数,第一次初始化需要复制类库,时间可能较长,以后再次执行就很快
b2d3f7 141  * @return {boolean} true 代表成功 false代表失败
bc5e1e 142  */
X 143 ImageWrapper.prototype.initOpenCV = function () {
144     if (imageWrapper == null) {
145         return false;
146     }
147     return imageWrapper.initOpenCV();
148 };
149
150
151 /**
152  * 向系统申请屏幕截图权限,返回是否请求成功。
153  * <p>
154  * 第一次使用该函数会弹出截图权限请求,建议选择“总是允许”。
155  * </p>
156  * <p>
157  * 这个函数只是申请截图权限,并不会真正执行截图,真正的截图函数是captureScreen()。
158  * </p>
159  * 该函数在截图脚本中只需执行一次,而无需每次调用captureScreen()都调用一次。
160  * <p>
161  * 建议在本软件界面运行该函数,在其他软件界面运行时容易出现一闪而过的黑屏现象。
162  * </P>
163  * <Br/>
164  * 运行环境: 无限制
165  * <Br/>
166  * 兼容版本: Android 5.0 以上
167  * @param timeout 超时时间,单位是毫秒
168  * @param type 截屏的类型,0 自动选择,1 代表授权模式,2 代表无需权限模式(该模式前提条件:运行模式为代理模式)
169  *
b2d3f7 170  * @return {boolean} true 代表成功 false代表失败
bc5e1e 171  */
X 172 ImageWrapper.prototype.requestScreenCapture = function (timeout, type) {
173     if (imageWrapper == null) {
174         return false;
175     }
176     return imageWrapper.requestScreenCapture(timeout, type);
177 };
178
179
180 /**
181  * 释放截屏请求
182  * <Br/>
183  * 运行环境: 无限制
184  * <Br/>
185  * 兼容版本: Android 5.0 以上
186  */
187 ImageWrapper.prototype.releaseScreenCapture = function () {
188     if (imageWrapper == null) {
189         return;
190     }
191     imageWrapper.releaseScreenCapture();
192 };
193
194
195 /**
196  * 截取当前屏幕并返回一个Image对象。
197  * 运行环境: 无限制
198  * <Br/>
199  * 兼容版本: Android 5.0 以上
200  * <Br/>
201  * 如果区域空或则有负数的,就会是全屏
202  * @param retryNumber 重试次数,直到能截到图为止,默认是3
203  * @param x 截图的起始X坐标
204  * @param y 截图的起始Y坐标
205  * @param ex 终点X坐标
206  * @param ey 终点Y坐标
b2d3f7 207  * @return {null|AutoImage} AutoImage对象或者null
bc5e1e 208  */
X 209 ImageWrapper.prototype.captureScreen = function (retryNumber, x, y, ex, ey) {
210     if (imageWrapper == null) {
211         return null;
212     }
213     var uuid = imageWrapper.captureScreen(retryNumber, x, y, ex - x, ey - y);
214     if (uuid != null && uuid != undefined && uuid != "") {
215         return new AutoImage(uuid);
216     }
217     return null;
218 };
219
220 /**
221  * 将屏幕抓取为Bitmap对象,如果中间有-1或者宽度、宽度为-1,将会是全屏
222  * @param format jpg或者png,代理模式下有用
223  * @param x 开始X坐标
224  * @param y 开始Y坐标
225  * @param ex 终点X坐标
226  * @param ey 终点Y坐标
227  * @param q 图片质量,1 - 100,代理模式下有用
b2d3f7 228  * @return {null|Bitmap} null或者bitmap对象
bc5e1e 229  */
X 230 ImageWrapper.prototype.captureScreenBitmap = function (format, x, y, ex, ey, q) {
231     if (imageWrapper == null) {
232         return null;
233     }
234     return imageWrapper.captureScreenBitmap(format, x, y, ex - x, ey - y, q);
235 };
236 /**
237  * 将屏幕抓取为Bitmap对象,在代理模式下和captureScreenBitmap实现不一样,速度比captureScreenBitmap快
238  * 适合版本 EC 8.3.+
b2d3f7 239  * @return {null|Bitmap} null或者bitmap对象
bc5e1e 240  */
X 241 ImageWrapper.prototype.captureScreenBitmapEx = function () {
242     if (imageWrapper == null) {
243         return null;
244     }
245     return imageWrapper.captureScreenBitmapEx("png");
246 };
247
248
249 /**
250  * 抓取全屏
251  * @return {null|AutoImage}
252  */
253 ImageWrapper.prototype.captureFullScreen = function () {
254     if (imageWrapper == null) {
255         return null;
256     }
257     var uuid = imageWrapper.captureFullScreen();
258     if (uuid != null && uuid != undefined && uuid != "") {
259         return new AutoImage(uuid);
260     }
261     return null;
262 };
263
264
265 /**
266  * 抓取全屏函数,代理模式下并且requestScreenCapture函数的type为0的时候,会使用截屏函数,尽力消除色差问题。
267  * 其他的和captureFullScreen一致
268  * @return {null|AutoImage}
269  */
270 ImageWrapper.prototype.captureFullScreenEx = function () {
271     if (imageWrapper == null) {
272         return null;
273     }
274     var uuid = imageWrapper.captureFullScreenEx();
275     if (uuid != null && uuid != undefined && uuid != "") {
276         return new AutoImage(uuid);
277     }
278     return null;
279 };
280
281 /**
282  * 截取当前屏幕并以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
283  * <Br/>
284  * 运行环境: 无限制
285  * <Br/>
286  * 兼容版本: Android 5.0 以上
287  *<Br/>
288  * 如果区域空或则有负数的,就会是全屏
289  * @param retryNumber 重试次数,直到能截到图为止,默认是3
290  * @param x 截图的起始X坐标
291  * @param y 截图的起始Y坐标
292  * @param ex 终点X坐标
293  * @param ey 终点Y坐标
294  * @param path 截图保存路径
b2d3f7 295  * @return {boolean} true 截图成功 false 代表不成功
bc5e1e 296  */
X 297 ImageWrapper.prototype.captureToFile = function (retryNumber, x, y, ex, ey, path) {
298     if (imageWrapper == null) {
299         return false;
300     }
301     return imageWrapper.captureScreenToFile(retryNumber, x, y, ex - x, ey - y, path);
302 };
303
304 /**
305  * 读取在路径path的图片文件并返回一个{@link AutoImage}对象。
306  * 如果文件不存在或者文件无法解码则返回null。
307  * [注意]: 如果使用代理模式,但是代理服务未启动,将返回null,可以使用readImageNotAgent读取image对象
308  * <Br/>
309  * 运行环境: 无限制
310  * <Br/>
311  * 兼容版本: Android 5.0 以上
312  *
313  * @param path 图片路径
b2d3f7 314  * @return {null|AutoImage} AutoImage对象或者null
bc5e1e 315  */
X 316 ImageWrapper.prototype.readImage = function (path) {
317     if (imageWrapper == null) {
318         return null;
319     }
320     var uuid = imageWrapper.readImage(path);
321     if (uuid != null && uuid != undefined && uuid != "") {
322         return new AutoImage(uuid);
323     }
324     return null;
325 };
326
327
328 /**
329  * 读取在路径path的图片文件并返回一个{@link AutoImage}对象。
330  * 如果文件不存在或者文件无法解码则返回null。
331  * [注意]: 这个函数是将图片读取到app进程中,如果你使用的是代理模式并且已经打开了代理服务,请使用readImage函数
332  * 适合版本: EC 9.41.0+
333  * @param path 图片路径
b2d3f7 334  * @return {null|AutoImage} AutoImage对象或者null
bc5e1e 335  */
X 336 ImageWrapper.prototype.readImageNotAgent = function (path) {
337     if (imageWrapper == null) {
338         return null;
339     }
340     var uuid = imageWrapper.readImageNotAgent(path);
341     if (uuid != null && uuid != undefined && uuid != "") {
342         return new AutoImage(uuid);
343     }
344     return null;
345 };
346
347 /**
348  * 将安卓原生的Bitmap对象转换为AutoImage
349  * 适合版本: EC 9.41.0+
350  * [注意]: 这个函数是将图片读取到app进程中,如果你使用的是代理模式并且已经打开了代理服务,请使用 bitmapToImage 函数
351  * @param bitmap {Bitmap}对象
b2d3f7 352  * @return {null|AutoImage} 对象
bc5e1e 353  */
X 354 ImageWrapper.prototype.bitmapToImageNotAgent = function (bitmap) {
355     if (imageWrapper == null) {
356         return null;
357     }
358     var uuid = imageWrapper.bitmapToImageNotAgent(bitmap);
359     if (uuid != null && uuid != undefined && uuid != "") {
360         return new AutoImage(uuid);
361     }
362     return null;
363 };
364
365 /**
366  * 将res文件夹的文件转换为AutoImage
367  * 适合版本: EC 9.41.0+
368  * [注意]: 这个函数是将图片读取到app进程中,如果你使用的是代理模式并且已经打开了代理服务,请使用 readResAutoImage 函数
369  * @param res {string} res文件夹下的文件路径
b2d3f7 370  * @return {null|AutoImage} 对象
bc5e1e 371  */
X 372 ImageWrapper.prototype.readResAutoImageNotAgent = function (res) {
373     if (res == null) {
374         return false;
375     }
376     let uuid = imageWrapper.readResAutoImageNotAgent(res);
377     if (uuid != null && uuid != undefined && uuid != "") {
378         return new AutoImage(uuid);
379     }
380     return null;
381 };
382
383 /**
384  * 读取在路径path的图片文件并返回一个{@link Bitmap}对象。如果文件不存在或者文件无法解码则返回null。
385  * <Br/>
386  * 运行环境: 无限制
387  * <Br/>
388  * 兼容版本: Android 5.0 以上
389  *
390  * @param path 图片路径
b2d3f7 391  * @return {null|Bitmap} android的bitmap对象或者null
bc5e1e 392  */
X 393 ImageWrapper.prototype.readBitmap = function (path) {
394     if (imageWrapper == null) {
395         return null;
396     }
397     return imageWrapper.readBitmap(path);
398 };
399
400 /**
401  * 返回图片image在点(x, y)处的像素的ARGB值。
402  * <p>
403  * 该值的格式为0xAARRGGBB,是一个"32位整数"
404  * <p>
405  * 坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
406  *
407  * @param image1 图片
408  * @param x     要获取的像素的横坐标。
409  * @param y     要获取的像素的纵坐标。
b2d3f7 410  * @return {number}
bc5e1e 411  */
X 412 ImageWrapper.prototype.pixelInImage = function (image1, x, y) {
413     if (imageWrapper == null || image1 == null) {
414         return null;
415     }
416     return imageWrapper.pixelInImage(image1.uuid, x, y);
417 };
418
419
420 /**
421  * 找图。在大图片image中查找小图片template的位置(模块匹配),找到时返回位置坐标区域(Rect),找不到时返回null。
422  * <Br/>
423  * 运行环境: 无限制
424  * <Br/>
425  * 兼容版本: Android 5.0 以上
426  *
427  * @param image1     大图片
428  * @param template  小图片(模板)
429  * @param x         找图区域 x 起始坐标
430  * @param y         找图区域 y 起始坐标
431  * @param ex 终点X坐标
432  * @param ey 终点Y坐标
433  * @param weakThreshold  图片相似度。取值范围为0~1的浮点数。默认值为0.9。
434  * @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
435  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
436  * @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
b2d3f7 437  * @return {null|Rect[]} 区域坐标对象数组或者null
bc5e1e 438  */
X 439 ImageWrapper.prototype.findImage = function (image1, template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
440     if (imageWrapper == null || image1 == null || template == null) {
441         return null;
442     }
443     var res = imageWrapper.findImage(image1.uuid, template.uuid, x, y, ex - x, ey - y, weakThreshold, threshold, limit, method);
444     return this.toRectList(res);
445 };
446 /**
447  * 找图。在大图片image中查找小图片template的位置(模块匹配),找到时返回位置坐标区域(Rect),找不到时返回null。
448  * 找图函数缩放找图,比findImage更精准
449  * 适合版本 EC 9.41.0+
450  * @param image1     大图片
451  * @param template  小图片(模板)
452  * @param x         找图区域 x 起始坐标
453  * @param y         找图区域 y 起始坐标
454  * @param ex 终点X坐标
455  * @param ey 终点Y坐标
456  * @param weakThreshold  图片相似度。取值范围为0~1的浮点数。默认值为0.9。
457  * @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
458  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
459  * @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
b2d3f7 460  * @return {null|Rect[]} 区域坐标对象数组或者null
bc5e1e 461  */
X 462 ImageWrapper.prototype.findImage2 = function (image1, template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
463     if (imageWrapper == null || image1 == null || template == null) {
464         return null;
465     }
466     var res = imageWrapper.findImage2(image1.uuid, template.uuid, x, y, ex - x, ey - y, weakThreshold, threshold, limit, method);
467     return this.toRectList(res);
468 };
469 /**
470  * 找图。在当前屏幕中查找小图片template的位置(模块匹配),找到时返回位置坐标区域(Rect),找不到时返回null。
471  * <Br/>
472  * 运行环境: 无限制
473  * <Br/>
474  * 兼容版本: Android 5.0 以上
475  * @param template  小图片(模板)
476  * @param x         找图区域 x 起始坐标
477  * @param y         找图区域 y 起始坐标
478  * @param ex 终点X坐标
479  * @param ey 终点Y坐标
480  * @param weakThreshold  图片相似度。取值范围为0~1的浮点数。默认值为0.9。
481  * @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
482  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
483  * @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
b2d3f7 484  * @return {null|Rect[]} 区域坐标对象数组或者null
bc5e1e 485  */
X 486 ImageWrapper.prototype.findImageEx = function (template, x, y, ex, ey, weakThreshold, threshold, limit, method) {
487     if (imageWrapper == null || template == null) {
488         return null;
489     }
490     var res = imageWrapper.findImageCurrentScreen(template.uuid, x, y, ex - x, ey - y, weakThreshold, threshold, limit, method);
491     return this.toRectList(res);
492 };
493
494
495 /**
496  * OpenCV模板匹配封装
497  * <Br/>
498  * 运行环境: 无限制
499  * <Br/>
500  * 兼容版本: Android 5.0 以上
501  *
502  * @param image1         大图片
503  * @param template      小图片(模板)
504  * @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
505  * @param threshold     图片相似度。取值范围为0~1的浮点数。默认值为0.9。
506  * @param rect          找图区域。参见findColor函数关于 rect 的说明
507  * @param maxLevel      默认为-1,一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
508  *                      level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
509  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
510  * @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
b2d3f7 511  * @return {null|Match[]} 匹配到的集合
bc5e1e 512  */
X 513 ImageWrapper.prototype.matchTemplate = function (image1, template, weakThreshold, threshold, rect, maxLevel, limit, method) {
514     if (imageWrapper == null || image1 == null || template == null) {
515         return null;
516     }
517     var drect = rect == null ? null : rect.toJSONString();
518     var res = imageWrapper.matchTemplate(image1.uuid, template.uuid, weakThreshold, threshold, drect, maxLevel, limit, method);
519     if (res == null || res == "") {
520         return null;
521     }
b2d3f7 522     try {
P 523         var d = JSON.parse(res);
524         var x = [];
525         for (var i = 0; i < d.length; i++) {
526             x.push(new Match(d[i]));
527         }
528         return x;
529     } catch (e) {
530
bc5e1e 531     }
b2d3f7 532     return null;
bc5e1e 533 };
X 534
535 /**
536  * OpenCV模板匹配封装
537  * 包含缩放找图功能
538  * 适配版本 EC 9.41.0+
539  * @param image1         大图片
540  * @param template      小图片(模板)
541  * @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
542  * @param threshold     图片相似度。取值范围为0~1的浮点数。默认值为0.9。
543  * @param rect          找图区域。参见findColor函数关于 rect 的说明
544  * @param maxLevel      默认为-1,一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
545  *                      level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
546  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
547  * @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
b2d3f7 548  * @return {null|Match[]} 匹配到的集合
bc5e1e 549  */
X 550 ImageWrapper.prototype.matchTemplate2 = function (image1, template, weakThreshold, threshold, rect, maxLevel, limit, method) {
551     if (imageWrapper == null || image1 == null || template == null) {
552         return null;
553     }
554     var drect = rect == null ? null : rect.toJSONString();
555     var res = imageWrapper.matchTemplate2(image1.uuid, template.uuid, weakThreshold, threshold, drect, maxLevel, limit, method);
556     if (res == null || res == "") {
557         return null;
558     }
b2d3f7 559     try {
P 560         var d = JSON.parse(res);
561         var x = [];
562         for (var i = 0; i < d.length; i++) {
563             x.push(new Match(d[i]));
564         }
565         return x;
566     } catch (e) {
567
bc5e1e 568     }
b2d3f7 569     return null;
P 570
bc5e1e 571 };
X 572 /**
573  * OpenCV模板匹配封装,在当前屏幕截图中进行匹配
574  * <Br/>
575  * 运行环境: 无限制
576  * <Br/>
577  * 兼容版本: Android 5.0 以上
578  *
579  * @param template      小图片(模板)
580  * @param weakThreshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
581  * @param threshold     图片相似度。取值范围为0~1的浮点数。默认值为0.9。
582  * @param rect          找图区域。参见findColor函数关于 rect 的说明
583  * @param maxLevel      默认为-1,一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
584  *                      level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
585  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
586  * @param method 0: TM_SQDIFF平方差匹配法,1: TM_SQDIFF_NORMED归一化平方差匹配方法,2: TM_CCORR相关匹配法,3: TM_CCORR_NORMED归一化相关匹配法,4: TM_CCOEFF系数匹配法,5: TM_CCOEFF_NORMED归一化系数匹配法
b2d3f7 587  * @return {null|Match[]} 匹配到的集合
bc5e1e 588  */
X 589 ImageWrapper.prototype.matchTemplateEx = function (template, weakThreshold, threshold, rect, maxLevel, limit, method) {
590     if (imageWrapper == null || template == null) {
591         return null;
592     }
593     var drect = rect == null ? null : rect.toJSONString();
594     var res = imageWrapper.matchTemplateCurrentScreen(template.uuid, weakThreshold, threshold, drect, maxLevel, limit, method);
595     if (res == null || res == "") {
596         return null;
597     }
598     var d = JSON.parse(res);
599     var x = [];
600     for (var i = 0; i < d.length; i++) {
601         x.push(new Match(d[i]));
602     }
603     return x;
604 };
605
606
607 /**
608  * 找非色
609  * 在图片中找到颜色和color完全不相等的点,如果没有找到,则返回null。
610  * 适配EC 9.22.0+
611  * 兼容版本: Android 5.0 以上
612  * @param image1 图片
613  * @param color 要寻找的颜色,用ec工具可以生成
614  * @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
615  * @param x 区域的X起始坐标
616  * @param y 区域的Y起始坐标
617  * @param ex 终点X坐标
618  * @param ey 终点Y坐标
619  * @param limit 限制个数
620  * @param orz 方向,分别从1-8
b2d3f7 621  * @return {null|PointIndex[]}多个 PointIndex 坐标点数组或者null
bc5e1e 622  */
X 623 ImageWrapper.prototype.findNotColor = function (image1, color, threshold, x, y, ex, ey, limit, orz) {
624     if (imageWrapper == null || image1 == null) {
625         return null;
626     }
627
628     color = this.convertFirstColorArrayToString2(color);
629     // allNotEquals 这个是用于处理全部判断相等 展示保留,全部设置为true
630     let res = imageWrapper.findNotColor(image1.uuid, color, threshold, x, y, ex - x, ey - y, limit, orz, true);
631     if (res == null || res == "") {
632         return null;
633     }
b2d3f7 634     try {
P 635         let d = JSON.parse(res);
636         let x1 = [];
637         for (let i = 0; i < d.length; i++) {
638             x1.push(new PointIndex(d[i]));
639         }
640         return x1;
641     } catch (e) {
bc5e1e 642
X 643     }
b2d3f7 644     return null;
P 645
bc5e1e 646 };
X 647 /**
648  * 在图片中找到颜色和color完全相等的点,;如果没有找到,则返回null。
649  * 运行环境: 无限制
650  * 兼容版本: Android 5.0 以上
651  * @param image1 图片
652  * @param color     要寻找的颜色
653  * @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
654  * @param x 区域的X起始坐标
655  * @param y 区域的Y起始坐标
656  * @param ex 终点X坐标
657  * @param ey 终点Y坐标
658  * @param limit 限制个数
659  * @param orz 方向,分别从1-8
b2d3f7 660  * @return {null|PointIndex[]} 坐标点数组或者null
bc5e1e 661  */
X 662 ImageWrapper.prototype.findColor = function (image1, color, threshold, x, y, ex, ey, limit, orz) {
663     if (imageWrapper == null || image1 == null) {
664         return null;
665     }
666
667     color = this.convertFirstColorArrayToString2(color);
668     let res = imageWrapper.findColor(image1.uuid, color, threshold, x, y, ex - x, ey - y, limit, orz);
669     if (res == null || res == "") {
670         return null;
671     }
672
b2d3f7 673     try {
P 674         let d = JSON.parse(res);
675         let x1 = [];
676         for (let i = 0; i < d.length; i++) {
677             x1.push(new PointIndex(d[i]));
678         }
679         return x1;
680     } catch (e) {
681
bc5e1e 682     }
b2d3f7 683     return null;
bc5e1e 684 };
X 685
686
687 /**
688  * 在图片中找到颜色和color完全相等的点,参数从JSON中获取如果没有找到,则返回null。
689  * <Br/>
690  * 运行环境: 无限制
691  * <Br/>
692  * 兼容版本: Android 5.0 以上
693  *
694  * @param image 图片
695  * @param jsonFileName     res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
b2d3f7 696  * @return {null|PointIndex[]} 坐标点数组或者null
bc5e1e 697  */
X 698 ImageWrapper.prototype.findColorJ = function (image1, jsonFileName) {
699     if (imageWrapper == null || image1 == null) {
700         return null;
701     }
702     var data = readResString(jsonFileName + ".json");
703     if (data == null || data == "") {
704         return null;
705     }
706     data = JSON.parse(data);
707     var firstColor = data['firstColor'];
708     var threshold = data['threshold'];
709     var x = data['x'];
710     var y = data['y'];
711     var ex = data['ex'];
712     var ey = data['ey'];
713     var limit = data['limit'];
714     var orz = data['orz']
715     return this.findColor(image1.uuid, firstColor, threshold, x, y, ex - x, ey - y, limit, orz);
716 };
717
718 /**
719  * 在当前屏幕中找到颜色和color完全相等的点,如果没有找到,则返回null。
720  * <Br/>
721  * 运行环境: 无限制
722  * <Br/>
723  * 兼容版本: Android 5.0 以上
724  *
725  * @param color     要寻找的颜色
726  * @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
727  * @param x 区域的X起始坐标
728  * @param y 区域的Y起始坐标
729  * @param ex 终点X坐标
730  * @param ey 终点Y坐标
731  * @param limit 限制个数
732  * @param orz 方向,分别从1-8
b2d3f7 733  * @return {null|PointIndex[]} 坐标点数组或者null
bc5e1e 734  */
X 735 ImageWrapper.prototype.findColorEx = function (color, threshold, x, y, ex, ey, limit, orz) {
736     if (imageWrapper == null) {
737         return null;
738     }
739     color = this.convertFirstColorArrayToString2(color);
740     let res = imageWrapper.findColorCurrentScreen(color, threshold, x, y, ex - x, ey - y, limit, orz);
741     if (res == null || res == "") {
742         return null;
743     }
b2d3f7 744     try {
P 745         let d = JSON.parse(res);
746         let x1 = [];
747         for (var i = 0; i < d.length; i++) {
748             x1.push(new PointIndex(d[i]));
749         }
750         return x1;
751     } catch (e) {
752         return null;
bc5e1e 753     }
b2d3f7 754
bc5e1e 755 };
X 756
757
758 /**
759  * 在当前屏幕中找到颜色和color完全相等的点,参数从JSON中获取如果没有找到,则返回null。
760  * <Br/>
761  * 运行环境: 无限制
762  * <Br/>
763  * 兼容版本: Android 5.0 以上
764  *
765  * @param jsonFileName     res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
b2d3f7 766  * @return {null|PointIndex[]} 坐标点数组或者null
bc5e1e 767  */
X 768 ImageWrapper.prototype.findColorExJ = function (jsonFileName) {
769     if (imageWrapper == null) {
770         return null;
771     }
772     var data = readResString(jsonFileName + ".json");
773     if (data == null || data == "") {
774         return null;
775     }
776     data = JSON.parse(data);
777     var firstColor = data['firstColor'];
778     var threshold = data['threshold'];
779     var x = data['x'];
780     var y = data['y'];
781     var ex = data['ex'];
782     var ey = data['ey'];
783     var limit = data['limit'];
784     var orz = data['orz']
785     return this.findColorCurrentScreen(firstColor, threshold, x, y, ex - x, ey - y, limit, orz);
786 };
787
788
789 /**
790  * 多点找色,找到所有符合标准的点,类似于按键精灵的多点找色
791  * <p>
792  * 整张图片都找不到时返回null
793  * <Br/>
794  * 运行环境: 无限制
795  * <Br/>
796  * 兼容版本: Android 5.0 以上
797  *
798  * @param image1      要找色的图片
799  * @param firstColor 第一个点的颜色
800  * @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0
801  * @param points     字符串类似这样 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
802  * @param x 区域的X起始坐标
803  * @param y 区域的Y起始坐标
804  * @param ex 终点X坐标
805  * @param ey 终点Y坐标
806  * @param limit 限制个数
807  * @param orz 方向,分别从1-8
b2d3f7 808  * @return {null|Point[]} 坐标点数组或者null
bc5e1e 809  */
X 810 ImageWrapper.prototype.findMultiColor = function (image1, firstColor, points, threshold, x, y, ex, ey, limit, orz) {
811     if (imageWrapper == null || image1 == null) {
812         return null;
813     }
814     firstColor = this.convertFirstColorArrayToString(firstColor);
815     points = this.convertMultiColorArrayToString(points);
816     let res = imageWrapper.findMultiColor(image1.uuid, firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
817     if (res == null || res == "") {
818         return null;
819     }
b2d3f7 820     try {
P 821         let d = JSON.parse(res);
822         let x1 = [];
823         for (let i = 0; i < d.length; i++) {
824             x1.push(new Point(d[i]));
825         }
826         return x1;
827     } catch (e) {
bc5e1e 828     }
b2d3f7 829     return null;
P 830
bc5e1e 831 };
X 832
833
834 /**
835  * 多点找色,找到所有符合标准的点,参数从JSON文件中读取,类似于按键精灵的多点找色
836  * <p>
837  * 整张图片都找不到时返回null
838  * <Br/>
839  * 运行环境: 无限制
840  * <Br/>
841  * 兼容版本: Android 5.0 以上
842  *
843  * @param image1      要找色的图片
844  * @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
b2d3f7 845  * @return {null|Point[]} 坐标点数组或者null
bc5e1e 846  */
X 847 ImageWrapper.prototype.findMultiColorJ = function (image1, jsonFileName) {
848     //String image, String firstColor, String points, float threshold, int x, int y, int w, int h,int limit
849     if (imageWrapper == null || image1 == null) {
850         return null;
851     }
852     var data = readResString(jsonFileName + ".json");
853     if (data == null || data == "") {
854         return null;
855     }
856     data = JSON.parse(data);
857     var firstColor = data['firstColor'];
858     var threshold = data['threshold'];
859     var points = data['points'];
860     var x = data['x'];
861     var y = data['y'];
862     var ex = data['ex'];
863     var ey = data['ey'];
864     var limit = data['limit'];
865     var orz = data['orz'];
866     return imageWrapper.findMultiColor(image1.uuid, firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
867 };
868
869
870 /**
871  * 多点找色,找到所有符合标准的点,自动抓取当前屏幕的图片,类似于按键精灵的多点找色
872  * <p>
873  * 整张图片都找不到时返回null
874  * <Br/>
875  * 运行环境: 无限制
876  * <Br/>
877  * 兼容版本: Android 5.0 以上
878  *
879  * @param firstColor 第一个点的颜色
880  * @param threshold  找色时颜色相似度取值为 0.0 ~ 1.0
881  * @param points     字符串类似这样 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
882  * @param x 区域的X起始坐标
883  * @param y 区域的Y起始坐标
884  * @param ex 终点X坐标
885  * @param ey 终点Y坐标
886  * @param limit 限制个数
887  * @param orz 方向,分别从1-8
b2d3f7 888  * @return {null|Point[]} 坐标点数组或者null
bc5e1e 889  */
X 890 ImageWrapper.prototype.findMultiColorEx = function (firstColor, points, threshold, x, y, ex, ey, limit, orz) {
891     //String firstColor, String points, float threshold, int x, int y, int w, int h
892     if (imageWrapper == null) {
893         return null;
894     }
895     firstColor = this.convertFirstColorArrayToString(firstColor);
896     points = this.convertMultiColorArrayToString(points);
897     let res = imageWrapper.findMultiColorCurrentScreen(firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
898     if (res == null || res == "") {
899         return null;
900     }
901     try {
902         let d = JSON.parse(res);
903         let x1 = [];
904         for (let i = 0; i < d.length; i++) {
905             x1.push(new Point(d[i]));
906         }
907         return x1;
908     } catch (e) {
909     }
910     return null;
911
912 };
913
914
915 /**
916  * 多点找色,找到所有符合标准的点,自动抓取当前屏幕的图片,参数从JSON文件中读取,类似于按键精灵的多点找色
917  * 整张图片都找不到时返回null
918  * <Br/>
919  * 运行环境: 无限制
920  * <Br/>
921  * 兼容版本: Android 5.0 以上
922  *
923  * @param jsonFileName res文件中取色工具生成的JSON文件,只要填写文件名称即可,后缀不用填写
b2d3f7 924  * @return {null|Point[]} 坐标点数组或者null
bc5e1e 925  */
X 926 ImageWrapper.prototype.findMultiColorExJ = function (jsonFileName) {
927     if (imageWrapper == null) {
928         return null;
929     }
930     var data = readResString(jsonFileName + ".json");
931     if (data == null || data == "") {
932         return null;
933     }
934     data = JSON.parse(data);
935     var firstColor = data['firstColor'];
936     var threshold = data['threshold'];
937     var points = data['points'];
938     var x = data['x'];
939     var y = data['y'];
940     var ex = data['ex'];
941     var ey = data['ey'];
942     var limit = data['limit'];
943     var orz = data['orz'];
944     return imageWrapper.findMultiColorCurrentScreen(firstColor, points, threshold, x, y, ex - x, ey - y, limit, orz);
945 };
946
947 /**
948  * 单点或者多点比色,找到所有符合标准的点,如果都符合返回true,否则是false
949  * 运行环境: 无限制
950  * <Br/>
951  * 兼容版本: Android 5.0 以上
952  *
953  * @param image1 图片
954  * @param points     字符串类似这样 6|1|0x969696-0x000010,2|3|0x969696-0x000010
955  * @param threshold  找色时颜色相似度取值为 0.0 ~ 1.0
956  * @param x 区域的X起始坐标,默认填写0全屏查找
957  * @param y 区域的Y起始坐标,默认填写0全屏查找
958  * @param ex 终点X坐标,默认填写0全屏查找
959  * @param ey 终点Y坐标,默认填写0全屏查找
b2d3f7 960  * @return {boolean} true代表找到了 false代表未找到
bc5e1e 961  */
X 962 ImageWrapper.prototype.cmpColor = function (image1, points, threshold, x, y, ex, ey) {
963     if (imageWrapper == null || image1 == null) {
964         return false;
965     }
966     points = this.convertMultiColorArrayToString(points);
967     let index = imageWrapper.cmpColor(image1.uuid, points, threshold, x, y, ex - x, ey - y);
968     if (index === -1) {
969         return false;
970     }
971     return true;
972 };
973
974 /**
975  * 单点或者多点比色,找到所有符合标准的点,默认自己截图,如果都符合返回true,否则是false
976  * 运行环境: 无限制
977  * <Br/>
978  * 兼容版本: Android 5.0 以上
979  *
980  * @param points     字符串类似这样 6|1|0x969696-0x000010,2|3|0x969696-0x000010
981  * @param threshold  找色时颜色相似度取值为 0.0 ~ 1.0
982  * @param x 区域的X起始坐标,默认填写0全屏查找
983  * @param y 区域的Y起始坐标,默认填写0全屏查找
984  * @param ex 终点X坐标,默认填写0全屏查找
985  * @param ey 终点Y坐标,默认填写0全屏查找
b2d3f7 986  * @return {boolean} true代表找到了 false代表未找到
bc5e1e 987  */
X 988 ImageWrapper.prototype.cmpColorEx = function (points, threshold, x, y, ex, ey) {
989     if (imageWrapper == null) {
990         return false;
991     }
992     points = this.convertMultiColorArrayToString(points);
993     let index = imageWrapper.cmpColorCurrentScreen(points, threshold, x, y, ex - x, ey - y);
994     if (index === -1) {
995         return false;
996     }
997     return true;
998 };
999
1000 /**
1001  * 多点或者多点数组比色,找到所有符合标准的点,依次查找,如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
1002  * 运行环境: 无限制
1003  * <Br/>
1004  * 兼容版本: Android 5.0 以上
1005  * @param image1 图片
1006  * @param points     数组类似这样 ["6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"]
1007  * @param threshold  找色时颜色相似度取值为 0.0 ~ 1.0
1008  * @param x 区域的X起始坐标,默认填写0全屏查找
1009  * @param y 区域的Y起始坐标,默认填写0全屏查找
1010  * @param ex 终点X坐标,默认填写0全屏查找
1011  * @param ey 终点Y坐标,默认填写0全屏查找
b2d3f7 1012  * @return {number} 如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
bc5e1e 1013  */
X 1014 ImageWrapper.prototype.cmpMultiColor = function (image1, points, threshold, x, y, ex, ey) {
1015     if (imageWrapper == null || image1 == null) {
1016         return -1;
1017     }
1018
1019     if (points != null) {
1020         // "6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"
1021         // 类似这样的字符串 直接 转成数组的 JSON
1022         if ((typeof points) == "string") {
1023             return imageWrapper.cmpMultiColor(image1.uuid, JSON.stringify([points]), threshold, x, y, ex - x, ey - y);
1024         }
1025         //走老的逻辑
1026         if ((typeof points[0]) == "string") {
1027             if (/#|0x/.test(points[0])) {
1028                 return imageWrapper.cmpMultiColor(image1.uuid, JSON.stringify(points), threshold, x, y, ex - x, ey - y);
1029             }
1030         }
1031         let newPoint = [];
1032         for (let i = 0; i < points.length; i++) {
1033             newPoint[i] = this.convertMultiCmpColorArrayToString(points[i]);
1034         }
1035         return imageWrapper.cmpMultiColor(image1.uuid, JSON.stringify(newPoint), threshold, x, y, ex - x, ey - y);
1036     }
1037     return -1;
1038 };
1039 /**
1040  * 多点或者多点数组比色,找到所有符合标准的点,自动截屏,依次查找,如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
1041  * 运行环境: 无限制
1042  * <Br/>
1043  * 兼容版本: Android 5.0 以上
1044  * @param points     数组类似这样 ["6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"]
1045  * @param threshold  找色时颜色相似度取值为 0.0 ~ 1.0
1046  * @param x 区域的X起始坐标,默认填写0全屏查找
1047  * @param y 区域的Y起始坐标,默认填写0全屏查找
1048  * @param ex 终点X坐标,默认填写0全屏查找
1049  * @param ey 终点Y坐标,默认填写0全屏查找
b2d3f7 1050  * @return {number} 如果找到就返回当前points的索引值,如果返回-1,说明都没有找到
bc5e1e 1051  */
X 1052 ImageWrapper.prototype.cmpMultiColorEx = function (points, threshold, x, y, ex, ey) {
1053     if (imageWrapper == null) {
1054         return -1;
1055     }
1056     if (points != null) {
1057         // "6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696","6|1|0x969696"
1058         // 类似这样的字符串 直接 转成数组的 JSON
1059         if ((typeof points) == "string") {
1060             return imageWrapper.cmpMultiColorCurrentScreen(JSON.stringify([points]), threshold, x, y, ex - x, ey - y);
1061         }
1062         //走老的逻辑
1063         if ((typeof points[0]) == "string") {
1064             if (/#|0x/.test(points[0])) {
1065                 return imageWrapper.cmpMultiColorCurrentScreen(JSON.stringify(points), threshold, x, y, ex - x, ey - y);
1066             }
1067         }
1068         let newPoint = [];
1069         for (let i = 0; i < points.length; i++) {
1070             newPoint[i] = this.convertMultiCmpColorArrayToString(points[i]);
1071         }
1072         return imageWrapper.cmpMultiColorCurrentScreen(JSON.stringify(newPoint), threshold, x, y, ex - x, ey - y);
1073     }
1074     return -1;
1075 };
1076
1077
1078 /**
1079  * 取得宽度
1080  * @param img 图片对象
b2d3f7 1081  * @return {number}
bc5e1e 1082  */
X 1083 ImageWrapper.prototype.getWidth = function (img) {
1084     if (img == null) {
1085         return 0;
1086     }
1087     return imageWrapper.getWidth(img.uuid);
1088 };
1089
1090 /**
1091  * 取得高度
1092  * @param img 图片对象
b2d3f7 1093  * @return {number}
bc5e1e 1094  */
X 1095 ImageWrapper.prototype.getHeight = function (img) {
1096     if (img == null) {
1097         return 0;
1098     }
1099     return imageWrapper.getHeight(img.uuid);
1100 };
1101
1102 /**
1103  * 保存到文件中
1104  * @param img 图片对象
1105  * @param path 路径
b2d3f7 1106  * @return {boolean} true代表成功,false 代表失败
bc5e1e 1107  */
X 1108 ImageWrapper.prototype.saveTo = function (img, path) {
1109     if (img == null) {
1110         return false;
1111     }
1112     return imageWrapper.saveTo(img.uuid + "", path);
1113 };
1114 /**
1115  * 转成base64的字符串
1116  * @param img 图片对象
b2d3f7 1117  * @return {string}
bc5e1e 1118  */
X 1119 ImageWrapper.prototype.toBase64 = function (img) {
1120     if (img == null) {
1121         return null;
1122     }
1123     return javaString2string(imageWrapper.toBase64(img.uuid, "jpg", 100));
1124 };
1125
1126 /**
1127  *  转成base64的字符串, jpg格式较小,可以减少内存
1128  * @param img 图片对象
1129  * @param format 格式  jpg或者 png
1130  * @param q 质量  1-100,质量越大 越清晰
b2d3f7 1131  * @return {string}
bc5e1e 1132  */
X 1133 ImageWrapper.prototype.toBase64Format = function (img, format, q) {
1134     if (img == null) {
1135         return null;
1136     }
1137     return javaString2string(imageWrapper.toBase64(img.uuid, format, q));
1138 };
1139 /**
1140  * 剪切图片
1141  * @param img 图片对象
1142  * @param x x起始坐标
1143  * @param y y起始坐标
1144  * @param ex 终点X坐标
1145  * @param ey 终点Y坐标
b2d3f7 1146  * @return {null|AutoImage} 对象或者null
bc5e1e 1147  */
X 1148 ImageWrapper.prototype.clip = function (img, x, y, ex, ey) {
1149     if (img == null) {
1150         return null;
1151     }
1152     var xd = imageWrapper.clip(img.uuid, x, y, ex - x, ey - y);
1153     if (xd != null && xd != undefined && xd != "") {
1154         return new AutoImage(javaString2string(xd));
1155     }
1156     return null;
1157 };
1158
1159 /**
1160  * 缩放图片
1161  * 适合EC 9.42.0+
1162  * @param img 图片对象
1163  * @param w 目标宽度
1164  * @param h 目标高度
b2d3f7 1165  * @return {null|AutoImage} 对象或者null
bc5e1e 1166  */
X 1167 ImageWrapper.prototype.scaleImage = function (img, w, h) {
1168     if (img == null) {
1169         return null;
1170     }
1171     var xd = imageWrapper.scaleImage(img.uuid, w, h);
1172     if (xd != null && xd != undefined && xd != "") {
1173         return new AutoImage(javaString2string(xd));
1174     }
1175     return null;
1176 };
1177
1178
1179 /**
1180  * 取得图片的某个点的颜色值
1181  * @param img 图片对象
1182  * @param x x坐标点
1183  * @param y y坐标点
b2d3f7 1184  * @return {number} 颜色值
bc5e1e 1185  */
X 1186 ImageWrapper.prototype.pixel = function (img, x, y) {
1187     if (img == null) {
1188         return 0;
1189     }
1190     return imageWrapper.pixel(img.uuid, x, y);
1191 };
1192
1193 /**
1194  * 将整型的颜色值转成16进制RGB字符串
1195  * @param color 整型值
b2d3f7 1196  * @return {null|string} 颜色字符串
bc5e1e 1197  */
X 1198 ImageWrapper.prototype.argb = function (color) {
1199     if (color == null) {
1200         return null;
1201     }
1202     return imageWrapper.argb(color);
1203 };
1204
1205
1206 /**
1207  * 取得Bitmap图片的某个点的颜色值
1208  * @param bitmap 图片对象
1209  * @param x x坐标点
1210  * @param y y坐标点
b2d3f7 1211  * @return {number} 颜色值
bc5e1e 1212  */
X 1213 ImageWrapper.prototype.getPixelBitmap = function (bitmap, x, y) {
1214     if (imageWrapper == null) {
1215         return 0;
1216     }
1217     return imageWrapper.getPixelBitmap(bitmap, x, y);
1218 };
1219
1220
1221 /**
1222  * 取得Bitmap图片的某个区域点的颜色值,等同于 Bitmap.getPixels
1223  * @param bitmap 图片对象
1224  * @param arraySize 要返回的区域数组的大小
1225  * @param offset      写入到pixels[]中的第一个像素索引值
1226  * @param stride      pixels[]中的行间距个数值(必须大于等于位图宽度)。可以为负数
1227  * @param x           从位图中读取的第一个像素的x坐标值。
1228  * @param y           从位图中读取的第一个像素的y坐标值
1229  * @param width      从每一行中读取的像素宽度
1230  * @param height    读取的行数
b2d3f7 1231  * @return {number} 颜色值数组
bc5e1e 1232  */
X 1233 ImageWrapper.prototype.getPixelsBitmap = function (bitmap, arraySize, offset, stride, x, y, width, height) {
1234     if (imageWrapper == null) {
1235         return null;
1236     }
1237     return imageWrapper.getPixelsBitmap(bitmap, arraySize, offset, stride, x, y, width, height);
1238 };
1239
1240 /**
1241  * 是否被回收了
1242  * @param img 图片对象
b2d3f7 1243  * @return {boolean} true代表已经被回收了
bc5e1e 1244  */
X 1245 ImageWrapper.prototype.isRecycled = function (img) {
1246     if (img == null) {
1247         return false;
1248     }
1249     try {
1250         let d = img.getClass();
1251         if (d == "class android.graphics.Bitmap") {
1252             return img.isRecycled();
1253         }
1254     } catch (e) {
1255     }
1256     if (img.uuid == null) {
1257         return false;
1258     }
1259
1260     return imageWrapper.isRecycled(img.uuid);
1261 };
1262
1263 /**
1264  * 回收图片
1265  * @param img 图片对象
b2d3f7 1266  * @return {boolean}
bc5e1e 1267  */
X 1268 ImageWrapper.prototype.recycle = function (img) {
1269     if (img == null) {
1270         return false;
1271     }
1272
1273     try {
1274         let d = img.getClass();
1275         if (d == "class android.graphics.Bitmap") {
1276             img.recycle();
1277             return true;
1278         }
1279     } catch (e) {
1280     }
1281
1282     if (img.uuid == null) {
1283         return false;
1284     }
1285
1286     return imageWrapper.recycle(img.uuid);
1287 };
1288
b2d3f7 1289 /**
P 1290  * 回收所有图片
1291  * @return {boolean}
1292  */
1293 ImageWrapper.prototype.recycleAllImage = function () {
1294     return imageWrapper.recycleAllImage();
1295 }
bc5e1e 1296
b2d3f7 1297 /**
P 1298  *
1299  * @param res
1300  * @return {null|Rect[]}
1301  */
bc5e1e 1302 ImageWrapper.prototype.toRectList = function (res) {
X 1303     if (res == null || res == "") {
1304         return null;
1305     }
1306     var ps = JSON.parse(res);
1307     if (ps == null) {
1308         return null;
1309     }
1310     var d = [];
1311     for (var i = 0; i < ps.length; i++) {
1312         d.push(new Rect(ps[i]));
1313     }
1314     return d;
1315 };
1316
1317 /**
1318  * 对AutoImage图片进行二值化
1319  * @param img AutoImage图片对象
1320  * @param type 二值化类型,一般写1即可
1321  * 0    灰度值大于阈值为最大值,其他值为<br/>
1322  * 1    灰度值大于阈值为0,其他值为最大值<br/>
1323  * 2    灰度值大于阈值的为阈值,其他值不变<br/>
1324  * 3    灰度值大于阈值的不变,其他值为0<br/>
1325  * 4    灰度值大于阈值的为零,其他值不变<br/>
1326  * 7    暂不支持<br/>
1327  * 8    大津法自动寻求全局阈值<br/>
1328  * 16    三角形法自动寻求全局阈值<br/>
1329  * @param threshold 二值化系数,0 ~ 255
b2d3f7 1330  * @return {null|AutoImage} 对象或者null
bc5e1e 1331  */
X 1332 ImageWrapper.prototype.binaryzation = function (img, type, threshold) {
1333     if (img == null) {
1334         return null;
1335     }
1336     var xd = imageWrapper.binaryzation(img.uuid, type, threshold);
1337     if (xd != null && xd != undefined && xd != "") {
1338         return new AutoImage(javaString2string(xd));
1339     }
1340     return null;
1341 };
1342
1343 /**
1344  * 自适应二值化,使用了opencv的adaptiveThreshold函数实现
1345  * 适合版本 EC 8.3.0+
1346  * @param img AutoImage图片对象
1347  * @param map MAP 参数
1348  *  diameter : 去噪直径 参考opencv的bilateralFilter函数
1349  *  adaptiveMethod:自适应二值化方式分别是0和1 ,ADAPTIVE_THRESH_MEAN_C=0,ADAPTIVE_THRESH_GAUSSIAN_C = 1
1350  *  blockSize:计算单位是像素的邻域块,邻域块取多大,就由这个值作决定,3,5,7这样的奇数
1351  *  c: 偏移值调整量,
1352  *  {
1353  *   "diameter":20,
1354  *   "adaptiveMethod":1,
1355  *   "c":9,"blockSize":51}
1356  * @return {null|AutoImage}
1357  */
1358 ImageWrapper.prototype.binaryzationEx = function (img, map) {
1359     if (img == null) {
1360         return null;
1361     }
1362     var xd = imageWrapper.binaryzationEx(img.uuid, JSON.stringify(map));
1363     if (xd != null && xd != undefined && xd != "") {
1364         return new AutoImage(javaString2string(xd));
1365     }
1366     return null;
1367 };
1368 /**
1369  * 自适应二值化,使用了opencv的adaptiveThreshold函数实现
1370  * 适合版本 EC 8.3.0+
1371  * @param bitmap Bitmap 图片对象
1372  * @param map MAP 参数
1373  *  diameter : 去噪直径 参考opencv的bilateralFilter函数
1374  *  adaptiveMethod:自适应二值化方式分别是0和1 ,ADAPTIVE_THRESH_MEAN_C=0,ADAPTIVE_THRESH_GAUSSIAN_C = 1
1375  *  blockSize:计算单位是像素的邻域块,邻域块取多大,就由这个值作决定,3,5,7这样的奇数
1376  *  c: 偏移值调整量,
1377  *   {"diameter":20,
1378  *   "adaptiveMethod":1,
1379  *   "c":9,"blockSize":51}
b2d3f7 1380  * @return {null|Bitmap} 对象或者null
bc5e1e 1381  **/
X 1382 ImageWrapper.prototype.binaryzationBitmapEx = function (bitmap, map) {
1383     if (bitmap == null) {
1384         return null;
1385     }
1386     return imageWrapper.binaryzationBitmapEx(bitmap, JSON.stringify(map));
1387 };
1388
1389 /**
1390  * 对安卓的 Bitmap 图片进行二值化
1391  * @param bitmap Bitmap 图片对象
1392  * @param type 二值化类型,一般写1即可
1393  * 0    灰度值大于阈值为最大值,其他值为<br/>
1394  * 1    灰度值大于阈值为0,其他值为最大值<br/>
1395  * 2    灰度值大于阈值的为阈值,其他值不变<br/>
1396  * 3    灰度值大于阈值的不变,其他值为0<br/>
1397  * 4    灰度值大于阈值的为零,其他值不变<br/>
1398  * 7    暂不支持<br/>
1399  * 8    大津法自动寻求全局阈值<br/>
1400  * 16    三角形法自动寻求全局阈值<br/>
1401  * @param threshold 二值化系数,0 ~ 255
b2d3f7 1402  * @return {null|Bitmap} 对象或者null
bc5e1e 1403  */
X 1404 ImageWrapper.prototype.binaryzationBitmap = function (bitmap, type, threshold) {
1405     if (bitmap == null) {
1406         return null;
1407     }
1408     return imageWrapper.binaryzationBitmap(bitmap, type, threshold);
1409 };
1410
1411 /**
1412  * 剪裁图片,请自行判断参数,正确性
1413  * @param bitmap 图片
1414  * @param x 开始X坐标
1415  * @param y 开始Y坐标
1416  * @param w 剪裁宽度
1417  * @param h 剪裁高度
b2d3f7 1418  * @return {null|Bitmap} 安卓的Bitmap对象
bc5e1e 1419  */
X 1420 ImageWrapper.prototype.clipBitmap = function (bitmap, x, y, w, h) {
1421     if (bitmap == null) {
1422         return null;
1423     }
1424     return imageWrapper.clipBitmap(bitmap, x, y, w, h);
1425 };
1426 /**
1427  * 缩放bitmap
1428  * 适合EC 9.42.0+
1429  * @param bitmap 图片
1430  * @param w 目标宽度
1431  * @param h 目标高度
b2d3f7 1432  * @return {null|Bitmap} 安卓的Bitmap对象
bc5e1e 1433  */
X 1434 ImageWrapper.prototype.scaleBitmap = function (bitmap, w, h) {
1435     if (bitmap == null) {
1436         return null;
1437     }
1438     return imageWrapper.scaleBitmap(bitmap, w, h);
1439 };
1440 /**
1441  * base64字符串转为Bitmap图片
1442  * @param data base64 数据
1443  * @param flag base64格式的标示,一般为0,
1444  * 可选参数为 :0 默认, 1 无填充模式,2 无换行模式,4 换行模式
b2d3f7 1445  * @return {null|Bitmap} 安卓的Bitmap对象
bc5e1e 1446  */
X 1447 ImageWrapper.prototype.base64Bitmap = function (data, flag) {
1448     if (data == null) {
1449         return null;
1450     }
1451     return imageWrapper.base64Bitmap(data, flag);
1452 };
1453 /**
1454  * 将AutoImage转换为安卓原生的Bitmap对象
1455  * @param img {AutoImage}
b2d3f7 1456  * @return {null|Bitmap} 对象
bc5e1e 1457  */
X 1458 ImageWrapper.prototype.imageToBitmap = function (img) {
1459     if (img == null) {
1460         return null;
1461     }
1462     return imageWrapper.imageToBitmap(img.uuid);
1463 };
1464
1465 /**
1466  * 将安卓原生的Bitmap对象转换为AutoImage
1467  * 适合EC 6.15.0+版本
1468  * @param img {Bitmap}对象
b2d3f7 1469  * @return {null|AutoImage} 对象
bc5e1e 1470  */
X 1471 ImageWrapper.prototype.bitmapToImage = function (bitmap) {
1472     var xd = imageWrapper.bitmapToImage(bitmap);
1473     if (xd != null && xd != undefined && xd != "") {
1474         return new AutoImage(javaString2string(xd));
1475     }
1476     return null;
1477 };
1478
1479
1480 /**
1481  * bitmap转为base64
1482  * @param bitmap 图片
1483  * @param format 格式,jpg或者png
1484  * @param q 质量  1 - 100
1485  * @return {string} base64字符串
1486  */
1487 ImageWrapper.prototype.bitmapBase64 = function (bitmap, format, q) {
1488     if (bitmap == null) {
1489         return null;
1490     }
1491     var d = imageWrapper.bitmapBase64(bitmap, format, q);
1492     return javaString2string(d);
1493 };
1494 /**
1495  * 保存bitmap图像
1496  * @param bitmap 图片
1497  * @param format 要保存图像格式,有 png,jpg,webp
1498  * @param q 要保存图像质量,1-100
1499  * @param path 要保存图像路径
b2d3f7 1500  * @return {boolean} true 成功 false 失败
bc5e1e 1501  */
X 1502 ImageWrapper.prototype.saveBitmap = function (bitmap, format, q, path) {
1503     if (bitmap == null) {
1504         return false;
1505     }
1506     return imageWrapper.saveBitmap(bitmap, format, q, path);
1507 };
1508 /**
1509  * 旋转Bitmap
1510  * 支持EC 10.11.0+
1511  * @param bitmap 安卓的bitmap对象
1512  * @param degree 度数,-90代表逆时针旋转90度,home键在右,90度代表顺时针旋转90度,home键在左
b2d3f7 1513  * @return {null|Bitmap} 对象或者null
bc5e1e 1514  */
X 1515 ImageWrapper.prototype.rotateBitmap = function (bitmap, degree) {
1516     if (bitmap == null) {
1517         return false;
1518     }
1519     return imageWrapper.rotateBitmap(bitmap, degree);
1520 };
1521
1522
1523 /**
1524  * 旋转图片
1525  * 支持EC 10.11.0+
1526  * @param img 图片对象
1527  * @param degree 度数,-90代表逆时针旋转90度,home键在右,90度代表顺时针旋转90度,home键在左
b2d3f7 1528  * @return {null|AutoImage} 对象或者null
bc5e1e 1529  */
X 1530 ImageWrapper.prototype.rotateImage = function (img, degree) {
1531     if (img == null) {
1532         return null;
1533     }
1534     let uuid = imageWrapper.rotateImage(img.uuid, degree);
1535     if (uuid != null && uuid != undefined && uuid != "") {
1536         return new AutoImage(uuid);
1537     }
1538     return null;
1539 };
1540
b2d3f7 1541 /**
P 1542  *
1543  * @param res
1544  * @return {null|AutoImage}
1545  */
bc5e1e 1546 ImageWrapper.prototype.readResAutoImage = function (res) {
X 1547     if (res == null) {
b2d3f7 1548         return null;
bc5e1e 1549     }
X 1550     let uuid = imageWrapper.readResAutoImage(res);
1551     if (uuid != null && uuid != undefined && uuid != "") {
1552         return new AutoImage(uuid);
1553     }
1554     return null;
1555 };
1556
1557
1558 /**
1559  * 使用系统的screencap命令截图AutoImage,适合root或者代理模式, 有root权限或者开启了代理服务
1560  * 适合版本 EC 6.8.0+
1561  * @param root 是否优先使用root方式截图
b2d3f7 1562  * @return {null|AutoImage} 对象或者null
bc5e1e 1563  */
X 1564 ImageWrapper.prototype.screencapImage = function (root) {
1565     let xd = imageWrapper.screencapImage(root);
1566     if (xd != null && xd != undefined && xd != "") {
1567         return new AutoImage(javaString2string(xd));
1568     }
1569     return null;
1570 };
1571
1572
1573 /**
1574  * 使用系统的screencap命令截图为bitmap,适合root或者代理模式, 有root权限或者开启了代理服务
1575  * 适合版本 EC 6.8.0+
1576  * @param root 是否优先使用root方式截图
1577  * @return {Bitmap} 对象
1578  */
1579 ImageWrapper.prototype.screencapBitmap = function (root) {
1580     return imageWrapper.screencapBitmap(root);
1581 };
1582
1583
1584 function OCRWrapper() {
1585
1586 }
1587
1588 function OcrInst(s) {
1589     this.ocrUtil = s;
1590 }
1591
1592 var ocr = new OCRWrapper();
1593
1594
1595 OCRWrapper.prototype.newOcr = function () {
1596     let u = ocrWrapper.newOcr();
1597     if (u == null) {
1598         return null;
1599     }
1600     let ins = new OcrInst(u);
1601     return ins;
1602 }
1603 /**
1604  * 初始化OCR模块
1605  * @param map map参数表
1606  * key分别为:<br/>
1607  * type : OCR类型,值分别为 tess = Tesseract模块,baiduOnline=百度在在线识别模块,paddleocr=百度离线的paddleocr,easyedge=百度AI OCR<br/>
1608  * ocrLite = ocrLite, paddleOcrOnline = EC自带的PC端的paddleOcr服务程序<br/>
1609  * 如果类型是 tess,请将训练的模型放到 /sdcard/tessdata/ 文件夹下 <br/>
1610  *  - 参数设置为 : {"type":"tess","language":"chi_sim","debug":false,"ocrEngineMode":3}<br/>
1611  *  - language: 语言数据集文件, 例如 chi_sim.traineddata 代表是中文简体语言,参数就填写 chi_sim,多个可以用+链接,例如:chi_sim+eng+num<br/>
1612  *  - ocrEngineMode: 识别引擎类型,0 OEM_TESSERACT_ONLY , 1 OEM_LSTM_ONLY,2 OEM_TESSERACT_LSTM_COMBINED,3 OEM_DEFAULT<br/>
1613  *  - rilLevel: PageIteratorLevel 参数,-1 自适应, 0: RIL_BLOCK, 1: RIL_PARA, 2: RIL_TEXTLINE, 3: RIL_WORD, 4:RIL_SYMBOL<br/>
1614  *  - debug: 代码是否设置调试模式,一般设置false即可<br/>
1615  *  - path: 放tessdata的文件夹路径,不要加上tessdata,是tessdata文件夹的父级<br/>
1616  * 如果类型是 baiduOnline, 参数设置为 : {"type":"baiduOnline","ak":"xxx","sk":"xx"}<br/>
1617  *  - ak = api key,sk = secret key, 百度OCR文档地址 : https://ai.baidu.com/ai-doc/OCR/Ck3h7y2ia<br/>
1618  * 如果类型是 ocrLite,
1619  *  - 参数设置为 : {"type":"ocrLite","numThread":4,"padding":10,"maxSideLen":0}<br/>
1620  *  - numThread: 线程数量。 <br/>
1621  *  - padding: 图像预处理,在图片外周添加白边,用于提升识别率,文字框没有正确框住所有文字时,增加此值。<br/>
1622  *  - maxSideLen: 按图片最长边的长度,此值为0代表不缩放,例:1024,如果图片长边大于1024则把图像整体缩小到1024再进行图像分割计算,如果图片长边小于1024则不缩放,如果图片长边小于32,则缩放到32。<br/>
1623  * 如果类型设置为: paddleOcrOnline 请到网盘中下载**EasyClick-PaddleOcr.zip文件解压运行**<br/>
1624  *  - 例子{
1625  *      "type": "paddleOcrOnline",
1626  *      "ocrType":"ONNX_PPOCR_V3",
1627  *      "padding": 50,
1628  *      "maxSideLen": 0,
1629  *      "boxScoreThresh": 0.5,
1630  *      "boxThresh": 0.3,
1631  *      "unClipRatio": 1.6,
1632  *      "doAngleFlag": 0,
1633  *      "mostAngleFlag": 0
1634  *  }<br/>
1635  *  - ocrType : 模型 ONNX_PPOCR_V3,ONNX_PPOCR_V4,NCNN_PPOCR_V3
1636  *  - serverUrl:paddle ocr服务器地址,可以在其他电脑部署,然后中控链接,例如 192.168.2.8,部署在电脑就改ip地址即可,端口是 9022 可以不写
1637  *  - padding 图像外接白框,用于提升识别率,文字框没有正确框住所有文字时,增加此值。默认50。<br/>
1638  *  - maxSideLen 按图像长边进行总体缩放,放大增加识别耗时但精度更高,缩小减小耗时但精度降低,maxSideLen为0表示不缩放。<br/>
1639  *  - boxScoreThresh 文字框置信度门限,文字框没有正确框住所有文字时,减小此值 <br/>
1640  *  - boxThresh 同上,自行试验。<br/>
1641  *  - unClipRatio 单个文字框大小倍率,越大时单个文字框越大。<br/>
1642  *  - doAngleFlag 启用(1)/禁用(0) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测,默认关闭。<br/>
1643  *  - mostAngleFlag 启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用,默认关闭。<br/>
1644  *  - limit 代表每1秒执行ocr请求个数 默认1000。可以适当降低减少cpu占用<br/>
1645  *  - checkImage 检查数据是否是图像(1是 0否)默认关闭。<br/>
b2d3f7 1646  * @return {boolean} 布尔型 成功或者失败
bc5e1e 1647  */
X 1648 OcrInst.prototype.initOcr = function (map) {
1649     if (map == null) {
1650         return ocrWrapper.initOcr(this.ocrUtil, null);
1651     }
1652     return ocrWrapper.initOcr(this.ocrUtil, JSON.stringify(map));
1653 };
1654
1655 /**
1656  * 初始化OCR远程服务,只有使用easyedge和paddleocr的时候需要调用
1657  * @param timeout 超时时间,毫秒
b2d3f7 1658  * @return {boolean} 成功或者失败
bc5e1e 1659  */
X 1660 OcrInst.prototype.initOcrServer = function (timeout) {
1661     return ocrWrapper.initOcrServer(this.ocrUtil, timeout);
1662 };
1663
1664 /**
1665  * OCR远程服务连接上,只有使用easyedge和paddleocr的时候可用
1666  * @return {bool} 成功或者失败
1667  */
1668 OCRWrapper.prototype.isOcrServerOk = function () {
1669     return ocrWrapper.isOcrServerOk(this.ocrUtil);
1670 };
1671
1672
1673 /**
1674  * 设置OCR实现方式
1675  * @param type 值分别为 tess = Tesseract模块,baiduOnline=百度在在线识别模块
b2d3f7 1676  * @return {boolean} 成功或者失败
bc5e1e 1677  */
X 1678 OcrInst.prototype.setOcrType = function (type) {
1679     return ocrWrapper.setOcrType(this.ocrUtil, type);
1680 };
1681
1682
1683 /**
1684  * 设置是否守护OCR服务
1685  * 适合版本 EC 6.9.0+
1686  * @param daemon true 代表守护,false代表不守护
1687  * @param delay 每次守护间隔,单位是毫秒
b2d3f7 1688  * @return {boolean} 成功或者失败
bc5e1e 1689  */
X 1690 OcrInst.prototype.setDaemonServer = function (daemon, delay) {
1691     return ocrWrapper.setDaemonServer(this.ocrUtil, daemon, delay);
1692 };
1693
1694
1695 /**
1696  * 释放OCR占用的资源
b2d3f7 1697  * @return {boolean} 成功或者失败
bc5e1e 1698  */
X 1699 OcrInst.prototype.releaseAll = function () {
1700     return ocrWrapper.releaseAll(this.ocrUtil);
1701 };
1702
1703
1704 /**
1705  * 获取错误消息
1706  * @return {string} null代表没有错误
1707  */
1708 OcrInst.prototype.getErrorMsg = function () {
1709     return ocrWrapper.getErrorMsg(this.ocrUtil);
1710 };
1711
1712
1713 /**
1714  * 对Bitmap进行OCR,返回的是JSON数据,其中数据类似于与:
1715  *
1716  * [{
1717  *    "label": "奇趣装扮三阶盘化",
1718  *    "confidence": 0.48334712,
1719  *    "x": 11,
1720  *    "y": 25,
1721  *    "width": 100,
1722  *    "height": 100
1723  * }]
1724  *  <br/>
1725  *  label: 代表是识别的文字
1726  *  confidence:代表识别的准确度
1727  *  x: 代表X开始坐标
1728  *  Y: 代表Y开始坐标
1729  *  width: 代表宽度
1730  *  height: 代表高度
1731  * @param bitmap 图片
1732  * @param timeout 超时时间 单位毫秒
1733  * @param extra 扩展参数,map形式,例如 {"token":"xxx"}
b2d3f7 1734  * @return {null|JSON} JSON对象
bc5e1e 1735  */
X 1736 OcrInst.prototype.ocrBitmap = function (bitmap, timeout, extra) {
1737     if (bitmap == null) {
1738         return null;
1739     }
1740     var d = ocrWrapper.ocrBitmap(this.ocrUtil, bitmap, timeout, JSON.stringify(extra));
1741     if (d != null && d != "") {
1742         return JSON.parse(d);
1743     }
1744     return d;
1745 };
b2d3f7 1746 /**
P 1747  *
1748  * @param img
1749  * @param timeout
1750  * @param extra
1751  * @return {null|JSON} JSON对象
1752  */
bc5e1e 1753 OcrInst.prototype.ocrImage = function (img, timeout, extra) {
X 1754     if (img == null) {
1755         return null;
1756     }
1757     let bitmap = image.imageToBitmap(img)
1758     if (bitmap == null) {
1759         return null
1760     }
1761     let d = ocrWrapper.ocrBitmap(this.ocrUtil, bitmap, timeout, JSON.stringify(extra));
1762     if (bitmap != null) {
1763         bitmap.recycle();
1764         bitmap = null;
1765     }
1766     if (d != null && d != "") {
1767         return JSON.parse(d);
1768     }
1769     return d;
1770 };
1771
b2d3f7 1772 /**
P 1773  *
1774  * @param arr
1775  * @return {string|null}
1776  */
bc5e1e 1777 ImageWrapper.prototype.convertFirstColorArrayToString = function (arr) {
X 1778     if (arr) {
1779         if (typeof arr == "string") {
1780
1781             return arr;
1782         }
1783         if (arr[1] == null || arr[1].length <= 0 || "" == arr[1]) {
1784             return arr[0];
1785         }
1786         return arr[0] + "-" + arr[1];
1787     }
1788     return null;
1789 }
1790
b2d3f7 1791 /**
P 1792  *
1793  * @param arr
1794  * @return {string|null|*}
1795  */
bc5e1e 1796 ImageWrapper.prototype.convertMultiColorArrayToString = function (arr) {
X 1797     if (arr) {
1798         if (typeof arr == "string") {
1799             return arr;
1800         }
1801         //转换成类似的字符串 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
1802         let length = arr.length;
1803         let result = "";
1804         for (let i = 0; i < length; i = i + 4) {
1805             if (result.length > 0) {
1806                 result = result + ","
1807             }
1808             let p = arr[i + 3];
1809             if (p == null || p.length <= 0 || "" == p) {
1810                 result = result + arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2];
1811             } else {
1812                 result = result + arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2] + "-" + arr[i + 3];
1813             }
1814
1815         }
1816         return result;
1817     }
1818     return null;
1819 }
1820
b2d3f7 1821 /**
P 1822  *
1823  * @param arr
1824  * @return {string|null}
1825  */
bc5e1e 1826 ImageWrapper.prototype.convertFirstColorArrayToString2 = function (arr) {
X 1827     if (arr) {
1828         if (typeof arr == "string") {
1829             return arr;
1830         }
1831         //转换成类似的字符串 0x969696-0x000010,0x969696,0x969696
1832         let length = arr.length;
1833         let result = "";
1834         for (let i = 0; i < length; i = i + 2) {
1835             if (result.length > 0) {
1836                 result = result + ","
1837             }
1838             let p = arr[i + 1];
1839             if (p == null || p.length <= 0 || "" == p) {
1840                 result = result + arr[i];
1841             } else {
1842                 result = result + arr[i] + "-" + arr[i + 1];
1843             }
1844
1845         }
1846         return result;
1847     }
1848     return null;
1849 }
1850
b2d3f7 1851 /**
P 1852  *
1853  * @param arr
1854  * @return {string|null|string[]}
1855  */
bc5e1e 1856 ImageWrapper.prototype.convertMultiCmpColorArrayToString = function (arr) {
X 1857     if (arr) {
1858         if (typeof arr == "string") {
1859             return arr;
1860         }
1861         //转换成类似的字符串 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696
1862         let length = arr.length;
1863         let result = [];
1864         for (let i = 0; i < length; i = i + 4) {
1865             let p = arr[i + 3];
1866             if (p == null || p.length <= 0 || "" == p) {
1867                 let tmp = arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2];
1868                 result.push(tmp)
1869             } else {
1870                 let tmp = arr[i] + "|" + arr[i + 1] + "|" + arr[i + 2] + "-" + arr[i + 3];
1871                 result.push(tmp)
1872             }
1873         }
1874         return result;
1875     }
1876     return null;
1877 }
1878
1879 /**
1880  * 通过颜色找图,支持透明图,这个不需要处理话opencv
1881  * <p>
1882  * 整张图片都找不到时返回null
1883  * <Br/>
1884  * 运行环境: 无限制
1885  * <Br/>
1886  * 兼容版本: Android 5.0 以上
1887  * @param image1     大图片
1888  * @param template  小图片(模板)
1889  * @param x         找图区域 x 起始坐标
1890  * @param y         找图区域 y 起始坐标
1891  * @param ex 终点X坐标
1892  * @param ey 终点Y坐标
1893  * @param threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
1894  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
b2d3f7 1895  * @return {null|Point[]} 坐标点数组或者null
bc5e1e 1896  */
X 1897 ImageWrapper.prototype.findImageByColor = function (image1, template, x, y, ex, ey, threshold, limit) {
1898     if (imageWrapper == null || image1 == null || template == null) {
1899         return null;
1900     }
1901     let res = imageWrapper.findImageByColor(image1.uuid, template.uuid, x, y, ex - x, ey - y, threshold, limit);
1902     if (res == null || res == "") {
1903         return null;
1904     }
b2d3f7 1905     try {
P 1906         let d = JSON.parse(res);
1907         let x1 = [];
1908         for (let i = 0; i < d.length; i++) {
1909             x1.push(new Point(d[i]));
1910         }
1911         return x1;
1912     } catch (e) {
1913
bc5e1e 1914     }
b2d3f7 1915     return null;
P 1916
bc5e1e 1917 };
X 1918 /**
1919  * 通过颜色找图,支持透明图,这个不需要处理话opencv
1920  * <p>
1921  * 整张图片都找不到时返回null
1922  * @param image1     大图片
1923  * @param template  小图片(模板)
1924  * @param x         找图区域 x 起始坐标
1925  * @param y         找图区域 y 起始坐标
1926  * @param ex 终点X坐标
1927  * @param ey 终点Y坐标
1928  * @param limit 限制结果的数量,如果要找到1个,就填写1,如果是多个请填写多个
1929  * @param extra 扩展函数,map结构例如<Br/>
1930  * {"firstColorOffset":"#101010","firstColorThreshold":1.0,"firstColorOffset":"#101010","otherColorThreshold":0.9,"cmpColorSucThreshold":1.0}
1931  * <Br/>firstColorOffset: 第一个匹配到的颜色偏色,例如 #101010 <Br/>
1932  * firstColorThreshold: 第一个匹配到的颜色偏色系数,例如 0.9<Br/>
1933  * firstColorOffset: 剩下需要找的颜色 偏色,例如 #101010<Br/>
1934  * otherColorThreshold: 剩下需要找的颜色 偏色系数,例如 0.9<Br/>
1935  * cmpColorSucThreshold: 成功匹配多少个颜色系数 就认为是成功的,例如 0.9 = 90%个点<Br/>
1936  * startX: 第一个点从哪里开始找的X坐标<Br/>
1937  * startY: 第一个点从哪里开始找的Y坐标<Br/>
b2d3f7 1938  * @return {null|Point[]}  坐标点数组或者null
bc5e1e 1939  */
X 1940 ImageWrapper.prototype.findImageByColorEx = function (image1, template, x, y, ex, ey, limit, extra) {
1941     if (imageWrapper == null || image1 == null || template == null) {
1942         return;
1943     }
1944     if (extra) {
1945         extra = JSON.stringify(extra);
1946     }
1947     let res = imageWrapper.findImageByColorEx(image1.uuid, template.uuid, x, y, ex - x, ey - y, limit, extra);
1948     if (res == null || res == "") {
1949         return null;
1950     }
b2d3f7 1951     try {
P 1952         let d = JSON.parse(res);
1953         let x1 = [];
1954         for (let i = 0; i < d.length; i++) {
1955             x1.push(new Point(d[i]));
1956         }
1957         return x1;
1958     } catch (e) {
1959
bc5e1e 1960     }
b2d3f7 1961     return null;
P 1962
bc5e1e 1963 };
X 1964
1965 function Yolov8Wrapper() {
1966
1967 }
1968
1969 let yolov8Api = new Yolov8Wrapper();
1970
1971 function Yolov8Util(instance) {
1972     this.yolov8Instance = instance;
1973 }
1974
1975 /**
1976  * 获取YOLOV8错误消息
1977  * 适配EC 10.15.0+
b2d3f7 1978  * @return {string} 字符串
bc5e1e 1979  */
X 1980 Yolov8Util.prototype.getErrorMsg = function () {
1981     return ocrWrapper.getYolov8ErrorMsg(this.yolov8Instance);
1982 }
1983
1984 /**
1985  * 获取 yolov8 默认配置
1986  * 适配EC 10.15.0+
1987  * @param model_name 模型名称 默认写  yolov8s-640 即可
1988  * @param input_size yolov8训练时候的imgsz参数,默认写640即可
b2d3f7 1989  * @param box_thr 检测框系数,默认写0.25即可
bc5e1e 1990  * @param iou_thr 输出系数,,默认写0.35 即可
X 1991  * @param bind_cpu 是否绑定CPU,选项为ALL,BIG,LITTLE 三个,默认写ALL
1992  * @param use_vulkan_compute 是否启用硬件加速,1是,0否
1993  * @param obj_names JSON数组,训练的时候分类名称例如 ["star","common","face"]
b2d3f7 1994  * @return {JSON|null|*} 数据
bc5e1e 1995  */
X 1996 Yolov8Util.prototype.getDefaultConfig = function (model_name, input_size, box_thr, iou_thr, bind_cpu, use_vulkan_compute, obj_names) {
1997     if ((typeof obj_names) == "string") {
1998         obj_names = obj_names.split(",");
1999     }
2000     let data = {
2001         "name": "yolov8s-640",
2002         "input_size": 640,
2003         "box_thr": 0.25,
2004         "iou_thr": 0.35,
2005         "ver": 8,
2006         "bind_cpu": "ALL",
2007         "use_vulkan_compute": 0,
2008         "input_name": "in0",
2009         "names": [],
2010         "outputs": [
2011             {
2012                 "name": "out0",
2013                 "stride": 0,
2014                 "anchors": [
2015                     0,
2016                     0
2017                 ]
2018             }
2019         ]
2020     }
2021     data["name"] = model_name;
2022     data["names"] = obj_names;
2023     data["input_size"] = input_size;
2024     data["box_thr"] = box_thr;
b2d3f7 2025     data["num_thread"] = 4;
bc5e1e 2026     data["iou_thr"] = iou_thr;
X 2027     data["use_vulkan_compute"] = use_vulkan_compute;
2028     data["bind_cpu"] = bind_cpu;
2029     return data;
2030 }
2031
2032 /**
2033  * 初始化yolov8模型
2034  * 具体如何生成param和bin文件,请参考文件的yolo使用章节,通过yolo的pt转成ncnn的param、bin文件
2035  * 适配EC 10.15.0+
2036  * @param map 参数表 参考 getDefaultConfig函数获取默认的参数
2037  * @param paramPath param文件路径
2038  * @param binPath bin文件路径
b2d3f7 2039  * @return {boolean} true代表成功 false代表失败
bc5e1e 2040  */
X 2041 Yolov8Util.prototype.initYoloModel = function (map, paramPath, binPath) {
2042     if (map == null) {
2043         return false;
2044     }
2045     let data = JSON.stringify(map);
2046     return ocrWrapper.initYoloModel(this.yolov8Instance, data, paramPath, binPath);
2047 }
2048
2049 /**
2050  * 检测图片
2051  * 适配EC 10.15.0+
2052  * 返回数据例如
2053  * [{"name":"heart","confidence":0.92,"left":957,"top":986,"right":1050,"bottom":1078}]
2054  * name: 代表是分类,confidence:代表可信度,left,top,right,bottom代表结果坐标选框
2055  * @param bitmap 安卓的bitmap对象
2056  * @param obj_names JSON数组,不写代表不过滤,写了代表只取填写的分类
b2d3f7 2057  * @return {string|null} 字符串数据
bc5e1e 2058  */
X 2059 Yolov8Util.prototype.detectBitmap = function (bitmap, obj_names) {
2060     if (bitmap == null) {
2061         return null;
2062     }
2063     if (obj_names == null || obj_names == undefined) {
2064         obj_names = "[]"
2065     } else {
2066         obj_names = JSON.stringify(obj_names)
2067     }
2068     return ocrWrapper.detectBitmap(this.yolov8Instance, bitmap, obj_names);
2069 }
2070
b2d3f7 2071
P 2072 /**
2073  * 检测Image
2074  * 适配EC 10.16.0+
2075  * 返回数据例如
2076  * [{"name":"heart","confidence":0.92,"left":957,"top":986,"right":1050,"bottom":1078}]
2077  * name: 代表是分类,confidence:代表可信度,left,top,right,bottom代表结果坐标选框
2078  * @param img AutoImage对象
2079  * @param obj_names JSON数组,不写代表不过滤,写了代表只取填写的分类
2080  * @return {string|null} 字符串数据
2081  */
2082 Yolov8Util.prototype.detectImage = function (img, obj_names) {
2083     let bitmap = image.imageToBitmap(img)
2084     if (bitmap == null) {
2085         return null
2086     }
2087     if (obj_names == null || obj_names == undefined) {
2088         obj_names = "[]"
2089     } else {
2090         obj_names = JSON.stringify(obj_names)
2091     }
2092     let result = ocrWrapper.detectBitmap(this.yolov8Instance, bitmap, obj_names);
2093     if (bitmap != null) {
2094         try {
2095             bitmap.recycle();
2096         } catch (e) {
2097         }
2098         bitmap = null;
2099     }
2100     return result;
2101 }
2102
2103
bc5e1e 2104 /**
X 2105  * 释放yolov8资源
2106  * 适配EC 10.15.0+
b2d3f7 2107  * @return {boolean}
bc5e1e 2108  */
X 2109 Yolov8Util.prototype.release = function () {
2110     return ocrWrapper.releaseYolo(this.yolov8Instance);
2111 }
2112
2113 /**
2114  * 初始化yolov8实例
2115  * 适配EC 10.15.0+
b2d3f7 2116  * @return  {Yolov8Util} 实例对象
bc5e1e 2117  */
X 2118 Yolov8Wrapper.prototype.newYolov8 = function () {
2119     let instance = ocrWrapper.newYolov8();
2120     return new Yolov8Util(instance)
2121 }
2122
2123
2124