ms-vite-plugin 1.4.11 → 1.4.13

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.
@@ -234,7 +234,7 @@ if (absNumberResults.length > 0) {
234
234
 
235
235
  #### findText
236
236
 
237
- 执行指定文本查找,在识别结果中查找特定的文本内容。使用全字匹配模式,确保精确匹配目标文本。
237
+ 执行指定文本查找,在识别结果中查找目标子串,并返回目标子串的坐标。
238
238
 
239
239
  ```typescript
240
240
  function findText(
@@ -245,6 +245,7 @@ function findText(
245
245
  ex?: number,
246
246
  ey?: number,
247
247
  languages?: string[],
248
+ exactMatch?: boolean,
248
249
  ): OCRResult[];
249
250
  ```
250
251
 
@@ -253,24 +254,27 @@ function findText(
253
254
  | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
254
255
  | ----------- | -------- | -------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
255
256
  | `input` | string | 是 | - | 输入源,支持以下类型: <br>-`"screen"` 当前屏幕截图 <br>- `string` 图片文件路径或 URL <br>- `imageId` 图片 ID(通过 image 模块获取) |
256
- | `texts` | string[] | 是 | - | 要查找的文本数组 |
257
+ | `texts` | string[] | 是 | - | 要查找的目标文本数组,支持匹配识别结果中的子串 |
257
258
  | `x` | number | 否 | - | 识别区域左上角 x 坐标 |
258
259
  | `y` | number | 否 | - | 识别区域左上角 y 坐标 |
259
260
  | `ex` | number | 否 | - | 识别区域右下角 x 坐标 |
260
261
  | `ey` | number | 否 | - | 识别区域右下角 y 坐标 |
261
262
  | `languages` | string[] | 否 | ["zh-Hans", "en-US"] | 可选,指定识别语言列表,如 ["zh-Hans", "en-US"] |
263
+ | `exactMatch` | boolean | 否 | false | 是否完整匹配;`false` 表示包含匹配,`true` 表示整条 OCR 识别结果文本必须等于目标文本 |
262
264
 
263
265
  **返回值:**
264
266
 
265
267
  | 类型 | 描述 |
266
268
  | ------------- | ---------------------- |
267
- | `OCRResult[]` | 匹配的文本识别结果数组 |
269
+ | `OCRResult[]` | 命中子串的文本识别结果数组 |
268
270
 
269
271
  **使用示例:**
270
272
 
271
273
  ```javascript
272
- // 识别屏幕中的文本
273
- const textResults = appleOcr.findText("screen", ["123", "456"], 0, 0, 100, 100);
274
+ // 在“开始执行”中查找“开始”,返回“开始”子串区域
275
+ const textResults = appleOcr.findText("screen", ["开始"], 0, 0, 100, 100);
276
+ // 不指定 languages 但启用完整匹配时,用 null 占位 languages
277
+ const exactResults = appleOcr.findText("screen", ["开始"], 0, 0, 100, 100, null, true);
274
278
  logi(`识别到 ${textResults.length} 个文本区域`);
275
279
  textResults.forEach((result, index) => {
276
280
  logi(`文本 ${index + 1}: ${result.text} (置信度: ${result.confidence})`);
@@ -281,7 +285,7 @@ textResults.forEach((result, index) => {
281
285
 
282
286
  #### findTextAbs
283
287
 
284
- 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标。
288
+ 查找目标子串,并将子串结果坐标映射为原图/全屏绝对坐标。
285
289
 
286
290
  参数与 `findText` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
287
291
 
@@ -294,13 +298,14 @@ function findTextAbs(
294
298
  ex?: number,
295
299
  ey?: number,
296
300
  languages?: string[],
301
+ exactMatch?: boolean,
297
302
  ): OCRResult[];
298
303
  ```
299
304
 
300
305
  **示例:**
301
306
 
302
307
  ```javascript
303
- const absHits = appleOcr.findTextAbs("screen", ["确定"], 100, 100, 500, 400);
308
+ const absHits = appleOcr.findTextAbs("screen", ["开始"], 100, 100, 500, 400);
304
309
  if (absHits.length > 0) {
305
310
  action.click(absHits[0].centerX, absHits[0].centerY);
306
311
  }
@@ -48,6 +48,20 @@ declare const __debug__: boolean;
48
48
  logi(`调试模式: ${__debug__}`);
49
49
  ```
50
50
 
51
+ #### **isRunning**
52
+
53
+ 当前脚本是否在运行。
54
+
55
+ ```typescript
56
+ declare const __isRunning__: boolean;
57
+ ```
58
+
59
+ **示例:**
60
+
61
+ ```javascript
62
+ logi(`运行状态: ${__isRunning__}`);
63
+ ```
64
+
51
65
  ### 应用信息
52
66
 
53
67
  #### **platform**
package/docs/api/image.md CHANGED
@@ -460,6 +460,58 @@ if (imageId) {
460
460
  }
461
461
  ```
462
462
 
463
+ ### countColor - 统计颜色数量
464
+
465
+ 统计指定区域内命中目标颜色的像素数量。`colors` 可以传入一个或多个候选颜色,多个颜色使用 `|` 分隔,支持 `主色-偏色` 格式,如 `#0A0A0A-#101010|#FFFFFF-#101010`。同一个像素同时命中多个候选颜色时只统计一次。
466
+
467
+ ```typescript
468
+ function countColor(
469
+ imageId: string,
470
+ colors: string,
471
+ threshold: number,
472
+ x: number,
473
+ y: number,
474
+ ex: number,
475
+ ey: number,
476
+ ): number;
477
+ ```
478
+
479
+ **参数:**
480
+
481
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
482
+ | ----------- | ------ | -------- | ------ | ------------------------------------------------------------------------------------ |
483
+ | `imageId` | string | 是 | - | 图片 ID,支持 `"screen"`、图片文件路径、HTTP 图片地址或已加载的图片 ID |
484
+ | `colors` | string | 是 | - | 颜色列表,支持 `主色-偏色\|主色-偏色` 格式,如 `#0A0A0A-#101010\|#FFFFFF-#101010` |
485
+ | `threshold` | number | 是 | - | 颜色匹配阈值 (0.0-1.0),数值越大匹配越严格 |
486
+ | `x, y` | number | 是 | - | 统计区域左上角坐标 |
487
+ | `ex, ey` | number | 是 | - | 统计区域右下角坐标;传 `0` 表示延伸到图片右侧或底部边界 |
488
+
489
+ **返回值:**
490
+
491
+ | 类型 | 描述 |
492
+ | -------- | ------------------------------------------------------------------------------------ |
493
+ | `number` | 命中目标颜色的像素数量;图片加载失败、颜色为空、颜色格式无效或区域不合法时返回 `0` |
494
+
495
+ **示例:**
496
+
497
+ ```javascript
498
+ const imageId = image.captureFullScreen();
499
+ if (imageId) {
500
+ const count = image.countColor(
501
+ imageId,
502
+ "#0A0A0A-#101010|#FFFFFF-#101010",
503
+ 0.92,
504
+ 100,
505
+ 200,
506
+ 500,
507
+ 700,
508
+ );
509
+
510
+ logi(`目标区域命中颜色像素数量: ${count}`);
511
+ image.release(imageId);
512
+ }
513
+ ```
514
+
463
515
  ### cmpColor - 多点比色
464
516
 
465
517
  ```typescript
@@ -201,6 +201,7 @@ function findText(
201
201
  ex?: number,
202
202
  ey?: number,
203
203
  confidenceThreshold?: number,
204
+ exactMatch?: boolean,
204
205
  ): OCRResult[];
205
206
  ```
206
207
 
@@ -215,6 +216,7 @@ function findText(
215
216
  | `ex` | number | 否 | 0 | 查找区域右下角 x 坐标 |
216
217
  | `ey` | number | 否 | 0 | 查找区域右下角 y 坐标 |
217
218
  | `confidenceThreshold` | number | 否 | 0.6 | 置信度阈值,默认值为 0.6 |
219
+ | `exactMatch` | boolean | 否 | false | 是否完整匹配;`false` 表示包含匹配,`true` 表示整条 OCR 识别结果文本必须等于目标文本 |
218
220
 
219
221
  **返回值:**
220
222
 
@@ -240,6 +242,7 @@ const hitResults = paddleOcr.findText(
240
242
  0,
241
243
  0,
242
244
  0.6,
245
+ false,
243
246
  );
244
247
  if (hitResults.length > 0) {
245
248
  hitResults.forEach((item, index) => {
@@ -269,13 +272,14 @@ function findTextAbs(
269
272
  ex?: number,
270
273
  ey?: number,
271
274
  confidenceThreshold?: number,
275
+ exactMatch?: boolean,
272
276
  ): OCRResult[];
273
277
  ```
274
278
 
275
279
  **示例:**
276
280
 
277
281
  ```javascript
278
- const absHits = paddleOcr.findTextAbs("screen", ["确定"], 100, 100, 500, 400, 0.6);
282
+ const absHits = paddleOcr.findTextAbs("screen", ["确定"], 100, 100, 500, 400, 0.6, false);
279
283
  if (absHits.length > 0) {
280
284
  action.click(absHits[0].centerX, absHits[0].centerY);
281
285
  }
package/docs/api/pip.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # 悬浮窗模块 (PIP)
2
2
 
3
- 悬浮窗模块提供画中画(Picture in Picture)日志窗口能力。
3
+ 悬浮窗模块提供 iOS 画中画(Picture in Picture)悬浮窗能力,可用于显示脚本日志、保活提示或脚本自定义文本。
4
4
 
5
5
  ## 功能特性
6
6
 
7
- - **模式切换**:切换日志、保活和关闭三种悬浮窗模式
7
+ - **显示模式**:支持日志、保活和自定义三种显示模式
8
+ - **关闭控制**:支持主动关闭悬浮窗
8
9
  - **状态查询**:判断悬浮窗是否正在显示
9
- - **识别标记**:日志窗口左上角默认显示高对比标记,可用于截图识别悬浮窗位置
10
+ - **尺寸设置**:日志模式和自定义模式支持设置内容宽高,并按模式分别持久化
11
+ - **自定义文本**:自定义模式支持文本、换行、文字颜色、背景色和文字大小
10
12
 
11
13
  ## API 方法
12
14
 
@@ -39,7 +41,7 @@ if (isActive) {
39
41
  function switchToLogMode(): boolean;
40
42
  ```
41
43
 
42
- 切换到日志模式并尝试显示悬浮窗日志窗口。首次显示悬浮窗时 App 必须在前台。
44
+ 切换到日志模式并尝试显示悬浮窗日志窗口。首次显示悬浮窗时 App 必须在前台。日志模式会恢复最近一次保存的日志窗口尺寸。
43
45
 
44
46
  **返回值:**
45
47
 
@@ -60,7 +62,7 @@ const success = pip.switchToLogMode();
60
62
  function switchToKeepAliveMode(): boolean;
61
63
  ```
62
64
 
63
- 切换到保活模式并尝试显示极小高度悬浮窗。首次显示悬浮窗时 App 必须在前台。
65
+ 切换到保活模式并尝试显示极小高度悬浮窗。首次显示悬浮窗时 App 必须在前台。保活模式不接受脚本尺寸设置。
64
66
 
65
67
  **返回值:**
66
68
 
@@ -75,13 +77,13 @@ takeMeToFront();
75
77
  const success = pip.switchToKeepAliveMode();
76
78
  ```
77
79
 
78
- ### switchToOffMode - 切换到关闭模式
80
+ ### switchToCustomMode - 切换到自定义模式
79
81
 
80
82
  ```typescript
81
- function switchToOffMode(): boolean;
83
+ function switchToCustomMode(): boolean;
82
84
  ```
83
85
 
84
- 切换到关闭模式并关闭悬浮窗。
86
+ 切换到自定义模式并显示脚本设置的自定义文本。首次显示悬浮窗时 App 必须在前台。自定义模式会恢复最近一次保存的自定义窗口尺寸。
85
87
 
86
88
  **返回值:**
87
89
 
@@ -92,22 +94,195 @@ function switchToOffMode(): boolean;
92
94
  **示例:**
93
95
 
94
96
  ```typescript
95
- const success = pip.switchToOffMode();
97
+ takeMeToFront();
98
+ pip.switchToCustomMode();
99
+ pip.setCustomText("运行中\n进度 1/3");
100
+ pip.setCustomTextColor("#34c759");
101
+ pip.setCustomTextSize(18);
102
+ ```
103
+
104
+ ### closeWindow - 关闭悬浮窗
105
+
106
+ ```typescript
107
+ function closeWindow(): boolean;
108
+ ```
109
+
110
+ 关闭悬浮窗。
111
+
112
+ **返回值:**
113
+
114
+ | 类型 | 描述 |
115
+ | --------- | ---------------------- |
116
+ | `boolean` | `true` 代表已提交请求 |
117
+
118
+ **示例:**
119
+
120
+ ```typescript
121
+ const success = pip.closeWindow();
122
+ ```
123
+
124
+ ### setContentSize - 设置内容尺寸
125
+
126
+ ```typescript
127
+ function setContentSize(width: number, height: number): boolean;
128
+ ```
129
+
130
+ 设置日志模式或自定义模式的悬浮窗内容尺寸。宽度和高度都必须传入有效数字。日志模式和自定义模式会分别保存尺寸;悬浮窗关闭状态和保活模式不会生效。
131
+
132
+ **参数:**
133
+
134
+ | 参数 | 类型 | 必填 | 描述 |
135
+ | -------- | ---------------- | ---- | ---------------------------------------------- |
136
+ | `width` | `number` | 是 | 目标内容宽度 |
137
+ | `height` | `number` | 是 | 目标内容高度 |
138
+
139
+ **返回值:**
140
+
141
+ | 类型 | 描述 |
142
+ | --------- | -------------------------------------------------------------------- |
143
+ | `boolean` | `true` 代表尺寸已提交;`false` 代表当前模式不允许设置或宽高无效 |
144
+
145
+ **示例:**
146
+
147
+ ```typescript
148
+ pip.switchToLogMode();
149
+ pip.setContentSize(280, 120);
150
+
151
+ pip.switchToCustomMode();
152
+ pip.setContentSize(120, 180);
153
+ ```
154
+
155
+ ### setCustomText - 设置自定义文本
156
+
157
+ ```typescript
158
+ function setCustomText(text: string): boolean;
159
+ ```
160
+
161
+ 设置自定义模式显示的纯文本内容。该方法只更新自定义文本数据,不会自动切换到自定义模式。
162
+
163
+ **参数:**
164
+
165
+ | 参数 | 类型 | 必填 | 描述 |
166
+ | ------ | -------- | ---- | ------------------------------------------- |
167
+ | `text` | `string` | 是 | 要显示的文本,支持真实换行和字符串中的 `\n` |
168
+
169
+ **返回值:**
170
+
171
+ | 类型 | 描述 |
172
+ | --------- | ---------------------- |
173
+ | `boolean` | `true` 代表文本已提交 |
174
+
175
+ **示例:**
176
+
177
+ ```typescript
178
+ pip.setCustomText("运行中\n进度 1/3");
179
+ pip.switchToCustomMode();
180
+ ```
181
+
182
+ ### setCustomTextColor - 设置自定义文字颜色
183
+
184
+ ```typescript
185
+ function setCustomTextColor(color: string): boolean;
186
+ ```
187
+
188
+ 设置自定义模式显示文本的文字颜色。该方法只更新文字颜色数据,不会自动切换到自定义模式。
189
+
190
+ **参数:**
191
+
192
+ | 参数 | 类型 | 必填 | 描述 |
193
+ | ------- | -------- | ---- | ----------------------------------------------------------- |
194
+ | `color` | `string` | 是 | 文字颜色,支持 `RRGGBB`、`RRGGBBAA`,可带 `#` 前缀;末尾 AA 为透明度;无效值使用白色 |
195
+
196
+ **返回值:**
197
+
198
+ | 类型 | 描述 |
199
+ | --------- | -------------------------- |
200
+ | `boolean` | `true` 代表文字颜色已提交 |
201
+
202
+ **示例:**
203
+
204
+ ```typescript
205
+ pip.setCustomTextColor("#34c759");
206
+ pip.switchToCustomMode();
207
+ ```
208
+
209
+ ### setCustomTextSize - 设置自定义文字大小
210
+
211
+ ```typescript
212
+ function setCustomTextSize(fontSize: number): boolean;
213
+ ```
214
+
215
+ 设置自定义模式显示文本的文字大小。该方法只更新文字大小数据,不会自动切换到自定义模式。
216
+
217
+ **参数:**
218
+
219
+ | 参数 | 类型 | 必填 | 描述 |
220
+ | ---------- | -------- | ---- | -------------------------- |
221
+ | `fontSize` | `number` | 是 | 文字字号,必须是有效数字 |
222
+
223
+ **返回值:**
224
+
225
+ | 类型 | 描述 |
226
+ | --------- | ------------------------------------------------------ |
227
+ | `boolean` | `true` 代表文字大小已提交;`false` 代表字号无效 |
228
+
229
+ **示例:**
230
+
231
+ ```typescript
232
+ pip.setCustomTextSize(18);
233
+ pip.switchToCustomMode();
234
+ ```
235
+
236
+ ### setCustomBackgroundColor - 设置自定义背景色
237
+
238
+ ```typescript
239
+ function setCustomBackgroundColor(color: string): boolean;
240
+ ```
241
+
242
+ 设置自定义模式显示区域的背景色。该方法只更新背景色数据,不会自动切换到自定义模式。
243
+
244
+ **参数:**
245
+
246
+ | 参数 | 类型 | 必填 | 描述 |
247
+ | ------- | -------- | ---- | ----------------------------------------------------------- |
248
+ | `color` | `string` | 是 | 背景颜色,支持 `RRGGBB`、`RRGGBBAA`,可带 `#` 前缀;末尾 AA 为透明度;无效值使用黑色 |
249
+
250
+ **返回值:**
251
+
252
+ | 类型 | 描述 |
253
+ | --------- | ------------------------ |
254
+ | `boolean` | `true` 代表背景色已提交 |
255
+
256
+ **示例:**
257
+
258
+ ```typescript
259
+ pip.setCustomBackgroundColor("#111111");
260
+ pip.switchToCustomMode();
96
261
  ```
97
262
 
98
263
  ## 完整使用示例
99
264
 
100
265
  ```typescript
101
266
  takeMeToFront();
267
+
102
268
  pip.switchToLogMode();
269
+ pip.setContentSize(280, 120);
270
+
271
+ pip.setCustomText("任务运行中\n1/3");
272
+ pip.setCustomTextColor("#34c759");
273
+ pip.setCustomTextSize(18);
274
+ pip.setCustomBackgroundColor("#111111");
275
+ pip.switchToCustomMode();
276
+ pip.setContentSize(120, 180);
103
277
  ```
104
278
 
105
279
  ## 注意事项
106
280
 
107
- 1. **前台限制**:首次切换到日志模式或保活模式并启动悬浮窗时,App 必须在前台;悬浮窗已启动后可以继续切换日志/保活模式
281
+ 1. **前台限制**:首次切换到日志、保活或自定义显示模式并启动悬浮窗时,App 必须在前台;悬浮窗已启动后可以继续切换显示模式或关闭悬浮窗
108
282
  2. **设备兼容性**:仅支持 iOS 15+ 且具备画中画功能的设备
109
283
  3. **系统限制**:悬浮窗位置和实际显示尺寸由 iOS 管理
110
- 4. **识别标记**:日志窗口左上角默认包含识别标记,便于通过截图识别悬浮窗位置
284
+ 4. **尺寸持久化**:日志模式和自定义模式分别保存尺寸,互不共用;保活模式不接受脚本尺寸
285
+ 5. **竖向文本**:自定义窗口高度大于宽度时,文本会按逐字符换行方式竖向显示
111
286
 
112
287
  ## 故障排除
113
288
 
@@ -116,3 +291,8 @@ pip.switchToLogMode();
116
291
  - 确认设备支持悬浮窗功能
117
292
  - 检查悬浮窗权限是否已开启
118
293
  - 确认应用当前在前台
294
+
295
+ ### setContentSize 返回 false
296
+
297
+ - 确认当前模式是日志模式或自定义模式
298
+ - 确认宽度和高度都传入了有效数字
@@ -234,7 +234,7 @@ if (绝对坐标数字结果.length > 0) {
234
234
 
235
235
  #### 查找文本
236
236
 
237
- 执行指定文本查找,在识别结果中查找特定的文本内容。使用全字匹配模式,确保精确匹配目标文本。
237
+ 执行指定文本查找,在识别结果中查找目标子串,并返回目标子串的坐标。
238
238
 
239
239
  ```typescript
240
240
  function 查找文本(
@@ -245,6 +245,7 @@ function 查找文本(
245
245
  图片边界框右下角x坐标?: 数字,
246
246
  图片边界框右下角y坐标?: 数字,
247
247
  识别语言数组?: 数组<字符串>,
248
+ 是否完整匹配?: 布尔值,
248
249
  ): 数组<OCR识别结果>;
249
250
  ```
250
251
 
@@ -253,24 +254,27 @@ function 查找文本(
253
254
  | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
254
255
  | ----------------------- | ------------ | -------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
255
256
  | `输入源` | string | 是 | - | 输入源,支持以下类型: <br>-`"screen"` 当前屏幕截图 <br>- `string` 图片文件路径或 URL <br>- `imageId` 图片 ID(通过 image 模块获取) |
256
- | `要查找的文本数组` | 数组<字符串> | 是 | - | 要查找的文本数组 |
257
+ | `要查找的文本数组` | 数组<字符串> | 是 | - | 要查找的目标文本数组,支持匹配识别结果中的子串 |
257
258
  | `图片边界框左上角x坐标` | number | 否 | - | 识别区域左上角 x 坐标 |
258
259
  | `图片边界框左上角y坐标` | number | 否 | - | 识别区域左上角 y 坐标 |
259
260
  | `图片边界框右下角x坐标` | number | 否 | - | 识别区域右下角 x 坐标 |
260
261
  | `图片边界框右下角y坐标` | number | 否 | - | 识别区域右下角 y 坐标 |
261
262
  | `识别语言数组` | 数组<字符串> | 否 | ["zh-Hans", "en-US"] | 可选,指定识别语言列表,如 ["zh-Hans", "en-US"] |
263
+ | `是否完整匹配` | boolean | 否 | false | 是否完整匹配;`false` 表示包含匹配,`true` 表示整条 OCR 识别结果文本必须等于目标文本 |
262
264
 
263
265
  **返回值:**
264
266
 
265
267
  | 类型 | 描述 |
266
268
  | ------------------- | ---------------------- |
267
- | `数组<OCR识别结果>` | 匹配的文本识别结果数组 |
269
+ | `数组<OCR识别结果>` | 命中子串的文本识别结果数组 |
268
270
 
269
271
  **使用示例:**
270
272
 
271
273
  ```javascript
272
- // 识别屏幕中的文本
273
- const 文本识别结果 = 查找文本("screen", ["123", "456"], 0, 0, 100, 100);
274
+ // 在“开始执行”中查找“开始”,返回“开始”子串区域
275
+ const 文本识别结果 = 查找文本("screen", ["开始"], 0, 0, 100, 100);
276
+ // 不指定识别语言但启用完整匹配时,用 null 占位识别语言数组
277
+ const 全字命中结果 = 查找文本("screen", ["开始"], 0, 0, 100, 100, null, true);
274
278
  $打印信息日志(`识别到 ${文本识别结果.length} 个文本区域`);
275
279
  文本识别结果.forEach((result, index) => {
276
280
  $打印信息日志(
@@ -285,7 +289,7 @@ $打印信息日志(`识别到 ${文本识别结果.length} 个文本区域`);
285
289
 
286
290
  #### 查找文本绝对坐标
287
291
 
288
- 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标。
292
+ 查找目标子串,并将子串结果坐标映射为原图/全屏绝对坐标。
289
293
 
290
294
  参数与 `查找文本` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
291
295
 
@@ -298,13 +302,14 @@ function 查找文本绝对坐标(
298
302
  图片边界框右下角x坐标?: 数字,
299
303
  图片边界框右下角y坐标?: 数字,
300
304
  识别语言数组?: 数组<字符串>,
305
+ 是否完整匹配?: 布尔值,
301
306
  ): 数组<OCR识别结果>;
302
307
  ```
303
308
 
304
309
  **示例:**
305
310
 
306
311
  ```javascript
307
- const 绝对坐标命中 = $苹果OCR.查找文本绝对坐标("screen", ["确定"], 100, 100, 500, 400);
312
+ const 绝对坐标命中 = $苹果OCR.查找文本绝对坐标("screen", ["开始"], 100, 100, 500, 400);
308
313
  if (绝对坐标命中.length > 0) {
309
314
  $点击(绝对坐标命中[0].centerX, 绝对坐标命中[0].centerY);
310
315
  }
@@ -50,6 +50,20 @@ declare const $是否调试: 布尔值;
50
50
  $打印信息日志($是否调试);
51
51
  ```
52
52
 
53
+ #### **$是否运行**
54
+
55
+ 当前脚本是否在运行。
56
+
57
+ ```typescript
58
+ declare const $是否运行: 布尔值;
59
+ ```
60
+
61
+ **示例:**
62
+
63
+ ```javascript
64
+ $打印信息日志(`运行状态: ${$是否运行}`);
65
+ ```
66
+
53
67
  ### 应用信息
54
68
 
55
69
  #### **$平台**
@@ -463,6 +463,60 @@ if (图片ID) {
463
463
  }
464
464
  ```
465
465
 
466
+ ### 统计颜色数量
467
+
468
+ 统计指定区域内命中目标颜色的像素数量。`颜色列表` 可以传入一个或多个候选颜色,多个颜色使用 `|` 分隔,支持 `主色-偏色` 格式,如 `#0A0A0A-#101010|#FFFFFF-#101010`。同一个像素同时命中多个候选颜色时只统计一次。
469
+
470
+ ```typescript
471
+ function 统计颜色数量(
472
+ 图片ID: 字符串,
473
+ 颜色列表: 字符串,
474
+ 阈值: 数字,
475
+ 区域左上角x: 数字,
476
+ 区域左上角y: 数字,
477
+ 区域右下角x: 数字,
478
+ 区域右下角y: 数字,
479
+ ): 数字;
480
+ ```
481
+
482
+ **参数:**
483
+
484
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
485
+ | ------------- | ------ | -------- | ------ | ------------------------------------------------------------------------------------- |
486
+ | `图片ID` | 字符串 | 是 | - | 图片 ID,支持 `"screen"`、图片文件路径、HTTP 图片地址或已加载的图片 ID |
487
+ | `颜色列表` | 字符串 | 是 | - | 颜色列表,支持 `主色-偏色\|主色-偏色` 格式,如 `#0A0A0A-#101010\|#FFFFFF-#101010` |
488
+ | `阈值` | 数字 | 是 | - | 颜色匹配阈值 (0.0-1.0),数值越大匹配越严格 |
489
+ | `区域左上角x` | 数字 | 是 | - | 统计区域左上角坐标 |
490
+ | `区域左上角y` | 数字 | 是 | - | 统计区域左上角坐标 |
491
+ | `区域右下角x` | 数字 | 是 | - | 统计区域右下角坐标;传 `0` 表示延伸到图片右侧边界 |
492
+ | `区域右下角y` | 数字 | 是 | - | 统计区域右下角坐标;传 `0` 表示延伸到图片底部边界 |
493
+
494
+ **返回值:**
495
+
496
+ | 类型 | 描述 |
497
+ | ------ | ------------------------------------------------------------------------------------ |
498
+ | `数字` | 命中目标颜色的像素数量;图片加载失败、颜色为空、颜色格式无效或区域不合法时返回 `0` |
499
+
500
+ **示例:**
501
+
502
+ ```javascript
503
+ const 图片ID = $图片.截取全屏();
504
+ if (图片ID) {
505
+ const 数量 = $图片.统计颜色数量(
506
+ 图片ID,
507
+ "#0A0A0A-#101010|#FFFFFF-#101010",
508
+ 0.92,
509
+ 100,
510
+ 200,
511
+ 500,
512
+ 700,
513
+ );
514
+
515
+ $打印信息日志(`目标区域命中颜色像素数量: ${数量}`);
516
+ $图片.释放图片(图片ID);
517
+ }
518
+ ```
519
+
466
520
  ### 多点比色
467
521
 
468
522
  ```typescript
@@ -202,6 +202,7 @@ function 查找文本(
202
202
  图片边界框右下角x坐标?: 数字,
203
203
  图片边界框右下角y坐标?: 数字,
204
204
  置信度阈值?: 数字,
205
+ 是否完整匹配?: 布尔值,
205
206
  ): 数组<OCR识别结果>;
206
207
  ```
207
208
 
@@ -216,6 +217,7 @@ function 查找文本(
216
217
  | `图片边界框右下角x坐标` | number | 否 | 0 | 查找区域右下角 x 坐标 |
217
218
  | `图片边界框右下角y坐标` | number | 否 | 0 | 查找区域右下角 y 坐标 |
218
219
  | `置信度阈值` | number | 否 | 0.6 | 置信度阈值,默认值为 0.6 |
220
+ | `是否完整匹配` | boolean | 否 | false | 是否完整匹配;`false` 表示包含匹配,`true` 表示整条 OCR 识别结果文本必须等于目标文本 |
219
221
 
220
222
  **返回值:**
221
223
 
@@ -242,6 +244,7 @@ const 命中结果 = $PaddleOCR.查找文本(
242
244
  0,
243
245
  0,
244
246
  0.6,
247
+ false,
245
248
  );
246
249
  if (命中结果.length > 0) {
247
250
  命中结果.forEach((item, index) => {
@@ -278,6 +281,7 @@ function 查找文本绝对坐标(
278
281
  图片边界框右下角x坐标?: 数字,
279
282
  图片边界框右下角y坐标?: 数字,
280
283
  置信度阈值?: 数字,
284
+ 是否完整匹配?: 布尔值,
281
285
  ): 数组<OCR识别结果>;
282
286
  ```
283
287