ms-vite-plugin 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/build.js +6 -0
  2. package/dist/cli.js +91 -1
  3. package/dist/mcp/device-config.d.ts +55 -0
  4. package/dist/mcp/device-config.js +183 -0
  5. package/dist/mcp/docs-service.d.ts +65 -0
  6. package/dist/mcp/docs-service.js +168 -0
  7. package/dist/mcp/project.d.ts +16 -0
  8. package/dist/mcp/project.js +74 -0
  9. package/dist/mcp/tools.d.ts +18 -0
  10. package/dist/mcp/tools.js +825 -0
  11. package/dist/mcp/types.d.ts +32 -0
  12. package/dist/mcp/types.js +11 -0
  13. package/dist/mcp-server.d.ts +2 -0
  14. package/dist/mcp-server.js +86 -0
  15. package/dist/project.d.ts +89 -0
  16. package/dist/project.js +306 -0
  17. package/dist/version.d.ts +12 -0
  18. package/dist/version.js +63 -0
  19. package/docs/api/action.md +922 -0
  20. package/docs/api/appleocr.md +229 -0
  21. package/docs/api/config.md +122 -0
  22. package/docs/api/cryptoUtils.md +232 -0
  23. package/docs/api/device.md +374 -0
  24. package/docs/api/file.md +516 -0
  25. package/docs/api/global.md +617 -0
  26. package/docs/api/hid.md +1032 -0
  27. package/docs/api/hotUpdate.md +166 -0
  28. package/docs/api/http.md +548 -0
  29. package/docs/api/image.md +907 -0
  30. package/docs/api/ime.md +290 -0
  31. package/docs/api/logger.md +324 -0
  32. package/docs/api/media.md +248 -0
  33. package/docs/api/mysql.md +441 -0
  34. package/docs/api/netCard.md +200 -0
  35. package/docs/api/node.md +353 -0
  36. package/docs/api/paddleocr.md +246 -0
  37. package/docs/api/pip.md +242 -0
  38. package/docs/api/system.md +572 -0
  39. package/docs/api/thread.md +269 -0
  40. package/docs/api/tomatoocr.md +425 -0
  41. package/docs/api/tts.md +334 -0
  42. package/docs/api/ui.md +947 -0
  43. package/docs/api/utils.md +265 -0
  44. package/docs/api/yolo.md +310 -0
  45. package/docs/apicn/action.md +919 -0
  46. package/docs/apicn/appleocr.md +233 -0
  47. package/docs/apicn/config.md +120 -0
  48. package/docs/apicn/device.md +385 -0
  49. package/docs/apicn/file.md +511 -0
  50. package/docs/apicn/global.md +613 -0
  51. package/docs/apicn/hid.md +1033 -0
  52. package/docs/apicn/hotUpdate.md +170 -0
  53. package/docs/apicn/http.md +672 -0
  54. package/docs/apicn/image.md +924 -0
  55. package/docs/apicn/ime.md +290 -0
  56. package/docs/apicn/logger.md +332 -0
  57. package/docs/apicn/media.md +252 -0
  58. package/docs/apicn/mysql.md +445 -0
  59. package/docs/apicn/netCard.md +200 -0
  60. package/docs/apicn/node.md +362 -0
  61. package/docs/apicn/paddleocr.md +255 -0
  62. package/docs/apicn/pip.md +242 -0
  63. package/docs/apicn/system.md +575 -0
  64. package/docs/apicn/thread.md +269 -0
  65. package/docs/apicn/tts.md +338 -0
  66. package/docs/apicn/ui.md +933 -0
  67. package/docs/apicn/utils.md +265 -0
  68. package/docs/apicn/yolo.md +314 -0
  69. package/docs/apipython/action.md +901 -0
  70. package/docs/apipython/appleocr.md +226 -0
  71. package/docs/apipython/config.md +126 -0
  72. package/docs/apipython/cryptoUtils.md +246 -0
  73. package/docs/apipython/device.md +365 -0
  74. package/docs/apipython/file.md +476 -0
  75. package/docs/apipython/g.md +154 -0
  76. package/docs/apipython/hid.md +1059 -0
  77. package/docs/apipython/hotUpdate.md +154 -0
  78. package/docs/apipython/image.md +938 -0
  79. package/docs/apipython/ime.md +306 -0
  80. package/docs/apipython/logger.md +330 -0
  81. package/docs/apipython/media.md +221 -0
  82. package/docs/apipython/mysql.md +432 -0
  83. package/docs/apipython/netCard.md +219 -0
  84. package/docs/apipython/node.md +331 -0
  85. package/docs/apipython/overview.md +66 -0
  86. package/docs/apipython/paddleocr.md +211 -0
  87. package/docs/apipython/pip.md +231 -0
  88. package/docs/apipython/system.md +458 -0
  89. package/docs/apipython/tomatoocr.md +444 -0
  90. package/docs/apipython/tts.md +331 -0
  91. package/docs/apipython/ui.md +949 -0
  92. package/docs/apipython/utils.md +284 -0
  93. package/docs/apipython/yolo.md +281 -0
  94. package/package.json +8 -4
@@ -0,0 +1,907 @@
1
+ # 图片模块 (Image)
2
+
3
+ 图片模块提供了强大的图像处理功能,包括截图、图像识别、模板匹配、颜色查找、图像变换等。
4
+
5
+ 注意所有的 `imageId` 都需要在使用后释放,否则会导致内存泄漏。
6
+
7
+ 所有传递`imageId`的函数都可以使用`"screen"`作为参数,来表示对当前屏幕进行操作。
8
+
9
+ `"screen"` 在设置为`Agent`模式,使用`快点Agent`截图,录屏模式使用录屏截图。
10
+
11
+ 所有传递`imageId`的函数都可以使用`"shortcut"`作为参数,来表示指定 HID 快捷指令截图
12
+
13
+ 所有传递`imageId`的函数都可以使用`"actionScreenshot"`作为参数,来表示指定 HID 快捷键系统截图
14
+
15
+ 所有传递`imageId`的函数都可以使用图片路径作为参数,来表示对指定图片进行操作,支持 res 目录文件,和手机文件路径。
16
+
17
+ ## 图片获取与管理
18
+
19
+ ### captureScreen - 截取屏幕。
20
+
21
+ ```typescript
22
+ function captureScreen(
23
+ x?: number,
24
+ y?: number,
25
+ ex?: number,
26
+ ey?: number,
27
+ ): string | null;
28
+ ```
29
+
30
+ **参数:**
31
+
32
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
33
+ | ------ | ------ | -------- | ------ | ----------------- |
34
+ | `x` | number | 否 | 0 | 区域左上角 X 坐标 |
35
+ | `y` | number | 否 | 0 | 区域左上角 Y 坐标 |
36
+ | `ex` | number | 否 | 0 | 区域右下角 X 坐标 |
37
+ | `ey` | number | 否 | 0 | 区域右下角 Y 坐标 |
38
+
39
+ **返回值:**
40
+
41
+ | 类型 | 描述 |
42
+ | -------- | -------------------------------- |
43
+ | `string` | 截图的图片 ID,失败时返回 `null` |
44
+
45
+ **示例:**
46
+
47
+ ```javascript
48
+ // 截取全屏
49
+ const imageId = image.captureScreen();
50
+ // 获取手机文档目录
51
+ const dir = file.getInternalDir("documents");
52
+ if (imageId) {
53
+ logi("截图成功");
54
+ image.saveTo(imageId, `${dir}/screenshot.jpg`);
55
+ image.release(imageId); // 记得释放内存
56
+ } else {
57
+ logi("截图失败");
58
+ }
59
+
60
+ // 截取指定区域
61
+ const imageId = image.captureScreen(100, 100, 200, 200);
62
+ // 获取手机文档目录
63
+ const dir = file.getInternalDir("documents");
64
+ if (imageId) {
65
+ logi("截图成功");
66
+ image.saveTo(imageId, `${dir}/screenshot.jpg`);
67
+ image.release(imageId); // 记得释放内存
68
+ } else {
69
+ logi("截图失败");
70
+ }
71
+ ```
72
+
73
+ ### captureFullScreen - 截取设备全屏。
74
+
75
+ ```typescript
76
+ function captureFullScreen(): string | null;
77
+ ```
78
+
79
+ **返回值:**
80
+
81
+ | 类型 | 描述 |
82
+ | -------- | -------------------------------- |
83
+ | `string` | 截图的图片 ID,失败时返回 `null` |
84
+
85
+ **示例:**
86
+
87
+ ```javascript
88
+ const imageId = image.captureFullScreen();
89
+ // 获取手机文档目录
90
+ const dir = file.getInternalDir("documents");
91
+ if (imageId) {
92
+ logi("截图成功");
93
+ image.saveTo(imageId, `${dir}/screenshot.jpg`);
94
+ image.release(imageId); // 记得释放内存
95
+ } else {
96
+ logi("截图失败");
97
+ }
98
+ ```
99
+
100
+ ### captureRect - 截取设备指定区域。
101
+
102
+ ```typescript
103
+ function captureRect(
104
+ x: number,
105
+ y: number,
106
+ ex: number,
107
+ ey: number,
108
+ ): string | null;
109
+ ```
110
+
111
+ **参数:**
112
+
113
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
114
+ | ------ | ------ | -------- | ------ | ----------------- |
115
+ | `x` | number | 是 | - | 区域左上角 X 坐标 |
116
+ | `y` | number | 是 | - | 区域左上角 Y 坐标 |
117
+ | `ex` | number | 是 | - | 区域右下角 X 坐标 |
118
+ | `ey` | number | 是 | - | 区域右下角 Y 坐标 |
119
+
120
+ **返回值:**
121
+
122
+ | 类型 | 描述 |
123
+ | -------- | -------------------------------- |
124
+ | `string` | 截图的图片 ID,失败时返回 `null` |
125
+
126
+ **示例:**
127
+
128
+ ```javascript
129
+ const imageId = image.captureRect(100, 100, 200, 200);
130
+ // 获取手机文档目录
131
+ const dir = file.getInternalDir("documents");
132
+ if (imageId) {
133
+ logi("截图成功");
134
+ image.saveTo(imageId, `${dir}/screenshot.jpg`);
135
+ image.release(imageId); // 记得释放内存
136
+ } else {
137
+ logi("截图失败");
138
+ }
139
+ ```
140
+
141
+ ### readImage - 从文件路径或imageId读取图片。
142
+
143
+ ```typescript
144
+ function readImage(path: string): string | null;
145
+ ```
146
+
147
+ **参数:**
148
+
149
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
150
+ | ------ | ------ | -------- | ------ | ----------------------------------------------------------------------- |
151
+ | `path` | string | 是 | - | 图片文件路径 支持 res 目录文件和手机文件绝对路径,支持特殊标识的imageId |
152
+
153
+ **返回值:**
154
+
155
+ | 类型 | 描述 |
156
+ | -------- | -------------------------- |
157
+ | `string` | 图片 ID,失败时返回 `null` |
158
+
159
+ **示例:**
160
+
161
+ ```javascript
162
+ const imageId = image.readImage("template.jpg");
163
+ if (imageId) {
164
+ logi("图片读取成功");
165
+ // 使用图片...
166
+ image.release(imageId);
167
+ } else {
168
+ logi("图片读取失败");
169
+ }
170
+ ```
171
+
172
+ ### saveTo - 保存图片到指定路径。
173
+
174
+ ```typescript
175
+ function saveTo(imageId: string, filePath: string): boolean;
176
+ ```
177
+
178
+ **参数:**
179
+
180
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
181
+ | ---------- | ------ | -------- | ------ | -------- |
182
+ | `imageId` | string | 是 | - | 图片 ID |
183
+ | `filePath` | string | 是 | - | 保存路径 |
184
+
185
+ **返回值:**
186
+
187
+ | 类型 | 描述 |
188
+ | --------- | ------------------------------------- |
189
+ | `boolean` | `true` 表示保存成功,`false` 表示失败 |
190
+
191
+ **示例:**
192
+
193
+ ```javascript
194
+ const imageId = image.captureFullScreen();
195
+ // 获取手机文档目录
196
+ const dir = file.getInternalDir("documents");
197
+ if (imageId) {
198
+ image.saveTo(imageId, `${dir}/screenshot.jpg`);
199
+ image.release(imageId);
200
+ }
201
+ ```
202
+
203
+ ## 内存管理
204
+
205
+ ### release - 释放单个图片的内存。
206
+
207
+ ```typescript
208
+ function release(imageId: string): void;
209
+ ```
210
+
211
+ **参数:**
212
+
213
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
214
+ | --------- | ------ | -------- | ------ | --------------- |
215
+ | `imageId` | string | 是 | - | 要释放的图片 ID |
216
+
217
+ ### releaseAll - 释放所有图片的内存。
218
+
219
+ ```typescript
220
+ function releaseAll(): void;
221
+ ```
222
+
223
+ ### isRelease - 检查图片是否已被释放。
224
+
225
+ ```typescript
226
+ function isRelease(imageId: string): boolean;
227
+ ```
228
+
229
+ **参数:**
230
+
231
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
232
+ | --------- | ------ | -------- | ------ | ------- |
233
+ | `imageId` | string | 是 | - | 图片 ID |
234
+
235
+ **返回值:**
236
+
237
+ | 类型 | 描述 |
238
+ | --------- | ------------------------------------- |
239
+ | `boolean` | `true` 表示已释放,`false` 表示未释放 |
240
+
241
+ **示例:**
242
+
243
+ ```javascript
244
+ const imageId = image.captureFullScreen();
245
+ if (imageId) {
246
+ logi(`释放前: ${image.isRelease(imageId)}`); // false
247
+ image.release(imageId);
248
+ logi(`释放后: ${image.isRelease(imageId)}`); // true
249
+ }
250
+ ```
251
+
252
+ ## 图片信息
253
+
254
+ ### getSize - 获取图片尺寸。
255
+
256
+ ```typescript
257
+ function getSize(imageId: string): { width: number; height: number } | null;
258
+ ```
259
+
260
+ **参数:**
261
+
262
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
263
+ | --------- | ------ | -------- | ------ | ------- |
264
+ | `imageId` | string | 是 | - | 图片 ID |
265
+
266
+ **返回值:**
267
+
268
+ | 类型 | 描述 |
269
+ | ---------------- | -------------------------------------------------------------- |
270
+ | `object \| null` | 图片尺寸对象,包含 `width` 和 `height` 属性,失败时返回 `null` |
271
+
272
+ **示例:**
273
+
274
+ ```javascript
275
+ const imageId = image.captureFullScreen();
276
+ if (imageId) {
277
+ const size = image.getSize(imageId);
278
+ if (size) {
279
+ logi(`图片尺寸: ${size.width} x ${size.height}`);
280
+ }
281
+ image.release(imageId);
282
+ }
283
+ ```
284
+
285
+ ### pixel - 获取图片指定坐标的像素颜色值。
286
+
287
+ ```typescript
288
+ function pixel(imageId: string, x: number, y: number): number;
289
+ ```
290
+
291
+ **参数:**
292
+
293
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
294
+ | --------- | ------ | -------- | ------ | ------- |
295
+ | `imageId` | string | 是 | - | 图片 ID |
296
+ | `x` | number | 是 | - | X 坐标 |
297
+ | `y` | number | 是 | - | Y 坐标 |
298
+
299
+ **返回值:**
300
+
301
+ | 类型 | 描述 |
302
+ | -------- | -------------- |
303
+ | `number` | 颜色值(整型) |
304
+
305
+ **示例:**
306
+
307
+ ```javascript
308
+ const imageId = image.captureFullScreen();
309
+ if (imageId) {
310
+ const color = image.pixel(imageId, 100, 100);
311
+ const colorHex = image.argb(color);
312
+ logi(`坐标 (100, 100) 的颜色: ${colorHex}`);
313
+ image.release(imageId);
314
+ }
315
+ ```
316
+
317
+ ### argb - 将整型颜色值转换为 16 进制 RGB 字符串。
318
+
319
+ ```typescript
320
+ function argb(color: number): string;
321
+ ```
322
+
323
+ **参数:**
324
+
325
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
326
+ | ------- | ------ | -------- | ------ | ---------- |
327
+ | `color` | number | 是 | - | 整型颜色值 |
328
+
329
+ **返回值:**
330
+
331
+ | 类型 | 描述 |
332
+ | -------- | ------------------ |
333
+ | `string` | 16 进制 RGB 字符串 |
334
+
335
+ ## 颜色识别
336
+
337
+ ### findColor - 单点找色
338
+
339
+ ```typescript
340
+ function findColor(
341
+ imageId: string,
342
+ color: string,
343
+ threshold: number,
344
+ x: number,
345
+ y: number,
346
+ ex: number,
347
+ ey: number,
348
+ limit: number,
349
+ orz: number,
350
+ ): { x: number; y: number }[];
351
+ ```
352
+
353
+ **参数:**
354
+
355
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
356
+ | ----------- | ------ | -------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
357
+ | `imageId` | string | 是 | - | 图片 ID |
358
+ | `color` | string | 是 | - | 颜色值,支持 "主色-偏色" 格式,如 "#6DD1E6-#101010" |
359
+ | `threshold` | number | 是 | - | 颜色匹配阈值 (0.0-1.0) |
360
+ | `x, y` | number | 是 | - | 搜索区域左上角坐标 |
361
+ | `ex, ey` | number | 是 | - | 搜索区域右下角坐标 |
362
+ | `limit` | number | 是 | - | 最大查找数量 |
363
+ | `orz` | number | 是 | - | 查找方向(1-8) 1 左上角到右下角,纵向开始 2 左上角到右下角,横向开始 3 右上角到左下角,横向开始 4 右上角到左下角,纵向开始 5 右下角到左上角,纵向开始 6 右下角到左上角,横向开始 7 左下角到右上角,横向开始 8 左下角到右上角,纵向开始 |
364
+
365
+ **返回值:**
366
+
367
+ | 类型 | 描述 |
368
+ | ------- | ---------------------------------------------- |
369
+ | `array` | 找到的颜色点数组,每个元素包含 `x` 和 `y` 属性 |
370
+
371
+ **示例:**
372
+
373
+ ```javascript
374
+ const imageId = image.captureFullScreen();
375
+ if (imageId) {
376
+ // 查找蓝色按钮
377
+ const points = image.findColor(
378
+ imageId,
379
+ "#1E90FF-#101010", // 蓝色,允许一定偏差
380
+ 0.9, // 阈值
381
+ 0,
382
+ 0, // 搜索区域左上角
383
+ 400,
384
+ 800, // 搜索区域右下角
385
+ 5, // 最多找 5 个
386
+ 1, // 从左到右查找
387
+ );
388
+
389
+ if (points.length > 0) {
390
+ logi(`找到 ${points.length} 个蓝色点`);
391
+ // 点击第一个找到的点
392
+ action.click(points[0].x, points[0].y, 100, false);
393
+ }
394
+
395
+ image.release(imageId);
396
+ }
397
+ ```
398
+
399
+ ### findMultiColor - 多点找色
400
+
401
+ ```typescript
402
+ function findMultiColor(
403
+ imageId: string,
404
+ firstColor: string,
405
+ threshold: number,
406
+ points: string,
407
+ x: number,
408
+ y: number,
409
+ ex: number,
410
+ ey: number,
411
+ limit: number,
412
+ orz: number,
413
+ ): { x: number; y: number }[];
414
+ ```
415
+
416
+ **参数:**
417
+
418
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
419
+ | ------------ | ------ | -------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
420
+ | `imageId` | string | 是 | - | 图片 ID |
421
+ | `firstColor` | string | 是 | - | 第一个颜色 |
422
+ | `threshold` | number | 是 | - | 颜色匹配阈值 (0.0-1.0) |
423
+ | `points` | string | 是 | - | 其他颜色点的相对位置和颜色,格式:`x1\|y1\|color1-偏色,x2\|y2\|color2-偏色` |
424
+ | `x, y` | number | 是 | - | 搜索区域左上角坐标 |
425
+ | `ex, ey` | number | 是 | - | 搜索区域右下角坐标 |
426
+ | `limit` | number | 是 | - | 最大查找数量 |
427
+ | `orz` | number | 是 | - | 查找方向(1-8) 1 左上角到右下角,纵向开始 2 左上角到右下角,横向开始 3 右上角到左下角,横向开始 4 右上角到左下角,纵向开始 5 右下角到左上角,纵向开始 6 右下角到左上角,横向开始 7 左下角到右上角,横向开始 8 左下角到右上角,纵向开始 |
428
+
429
+ **返回值:**
430
+
431
+ | 类型 | 描述 |
432
+ | ------- | ---------------------------------------------- |
433
+ | `array` | 找到的颜色点数组,每个元素包含 `x` 和 `y` 属性 |
434
+
435
+ **示例:**
436
+
437
+ ```javascript
438
+ const imageId = image.captureFullScreen();
439
+ if (imageId) {
440
+ // 查找特定的颜色组合(如按钮的特征颜色)
441
+ const points = image.findMultiColor(
442
+ imageId,
443
+ "#1E90FF-#101010", // 主颜色
444
+ 0.9, // 阈值
445
+ "10|0|#FFFFFF-#101010,20|0|#000000-#101010", // 相对位置的其他颜色
446
+ 0,
447
+ 0,
448
+ 400,
449
+ 800,
450
+ 1,
451
+ 1,
452
+ );
453
+
454
+ if (points.length > 0) {
455
+ logi("找到匹配的颜色组合");
456
+ action.click(points[0].x, points[0].y, 100, false);
457
+ }
458
+
459
+ image.release(imageId);
460
+ }
461
+ ```
462
+
463
+ ### cmpColor - 多点比色
464
+
465
+ ```typescript
466
+ function cmpColor(imageId: string, points: string, threshold: number): boolean;
467
+ ```
468
+
469
+ **参数:**
470
+
471
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
472
+ | ----------- | ------ | -------- | ------ | --------------------------------------------------------------------------- |
473
+ | `imageId` | string | 是 | - | 图片 ID |
474
+ | `points` | string | 是 | - | 其他颜色点的相对位置和颜色,格式:`x1\|y1\|color1-偏色,x2\|y2\|color2-偏色` |
475
+ | `threshold` | number | 是 | - | 颜色匹配阈值 (0.0-1.0) |
476
+
477
+ **返回值:**
478
+
479
+ | 类型 | 描述 |
480
+ | --------- | ------------------------------------------- |
481
+ | `boolean` | 如果颜色匹配则返回 `true`,否则返回 `false` |
482
+
483
+ **示例:**
484
+
485
+ ```javascript
486
+ const imageId = image.captureFullScreen();
487
+ if (imageId) {
488
+ // 检查特定区域是否为预期颜色
489
+ const isMatch = image.cmpColor(
490
+ imageId,
491
+ "1|2|#6DD1E6-#101010",
492
+ 0.9, // 阈值
493
+ );
494
+
495
+ if (isMatch) {
496
+ logi("颜色匹配");
497
+ }
498
+
499
+ image.release(imageId);
500
+ }
501
+ ```
502
+
503
+ ## 图像识别
504
+
505
+ ### findImage - 找图
506
+
507
+ ```typescript
508
+ function findImage(
509
+ imageId: string,
510
+ templateImageId: string,
511
+ x: number,
512
+ y: number,
513
+ ex: number,
514
+ ey: number,
515
+ threshold: number,
516
+ limit: number,
517
+ method: number,
518
+ rgb?: boolean,
519
+ options?: {
520
+ scaleFactors?: number[];
521
+ },
522
+ ): {
523
+ index: number; // 模板图片索引
524
+ x: number;
525
+ y: number;
526
+ width: number;
527
+ height: number;
528
+ confidence: number;
529
+ ex: number;
530
+ ey: number;
531
+ centerX: number;
532
+ centerY: number;
533
+ }[];
534
+ ```
535
+
536
+ **参数:**
537
+
538
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
539
+ | ---------------------- | --------- | -------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
540
+ | `imageId` | string | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取) |
541
+ | `templateImageId` | string | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取)支持按\|分割,多个图片按顺序查找 |
542
+ | `x, y` | number | 是 | - | 搜索区域左上角坐标 |
543
+ | `ex, ey` | number | 是 | - | 搜索区域右下角坐标 |
544
+ | `threshold` | number | 是 | - | 匹配阈值 (0.0-1.0) 全分辨率匹配时建议 0.5-0.6 其他建议 0.9-0.995 |
545
+ | `limit` | number | 是 | - | 最大查找数量,每个模板图片最多找 limit 个匹配结果 |
546
+ | `method` | number | 是 | - | 匹配方法 0 SIFT 全分辨率 1 TM_SQDIFF_NORMED 3 TM_CCORR_NORMED 5 TM_CCOEFF_NORMED 99 全分辨率缩放匹配法 |
547
+ | `rgb` | boolean | 否 | `false` | 是否使用 RGB 找图,默认 `false` 会自动转灰度找图 |
548
+ | `options` | object | 否 | - | 选项 |
549
+ | `options.scaleFactors` | number\[] | 否 | `[1.0, 0.9, 1.1, 0.8, 1.2]` | 缩放匹配法缩放因子数组,默认 `[1.0, 0.9, 1.1, 0.8, 1.2]` 会在这些缩放比例下进行匹配。 |
550
+
551
+ **返回值:**
552
+
553
+ | 类型 | 描述 |
554
+ | ------- | ------------------------------------------------------------------------------------------ |
555
+ | `array` | 找到的匹配结果数组,每个元素包含位置、尺寸和置信度,其中 index 代表模板图片的索引从 0 开始 |
556
+
557
+ **示例:**
558
+
559
+ ```javascript
560
+ const matches = image.findImage(
561
+ "screen",
562
+ "template.jpg|template2.jpg",
563
+ 0,
564
+ 0,
565
+ 400,
566
+ 800, // 搜索区域
567
+ 0.8, // 80% 匹配度
568
+ 3, // 最多找 3 个
569
+ 5, // 匹配方法
570
+ false, // 不使用 rgb 找图
571
+ );
572
+
573
+ if (matches.length > 0) {
574
+ const best = matches[0];
575
+ logi(`找到匹配,置信度: ${best.confidence}`);
576
+
577
+ // 点击匹配区域的中心
578
+ const centerX = best.centerX;
579
+ const centerY = best.centerY;
580
+ action.click(centerX, centerY, 100, false);
581
+ }
582
+ ```
583
+
584
+ ## 图像处理
585
+
586
+ ### clip - 裁剪图片。
587
+
588
+ ```typescript
589
+ function clip(
590
+ imageId: string,
591
+ x: number,
592
+ y: number,
593
+ ex: number,
594
+ ey: number,
595
+ ): string;
596
+ ```
597
+
598
+ **参数:**
599
+
600
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
601
+ | --------- | ------ | -------- | ------ | ------------------ |
602
+ | `imageId` | string | 是 | - | 原图片 ID |
603
+ | `x, y` | number | 是 | - | 裁剪区域左上角坐标 |
604
+ | `ex, ey` | number | 是 | - | 裁剪区域右下角坐标 |
605
+
606
+ **返回值:**
607
+
608
+ | 类型 | 描述 |
609
+ | -------- | ----------------- |
610
+ | `string` | 裁剪后的新图片 ID |
611
+
612
+ **示例:**
613
+
614
+ ```javascript
615
+ const imageId = image.captureFullScreen();
616
+ // 获取手机文档目录
617
+ const dir = file.getInternalDir("documents");
618
+ if (imageId) {
619
+ // 裁剪屏幕上半部分
620
+ const screen = device.getScreenRealSize();
621
+ const clippedId = image.clip(imageId, 0, 0, screen.width, screen.height / 2);
622
+
623
+ if (clippedId) {
624
+ image.saveTo(clippedId, `${dir}/top_half.jpg`);
625
+ image.release(clippedId);
626
+ }
627
+
628
+ image.release(imageId);
629
+ }
630
+ ```
631
+
632
+ ### rotateImage - 旋转图片。
633
+
634
+ ```typescript
635
+ function rotateImage(imageId: string, degree: number): string | null;
636
+ ```
637
+
638
+ **参数:**
639
+
640
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
641
+ | --------- | ------ | -------- | ------ | ----------------------------- |
642
+ | `imageId` | string | 是 | - | 原图片 ID |
643
+ | `degree` | number | 是 | - | 旋转角度,只能是 90、-90、180 |
644
+
645
+ **返回值:**
646
+
647
+ | 类型 | 描述 |
648
+ | ---------------- | ----------------------------------- |
649
+ | `string \| null` | 旋转后的新图片 ID 失败时返回 `null` |
650
+
651
+ **示例:**
652
+
653
+ ```typescript
654
+ const imageId = image.readImage("photo.jpg");
655
+ // 获取手机文档目录
656
+ const dir = file.getInternalDir("documents");
657
+ if (imageId) {
658
+ const rotatedId = image.rotateImage(imageId, 90);
659
+ if (rotatedId) {
660
+ image.saveTo(rotatedId, `${dir}/photo_rotated.jpg`);
661
+ image.release(rotatedId);
662
+ }
663
+ image.release(imageId);
664
+ }
665
+ ```
666
+
667
+ ### gray - 将图片转换为灰度图。
668
+
669
+ ```typescript
670
+ function gray(imageId: string): string;
671
+ ```
672
+
673
+ **参数:**
674
+
675
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
676
+ | --------- | ------ | -------- | ------ | --------- |
677
+ | `imageId` | string | 是 | - | 原图片 ID |
678
+
679
+ **返回值:**
680
+
681
+ | 类型 | 描述 |
682
+ | -------- | ------------------- |
683
+ | `string` | 灰度化后的新图片 ID |
684
+
685
+ **示例:**
686
+
687
+ ```javascript
688
+ const imageId = image.captureFullScreen();
689
+ // 获取手机文档目录
690
+ const dir = file.getInternalDir("documents");
691
+ if (imageId) {
692
+ const grayId = image.gray(imageId);
693
+ image.saveTo(grayId, `${dir}/screenshot_gray.jpg`);
694
+ image.release(grayId);
695
+ image.release(imageId);
696
+ }
697
+ ```
698
+
699
+ ### binaryzation - 将图片进行二值化处理。
700
+
701
+ ```typescript
702
+ function binaryzation(imageId: string, threshold: number): string;
703
+ ```
704
+
705
+ **参数:**
706
+
707
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
708
+ | ----------- | ------ | -------- | ------ | ---------------------- |
709
+ | `imageId` | string | 是 | - | 原图片 ID |
710
+ | `threshold` | number | 是 | - | 二值化阈值 (0.0-255.0) |
711
+
712
+ **返回值:**
713
+
714
+ | 类型 | 描述 |
715
+ | -------- | ------------------- |
716
+ | `string` | 二值化后的新图片 ID |
717
+
718
+ **示例:**
719
+
720
+ ```javascript
721
+ const imageId = image.captureFullScreen();
722
+ // 获取手机文档目录
723
+ const dir = file.getInternalDir("documents");
724
+ if (imageId) {
725
+ const binaryId = image.binaryzation(imageId, 128);
726
+ image.saveTo(binaryId, `${dir}/screenshot_binary.jpg`);
727
+ image.release(binaryId);
728
+ image.release(imageId);
729
+ }
730
+ ```
731
+
732
+ ### drawRect - 绘制矩形。
733
+
734
+ ```typescript
735
+ function drawRect(
736
+ imageId: string,
737
+ x: number,
738
+ y: number,
739
+ ex: number,
740
+ ey: number,
741
+ color: string,
742
+ thickness: number,
743
+ ): void;
744
+ ```
745
+
746
+ **参数:**
747
+
748
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
749
+ | ----------- | ------ | -------- | ------ | --------------------------- |
750
+ | `imageId` | string | 是 | - | 原图片 ID |
751
+ | `x, y` | number | 是 | - | 矩形左上角坐标 |
752
+ | `ex, ey` | number | 是 | - | 矩形右下角坐标 |
753
+ | `color` | string | 是 | - | 颜色,如 "#FF0000" 表示红色 |
754
+ | `thickness` | number | 是 | - | 线宽 |
755
+
756
+ **示例:**
757
+
758
+ ```javascript
759
+ // 获取手机文档目录
760
+ const dir = file.getInternalDir("documents");
761
+
762
+ const imageId = image.captureFullScreen();
763
+ if (imageId) {
764
+ image.drawRect(imageId, 100, 100, 200, 100, "#FF0000", 2);
765
+ image.saveTo(imageId, `${dir}/test.jpg`);
766
+ image.release(imageId);
767
+ }
768
+ ```
769
+
770
+ ### scanCode - 扫码条码(支持一维码和二维码)
771
+
772
+ ```typescript
773
+ function scanCode(imageId: string): string | null;
774
+ ```
775
+
776
+ **参数:**
777
+
778
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
779
+ | --------- | ------ | -------- | ------ | --------- |
780
+ | `imageId` | string | 是 | - | 原图片 ID |
781
+
782
+ **返回值:**
783
+
784
+ | 类型 | 描述 |
785
+ | ---------------- | --------------------------- |
786
+ | `string \| null` | 扫码结果,失败时返回 `null` |
787
+
788
+ **示例:**
789
+
790
+ ```javascript
791
+ const imageId = image.captureFullScreen();
792
+ if (imageId) {
793
+ const result = image.scanCode(imageId);
794
+ if (result) {
795
+ logi(`扫码结果: ${result}`);
796
+ } else {
797
+ logi("扫码失败");
798
+ }
799
+ image.release(imageId);
800
+ }
801
+ ```
802
+
803
+ ## Base64 转换
804
+
805
+ ### base64ToImage - 将 Base64 字符串转换为图片。
806
+
807
+ ```typescript
808
+ function base64ToImage(base64: string): string;
809
+ ```
810
+
811
+ **参数:**
812
+
813
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
814
+ | -------- | ------ | -------- | ------ | ------------- |
815
+ | `base64` | string | 是 | - | Base64 字符串 |
816
+
817
+ **返回值:**
818
+
819
+ | 类型 | 描述 |
820
+ | -------- | --------------- |
821
+ | `string` | 转换后的图片 ID |
822
+
823
+ **示例:**
824
+
825
+ ```javascript
826
+ const base64Data =
827
+ "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==";
828
+ const imageId = image.base64ToImage(base64Data);
829
+
830
+ // 获取手机文档目录
831
+ const dir = file.getInternalDir("documents");
832
+ if (imageId) {
833
+ image.saveTo(imageId, `${dir}/base64.jpg`);
834
+ image.release(imageId);
835
+ }
836
+ ```
837
+
838
+ ### toBase64Format - 将图片转换为 Base64 字符串。
839
+
840
+ ```typescript
841
+ function toBase64Format(imageId: string, format: string, q: number): string;
842
+ ```
843
+
844
+ **参数:**
845
+
846
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
847
+ | --------- | ------ | -------- | ------ | ------------------------------ |
848
+ | `imageId` | string | 是 | - | 原图片 ID |
849
+ | `format` | string | 是 | - | 图片格式(如 "jpg", "png") |
850
+ | `q` | number | 是 | - | 质量 (1-100),数字越大质量越高 |
851
+
852
+ **返回值:**
853
+
854
+ | 类型 | 描述 |
855
+ | -------- | ---------------------- |
856
+ | `string` | 转换后的 Base64 字符串 |
857
+
858
+ **示例:**
859
+
860
+ ```javascript
861
+ const imageId = image.captureFullScreen();
862
+ if (imageId) {
863
+ const base64 = image.toBase64Format(imageId, "jpg", 90);
864
+ logi(`Base64 数据: ${base64.substring(0, 100)}...`);
865
+ image.release(imageId);
866
+ }
867
+ ```
868
+
869
+ ## 安卓独有方法
870
+
871
+ ### getBitmap - 获取安卓的Bitmap对象
872
+
873
+ 此方法仅在安卓可用,用于获取图片的 Bitmap 对象。
874
+
875
+ ```typescript
876
+ function getBitmap(imageId: string): any;
877
+ ```
878
+
879
+ **参数:**
880
+
881
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
882
+ | --------- | ------ | -------- | ------ | --------- |
883
+ | `imageId` | string | 是 | - | 原图片 ID |
884
+
885
+ **返回值:**
886
+
887
+ | 类型 | 描述 |
888
+ | ----- | ---------------- |
889
+ | `any` | 安卓的Bitmap对象 |
890
+
891
+ **示例:**
892
+
893
+ ```javascript
894
+ const imageId = image.captureFullScreen();
895
+ if (imageId) {
896
+ const bitmap = image.getBitmap(imageId);
897
+ logi(`Bitmap 对象: ${bitmap}`);
898
+ // 注意:使用完 Bitmap 后,需要调用 recycle() 方法释放内存
899
+ bitmap.recycle();
900
+ image.release(imageId);
901
+ }
902
+
903
+ // 快捷获取截屏bitmap
904
+ const bitmap = image.getBitmap("screen");
905
+ logi(`Bitmap 对象: ${bitmap}`);
906
+ bitmap.recycle();
907
+ ```