@microi.net/cli 4.6.2
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.
- package/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/mcp-codex-stdio-adapter.js +189 -0
- package/dist/mcp-server.js +972 -0
- package/dist/mcp-trae-windows-launcher.cmd +21 -0
- package/dist/microi-cli-mcp.js +7 -0
- package/dist/microi-cli.js +1645 -0
- package/dist/microi-skills.meta.json +335 -0
- package/dist/microi.skills/.microi-skills-version.json +6 -0
- package/dist/microi.skills/README.md +276 -0
- package/dist/microi.skills/ai-engine/SKILL.md +140 -0
- package/dist/microi.skills/ai-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/app-store/SKILL.md +105 -0
- package/dist/microi.skills/app-store/agents/openai.yaml +4 -0
- package/dist/microi.skills/business-blueprint/SKILL.md +184 -0
- package/dist/microi.skills/datasource-engine/SKILL.md +89 -0
- package/dist/microi.skills/datasource-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/dos-orm/SKILL.md +76 -0
- package/dist/microi.skills/dos-orm/references/api-reference.md +229 -0
- package/dist/microi.skills/job-engine/SKILL.md +141 -0
- package/dist/microi.skills/job-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/message-notification/SKILL.md +113 -0
- package/dist/microi.skills/message-notification/agents/openai.yaml +6 -0
- package/dist/microi.skills/message-notification/references/contracts.md +99 -0
- package/dist/microi.skills/microi-ai-app-auth.js +651 -0
- package/dist/microi.skills/microi-ai-application/SKILL.md +80 -0
- package/dist/microi.skills/microi-ai-application/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-ai-application/references/frontend-baseline.md +164 -0
- package/dist/microi.skills/microi-client-frontend/SKILL.md +562 -0
- package/dist/microi.skills/microi-datasource-mapping/SKILL.md +108 -0
- package/dist/microi.skills/microi-db-schema/SKILL.md +170 -0
- package/dist/microi.skills/microi-db-schema/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-db-schema/references/core-tables.md +695 -0
- package/dist/microi.skills/microi-db-schema/references/form-component-options.md +256 -0
- package/dist/microi.skills/microi-db-schema/references/schema-overview.md +203 -0
- package/dist/microi.skills/microi-db-schema/references/schema.md +647 -0
- package/dist/microi.skills/microi-db-schema/references/table-catalog.md +1607 -0
- package/dist/microi.skills/microi-deployment/SKILL.md +117 -0
- package/dist/microi.skills/microi-deployment/references/deployment-matrix.md +94 -0
- package/dist/microi.skills/microi-docs-coverage/SKILL.md +91 -0
- package/dist/microi.skills/microi-docs-coverage/references/capability-map.md +65 -0
- package/dist/microi.skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +887 -0
- package/dist/microi.skills/microi-form-engine/SKILL.md +159 -0
- package/dist/microi.skills/microi-form-engine/references/component-catalog.md +116 -0
- package/dist/microi.skills/microi-form-engine/references/data-source-events.md +117 -0
- package/dist/microi.skills/microi-form-layout/SKILL.md +373 -0
- package/dist/microi.skills/microi-frontend-sdk/SKILL.md +304 -0
- package/dist/microi.skills/microi-left-right-layout/SKILL.md +132 -0
- package/dist/microi.skills/microi-microservice/SKILL.md +115 -0
- package/dist/microi.skills/microi-microservice/references/runtime-delivery.md +145 -0
- package/dist/microi.skills/microi-mobile-app-quality/SKILL.md +436 -0
- package/dist/microi.skills/microi-solution-quotation/SKILL.md +76 -0
- package/dist/microi.skills/microi-solution-quotation/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -0
- package/dist/microi.skills/microi-system-delivery/SKILL.md +446 -0
- package/dist/microi.skills/microi-ui/SKILL.md +321 -0
- package/dist/microi.skills/microi-uniapp-frontend/SKILL.md +483 -0
- package/dist/microi.skills/microi.v8.js +1758 -0
- package/dist/microi.skills/module-engine/SKILL.md +131 -0
- package/dist/microi.skills/module-engine/references/module-config.md +174 -0
- package/dist/microi.skills/page-engine/SKILL.md +397 -0
- package/dist/microi.skills/performance-testing/SKILL.md +207 -0
- package/dist/microi.skills/playwright-e2e/SKILL.md +769 -0
- package/dist/microi.skills/print-engine/SKILL.md +237 -0
- package/dist/microi.skills/production-readonly-audit/SKILL.md +39 -0
- package/dist/microi.skills/report-engine/SKILL.md +69 -0
- package/dist/microi.skills/report-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/search-engine/SKILL.md +73 -0
- package/dist/microi.skills/search-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/spider-engine/SKILL.md +188 -0
- package/dist/microi.skills/translate-engine/SKILL.md +91 -0
- package/dist/microi.skills/translate-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/ui-design/SKILL.md +1575 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/app.js +54 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/index.html +163 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/styles.css +311 -0
- package/dist/microi.skills/ui-design/assets/templates/MCI-DESIGN.md +98 -0
- package/dist/microi.skills/ui-design/references/design-pattern-library.md +171 -0
- package/dist/microi.skills/ui-design/references/mci-design-contract.md +84 -0
- package/dist/microi.skills/ui-design/references/motion-and-media.md +71 -0
- package/dist/microi.skills/ui-design/references/product-flow-recipes.md +94 -0
- package/dist/microi.skills/uniapp-mall-assets/SKILL.md +105 -0
- package/dist/microi.skills/v8-api-config/SKILL.md +272 -0
- package/dist/microi.skills/v8-cache-pattern/SKILL.md +286 -0
- package/dist/microi.skills/v8-crud-api/SKILL.md +398 -0
- package/dist/microi.skills/v8-debugging/SKILL.md +279 -0
- package/dist/microi.skills/v8-explorer-tree/SKILL.md +224 -0
- package/dist/microi.skills/v8-export-import/SKILL.md +590 -0
- package/dist/microi.skills/v8-file-upload/SKILL.md +497 -0
- package/dist/microi.skills/v8-formengine-http/SKILL.md +218 -0
- package/dist/microi.skills/v8-frontend-events/SKILL.md +349 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print-api.md +107 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print.md +185 -0
- package/dist/microi.skills/v8-http-integration/SKILL.md +379 -0
- package/dist/microi.skills/v8-image-processing/SKILL.md +187 -0
- package/dist/microi.skills/v8-image-processing/agents/openai.yaml +4 -0
- package/dist/microi.skills/v8-image-processing/references/api-reference.md +620 -0
- package/dist/microi.skills/v8-menu-buttons/SKILL.md +661 -0
- package/dist/microi.skills/v8-mongodb/SKILL.md +149 -0
- package/dist/microi.skills/v8-mq-mqtt/SKILL.md +227 -0
- package/dist/microi.skills/v8-saas-multi-tenant/SKILL.md +193 -0
- package/dist/microi.skills/v8-security/SKILL.md +417 -0
- package/dist/microi.skills/v8-sql-query/SKILL.md +290 -0
- package/dist/microi.skills/v8-table-event/SKILL.md +385 -0
- package/dist/microi.skills/v8-template-engine/SKILL.md +165 -0
- package/dist/microi.skills/v8-utilities/SKILL.md +79 -0
- package/dist/microi.skills/v8-utilities/references/client-api-index.md +136 -0
- package/dist/microi.skills/v8-utilities/references/platform-http-routes.md +80 -0
- package/dist/microi.skills/v8-utilities/references/server-api-index.md +129 -0
- package/dist/microi.skills/v8-workflow/SKILL.md +322 -0
- package/dist/microi.skills/workspace-conventions/SKILL.md +479 -0
- package/package.json +40 -0
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
# V8.Image 完整 API 参考
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
1. [调用与返回约定](#调用与返回约定)
|
|
6
|
+
2. [图片来源](#图片来源)
|
|
7
|
+
3. [公共输出参数](#公共输出参数)
|
|
8
|
+
4. [方法总览](#方法总览)
|
|
9
|
+
5. [Create 生成图片](#create-生成图片)
|
|
10
|
+
6. [Merge 与 Overlay 合并图片](#merge-与-overlay-合并图片)
|
|
11
|
+
7. [Resize 调整尺寸](#resize-调整尺寸)
|
|
12
|
+
8. [Crop 裁剪](#crop-裁剪)
|
|
13
|
+
9. [Rotate 旋转](#rotate-旋转)
|
|
14
|
+
10. [Flip 翻转](#flip-翻转)
|
|
15
|
+
11. [Convert 格式转换](#convert-格式转换)
|
|
16
|
+
12. [Draw 绘制](#draw-绘制)
|
|
17
|
+
13. [Watermark 水印](#watermark-水印)
|
|
18
|
+
14. [CreateQRCode 生成二维码](#createqrcode-生成二维码)
|
|
19
|
+
15. [GetInfo 读取信息](#getinfo-读取信息)
|
|
20
|
+
16. [兼容别名](#兼容别名)
|
|
21
|
+
17. [颜色、格式与资源限制](#颜色格式与资源限制)
|
|
22
|
+
|
|
23
|
+
## 调用与返回约定
|
|
24
|
+
|
|
25
|
+
所有公开方法都接收一个参数对象。底层也兼容内容为 JSON 对象的字符串,但 V8 代码应优先直接传对象,并使用规范的 PascalCase 字段名。
|
|
26
|
+
|
|
27
|
+
处理成功时,除 `GetInfo` 外均返回:
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
{
|
|
31
|
+
Code: 1,
|
|
32
|
+
Data: {
|
|
33
|
+
FileName: 'image.png',
|
|
34
|
+
ContentType: 'image/png',
|
|
35
|
+
FileByteBase64: '<base64>',
|
|
36
|
+
Width: 800,
|
|
37
|
+
Height: 600,
|
|
38
|
+
Size: 12345,
|
|
39
|
+
Format: 'png'
|
|
40
|
+
},
|
|
41
|
+
Msg: ''
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
处理失败时返回 `Code: 0`,错误说明位于 `Msg`。任何调用链都必须先判断 `Code`:
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
var result = V8.Image.Resize(options);
|
|
49
|
+
if (result.Code !== 1) return result;
|
|
50
|
+
var nextBase64 = result.Data.FileByteBase64;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
如果接口引擎已开启“响应文件”,可直接 `return result`,由平台使用 `Data.FileName`、`Data.ContentType` 和 `Data.FileByteBase64` 返回文件。
|
|
54
|
+
|
|
55
|
+
## 图片来源
|
|
56
|
+
|
|
57
|
+
`V8.Image` 只读取内存数据,不读取本地路径,也不会主动访问 URL。
|
|
58
|
+
|
|
59
|
+
| 字段 | 类型 | 说明 |
|
|
60
|
+
|------|------|------|
|
|
61
|
+
| `FileByteBase64` | string | 推荐的纯 Base64 字符串 |
|
|
62
|
+
| `Base64` | string | `FileByteBase64` 的等价来源字段 |
|
|
63
|
+
| `DataUrl` | string | `data:image/png;base64,...` 形式;前缀会被剥离 |
|
|
64
|
+
| `Bytes` | byte[] | .NET 字节数组,例如 `V8.Http.GetResponse(...).RawBytes` |
|
|
65
|
+
| `FileName` | string | 可选来源元数据;不会代替输出层的 `FileName` |
|
|
66
|
+
|
|
67
|
+
单图方法支持三种对象结构:
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
// 顶层来源
|
|
71
|
+
V8.Image.Resize({ FileByteBase64: base64, Width: 400 });
|
|
72
|
+
|
|
73
|
+
// Image 嵌套来源
|
|
74
|
+
V8.Image.Resize({ Image: { DataUrl: dataUrl }, Width: 400 });
|
|
75
|
+
|
|
76
|
+
// Source 嵌套来源;Image/Source 也可直接写 Base64 或 Data URI 字符串
|
|
77
|
+
V8.Image.Resize({ Source: base64, Width: 400 });
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
合并方法的 `Images` / `Layers` 中,每项既可以是图层对象,也可以直接是 Base64 或 Data URI 字符串:
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
V8.Image.Merge({
|
|
84
|
+
Mode: 'horizontal',
|
|
85
|
+
Images: [
|
|
86
|
+
firstBase64,
|
|
87
|
+
{ DataUrl: secondDataUrl, Height: 300 }
|
|
88
|
+
]
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
远程图片必须先由业务代码下载。对可变 URL 做协议、域名、端口和目标地址白名单校验,防止 SSRF:
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
var response = V8.Http.GetResponse({ Url: trustedUrl });
|
|
96
|
+
var result = V8.Image.GetInfo({ Bytes: response.RawBytes });
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 公共输出参数
|
|
100
|
+
|
|
101
|
+
除 `GetInfo` 外,各方法均支持以下参数:
|
|
102
|
+
|
|
103
|
+
| 参数 | 默认值 | 说明 |
|
|
104
|
+
|------|--------|------|
|
|
105
|
+
| `OutputFormat` | 取 `Format` | 输出格式,支持 `png`、`jpeg` / `jpg`、`webp`、`bmp` |
|
|
106
|
+
| `Format` | `png` | 未设置 `OutputFormat` 时使用 |
|
|
107
|
+
| `Quality` | `90` | 编码质量;运行时限制到 `1` 至 `100` |
|
|
108
|
+
| `BackgroundColor` | PNG/WebP/BMP 为透明,JPEG 为白色 | 输出画布背景色 |
|
|
109
|
+
| `FileName` | `image.<扩展名>` | 输出文件名;路径部分会被移除,扩展名按真实格式修正 |
|
|
110
|
+
|
|
111
|
+
`OutputFormat` 优先级高于 `Format`。兼容别名包括 `ImageFormat`、`OutputType`、`Background`、`BgColor`。
|
|
112
|
+
|
|
113
|
+
## 方法总览
|
|
114
|
+
|
|
115
|
+
| 方法 | 作用 |
|
|
116
|
+
|------|------|
|
|
117
|
+
| `V8.Image.Create(param)` | 生成纯色、渐变、文字和基础图形图片 |
|
|
118
|
+
| `V8.Image.Merge(param)` | 横向、纵向、网格或覆盖合并 |
|
|
119
|
+
| `V8.Image.Overlay(param)` | 覆盖合并快捷方法;未传 `Mode` 时自动使用 `overlay` |
|
|
120
|
+
| `V8.Image.Resize(param)` | 按宽高和适配策略调整尺寸 |
|
|
121
|
+
| `V8.Image.Crop(param)` | 按矩形区域裁剪 |
|
|
122
|
+
| `V8.Image.Rotate(param)` | 旋转图片 |
|
|
123
|
+
| `V8.Image.Flip(param)` | 水平或垂直翻转 |
|
|
124
|
+
| `V8.Image.Convert(param)` | 转换编码格式 |
|
|
125
|
+
| `V8.Image.Draw(param)` | 在原图上绘制文字和图形 |
|
|
126
|
+
| `V8.Image.Watermark(param)` | 按锚点添加图片水印 |
|
|
127
|
+
| `V8.Image.CreateQRCode(param)` | 生成二维码 |
|
|
128
|
+
| `V8.Image.GetInfo(param)` | 读取图片元数据,不重新编码 |
|
|
129
|
+
|
|
130
|
+
## Create 生成图片
|
|
131
|
+
|
|
132
|
+
### 参数
|
|
133
|
+
|
|
134
|
+
| 参数 | 默认值 | 说明 |
|
|
135
|
+
|------|--------|------|
|
|
136
|
+
| `Width` / `Height` | `800` / `600` | 画布宽高 |
|
|
137
|
+
| `CanvasWidth` / `CanvasHeight` | 未设置 | 设置后分别覆盖 `Width` / `Height` |
|
|
138
|
+
| `BackgroundColor` | 透明或 JPEG 白色 | 起始背景色 |
|
|
139
|
+
| `BackgroundColorEnd` | 未设置 | 设置后启用线性渐变 |
|
|
140
|
+
| `GradientDirection` | `left-to-right` | `left-to-right`、`top-to-bottom` / `vertical` / `down`、`diagonal` / `top-left-to-bottom-right` |
|
|
141
|
+
| `Text` | 未设置 | 在画布中心追加一段快捷文字 |
|
|
142
|
+
| `TextColor` | `#111827` | 快捷文字颜色 |
|
|
143
|
+
| `FontSize` | `32` | 快捷文字字号 |
|
|
144
|
+
| `FontFamily` | 默认字体 | 快捷文字字体族 |
|
|
145
|
+
| `Elements` | 未设置 | 绘制元素列表,详见 [Draw 绘制](#draw-绘制) |
|
|
146
|
+
|
|
147
|
+
### 示例
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
var result = V8.Image.Create({
|
|
151
|
+
Width: 1200,
|
|
152
|
+
Height: 630,
|
|
153
|
+
BackgroundColor: '#2563eb',
|
|
154
|
+
BackgroundColorEnd: '#0f172a',
|
|
155
|
+
GradientDirection: 'diagonal',
|
|
156
|
+
Elements: [
|
|
157
|
+
{
|
|
158
|
+
Type: 'text',
|
|
159
|
+
X: 60,
|
|
160
|
+
Y: 80,
|
|
161
|
+
Text: 'Microi V8',
|
|
162
|
+
Color: '#ffffff',
|
|
163
|
+
FontSize: 56,
|
|
164
|
+
FontStyle: 'bold'
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
Type: 'round-rect',
|
|
168
|
+
X: 60,
|
|
169
|
+
Y: 150,
|
|
170
|
+
Width: 360,
|
|
171
|
+
Height: 80,
|
|
172
|
+
FillColor: 'rgba(255,255,255,0.18)',
|
|
173
|
+
CornerRadius: 18
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
FileName: 'cover.png'
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Merge 与 Overlay 合并图片
|
|
181
|
+
|
|
182
|
+
### 合并级参数
|
|
183
|
+
|
|
184
|
+
| 参数 | 默认值 | 说明 |
|
|
185
|
+
|------|--------|------|
|
|
186
|
+
| `Mode` | `horizontal` | `horizontal`、`vertical`、`grid`、`overlay` |
|
|
187
|
+
| `Layout` | 未设置 | 设置后优先于 `Mode`;支持模式及方向快捷值 |
|
|
188
|
+
| `Direction` | 横向 `ltr`,纵向 `ttb` | `ltr`、`rtl`、`ttb`、`btt` 及完整英文别名 |
|
|
189
|
+
| `Images` / `Layers` | 必填 | 一个或多个图层;最多 50 张 |
|
|
190
|
+
| `CanvasWidth` / `CanvasHeight` | 自动计算 | 强制输出画布尺寸 |
|
|
191
|
+
| `Padding` | `0` | 画布内边距;负数按 0 处理 |
|
|
192
|
+
| `Gap` | `0` | 非覆盖模式的图层间距;负数按 0 处理 |
|
|
193
|
+
| `Alignment` | `center` | 横向时控制上下对齐,纵向时控制左右对齐;网格时控制单元格内对齐 |
|
|
194
|
+
| `Columns` | 自动接近平方布局 | `grid` 的列数,运行时限制在 1 至图片数 |
|
|
195
|
+
|
|
196
|
+
### 模式、布局与方向
|
|
197
|
+
|
|
198
|
+
| 值 | 结果 |
|
|
199
|
+
|----|------|
|
|
200
|
+
| `horizontal` / `row` | 左右拼接 |
|
|
201
|
+
| `vertical` / `column` | 上下拼接 |
|
|
202
|
+
| `grid` | 网格拼接 |
|
|
203
|
+
| `overlay` / `canvas` / `cover` | 覆盖合并 |
|
|
204
|
+
| `Layout: 'right'` | 横向,从左到右 |
|
|
205
|
+
| `Layout: 'left'` | 横向,从右到左 |
|
|
206
|
+
| `Layout: 'bottom'` / `'down'` | 纵向,从上到下 |
|
|
207
|
+
| `Layout: 'top'` / `'up'` | 纵向,从下到上 |
|
|
208
|
+
|
|
209
|
+
`Direction` 还接受 `left-to-right`、`right-to-left`、`top-to-bottom`、`bottom-to-top`,以及 `right`、`left`、`down`、`up`。
|
|
210
|
+
|
|
211
|
+
对于非覆盖模式,`rtl` 或 `btt` 会反转图层排列顺序。覆盖模式始终按 `ZIndex` 从小到大绘制,`ZIndex` 相同时按原数组顺序绘制;后绘制的图层位于上方。
|
|
212
|
+
|
|
213
|
+
### 图层参数
|
|
214
|
+
|
|
215
|
+
| 参数 | 默认值 | 说明 |
|
|
216
|
+
|------|--------|------|
|
|
217
|
+
| 图片来源字段 | 必填 | `Bytes`、`FileByteBase64`、`Base64` 或 `DataUrl` |
|
|
218
|
+
| `Width` / `Height` | 原图尺寸 | 目标尺寸;只设一个维度时保持比例 |
|
|
219
|
+
| `Scale` | `1` | 在目标尺寸计算后再次缩放,必须大于 0 且不超过 100 |
|
|
220
|
+
| `Fit` | `contain` | 同时设置宽高时使用:`contain`、`cover`、`fill` / `stretch`、`none` |
|
|
221
|
+
| `X` / `Y` | 未设置 | 覆盖模式绝对坐标;只要设置其一,另一项默认使用 `Padding` |
|
|
222
|
+
| `Position` / `Anchor` | `top-left` | 未设置绝对坐标时的锚点;`Position` 优先 |
|
|
223
|
+
| `OffsetX` / `OffsetY` | `0` | 在坐标或锚点结果上追加偏移 |
|
|
224
|
+
| `Opacity` | `1` | 透明度,运行时限制到 0 至 1 |
|
|
225
|
+
| `Rotation` | `0` | 顺时针旋转角度;布局按旋转后的外接矩形计算 |
|
|
226
|
+
| `ZIndex` | `0` | 覆盖顺序;数值越大越靠上 |
|
|
227
|
+
| `FlipHorizontal` / `FlipVertical` | `false` | 水平或垂直翻转该图层 |
|
|
228
|
+
| `CropX` / `CropY` | `0` | 缩放前的源图裁剪起点 |
|
|
229
|
+
| `CropWidth` / `CropHeight` | 到源图边界 | 缩放前的源图裁剪尺寸 |
|
|
230
|
+
| `CornerRadius` | `0` | 圆角半径 |
|
|
231
|
+
| `BorderColor` / `BorderWidth` | 未设置 / `0` | 图层边框 |
|
|
232
|
+
| `BlendMode` | `src-over` | 图层混合模式 |
|
|
233
|
+
|
|
234
|
+
`Fit` 规则:
|
|
235
|
+
|
|
236
|
+
- `contain`:完整保留内容,在给定宽高范围内等比缩放;图层本身不会自动补齐空白到目标框。
|
|
237
|
+
- `cover`:等比缩放并从中心裁掉超出部分,最终严格使用指定宽高。
|
|
238
|
+
- `fill` / `stretch`:强制拉伸为指定宽高,可能改变比例。
|
|
239
|
+
- `none`:同时设置宽高时仍使用源图尺寸。
|
|
240
|
+
- 只设置 `Width` 或 `Height`:无论 `Fit` 值如何都保持比例。
|
|
241
|
+
|
|
242
|
+
常用锚点为 `top-left`、`top`、`top-right`、`left`、`center` / `middle`、`right`、`bottom-left`、`bottom`、`bottom-right`。兼容 `left-top`、`right-top`、`left-bottom`、`right-bottom` 和 `centre`。
|
|
243
|
+
|
|
244
|
+
混合模式支持 `src-over`、`multiply`、`screen`、`overlay`、`darken`、`lighten`、`plus` / `add`、`src`、`dst-over`;未知值回退为 `src-over`。
|
|
245
|
+
|
|
246
|
+
### 横向、纵向和网格示例
|
|
247
|
+
|
|
248
|
+
```javascript
|
|
249
|
+
var horizontal = V8.Image.Merge({
|
|
250
|
+
Mode: 'horizontal',
|
|
251
|
+
Direction: 'ltr',
|
|
252
|
+
Gap: 24,
|
|
253
|
+
Padding: 24,
|
|
254
|
+
Alignment: 'center',
|
|
255
|
+
BackgroundColor: '#f8fafc',
|
|
256
|
+
Images: [
|
|
257
|
+
{ FileByteBase64: first, Height: 320 },
|
|
258
|
+
{ FileByteBase64: second, Height: 320 }
|
|
259
|
+
]
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
var vertical = V8.Image.Merge({
|
|
263
|
+
Mode: 'vertical',
|
|
264
|
+
Direction: 'ttb',
|
|
265
|
+
Gap: 16,
|
|
266
|
+
Alignment: 'left',
|
|
267
|
+
Images: [first, second, third]
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
var grid = V8.Image.Merge({
|
|
271
|
+
Mode: 'grid',
|
|
272
|
+
Columns: 3,
|
|
273
|
+
Gap: 12,
|
|
274
|
+
Padding: 12,
|
|
275
|
+
Images: imageList
|
|
276
|
+
});
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### 覆盖示例
|
|
280
|
+
|
|
281
|
+
```javascript
|
|
282
|
+
var result = V8.Image.Overlay({
|
|
283
|
+
CanvasWidth: 1280,
|
|
284
|
+
CanvasHeight: 720,
|
|
285
|
+
BackgroundColor: '#ffffff',
|
|
286
|
+
Images: [
|
|
287
|
+
{
|
|
288
|
+
FileByteBase64: background,
|
|
289
|
+
Width: 1280,
|
|
290
|
+
Height: 720,
|
|
291
|
+
Fit: 'cover',
|
|
292
|
+
ZIndex: 0
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
FileByteBase64: foreground,
|
|
296
|
+
X: 920,
|
|
297
|
+
Y: 60,
|
|
298
|
+
Width: 260,
|
|
299
|
+
Opacity: 0.9,
|
|
300
|
+
Rotation: -6,
|
|
301
|
+
CornerRadius: 20,
|
|
302
|
+
BorderColor: '#ffffff',
|
|
303
|
+
BorderWidth: 4,
|
|
304
|
+
ZIndex: 10
|
|
305
|
+
}
|
|
306
|
+
],
|
|
307
|
+
FileName: 'overlay.png'
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
未设置 `CanvasWidth` / `CanvasHeight` 时,覆盖画布先按第一个图层和 `Padding` 计算;显式的正向 `X` / `Y` 可能扩大画布。锚点定位、负坐标和超出右下边界的内容不会自动保证全部可见,固定版式应显式设置画布。
|
|
312
|
+
|
|
313
|
+
### 双图快捷结构
|
|
314
|
+
|
|
315
|
+
`Merge` / `Overlay` 也兼容主图加覆盖图的简写:
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
var result = V8.Image.Overlay({
|
|
319
|
+
BaseImage: background,
|
|
320
|
+
OverlayImage: foreground,
|
|
321
|
+
X: 900,
|
|
322
|
+
Y: 80,
|
|
323
|
+
OverlayWidth: 240,
|
|
324
|
+
OverlayHeight: 120,
|
|
325
|
+
Opacity: 0.85,
|
|
326
|
+
Scale: 1,
|
|
327
|
+
FileName: 'result.png'
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
主图别名:`BaseImage`、`BackgroundImage`、`FirstImage`、`Base`。覆盖图别名:`OverlayImage`、`ForegroundImage`、`SecondImage`、`Overlay`。顶层 `X`、`Y`、`Position`、`Opacity`、`OverlayWidth`、`OverlayHeight`、`Scale` 会应用到第二张图,第二张图自动获得 `ZIndex: 1`。
|
|
332
|
+
|
|
333
|
+
## Resize 调整尺寸
|
|
334
|
+
|
|
335
|
+
| 参数 | 默认值 | 说明 |
|
|
336
|
+
|------|--------|------|
|
|
337
|
+
| 图片来源 | 必填 | 顶层或 `Image` / `Source` |
|
|
338
|
+
| `Width` / `Height` | 至少设置一个 | 目标宽高 |
|
|
339
|
+
| `Fit` | `contain` | 规则与合并图层一致 |
|
|
340
|
+
| `Pad` | `false` | 同时给出宽高后,是否保留完整目标画布并把图片按 `Alignment` 放入 |
|
|
341
|
+
| `AllowUpscale` | `true` | `false` 时避免把较小图片放大 |
|
|
342
|
+
| `Alignment` | `center` | `Pad: true` 时的画布内锚点 |
|
|
343
|
+
|
|
344
|
+
```javascript
|
|
345
|
+
var result = V8.Image.Resize({
|
|
346
|
+
Image: sourceBase64,
|
|
347
|
+
Width: 800,
|
|
348
|
+
Height: 600,
|
|
349
|
+
Fit: 'contain',
|
|
350
|
+
Pad: true,
|
|
351
|
+
Alignment: 'center',
|
|
352
|
+
BackgroundColor: '#ffffff',
|
|
353
|
+
OutputFormat: 'webp',
|
|
354
|
+
Quality: 85
|
|
355
|
+
});
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## Crop 裁剪
|
|
359
|
+
|
|
360
|
+
| 参数 | 默认值 | 说明 |
|
|
361
|
+
|------|--------|------|
|
|
362
|
+
| 图片来源 | 必填 | 顶层或 `Image` / `Source` |
|
|
363
|
+
| `X` / `Y` | `0` | 裁剪起点 |
|
|
364
|
+
| `Width` / `Height` | 必填且大于 0 | 裁剪尺寸 |
|
|
365
|
+
| `Clamp` | `false` | `true` 时把部分越界区域收缩到图片范围;无有效交集仍失败 |
|
|
366
|
+
|
|
367
|
+
```javascript
|
|
368
|
+
var result = V8.Image.Crop({
|
|
369
|
+
FileByteBase64: sourceBase64,
|
|
370
|
+
X: 100,
|
|
371
|
+
Y: 80,
|
|
372
|
+
Width: 640,
|
|
373
|
+
Height: 360,
|
|
374
|
+
Clamp: false
|
|
375
|
+
});
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Rotate 旋转
|
|
379
|
+
|
|
380
|
+
| 参数 | 默认值 | 说明 |
|
|
381
|
+
|------|--------|------|
|
|
382
|
+
| 图片来源 | 必填 | 顶层或 `Image` / `Source` |
|
|
383
|
+
| `Degrees` | `0` | 顺时针旋转角度,可为负数 |
|
|
384
|
+
| `Expand` | `true` | 是否扩展画布容纳旋转后外接矩形;`false` 可能裁掉边缘 |
|
|
385
|
+
|
|
386
|
+
```javascript
|
|
387
|
+
var result = V8.Image.Rotate({
|
|
388
|
+
Image: sourceBase64,
|
|
389
|
+
Degrees: 90,
|
|
390
|
+
Expand: true,
|
|
391
|
+
BackgroundColor: 'transparent'
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Flip 翻转
|
|
396
|
+
|
|
397
|
+
| 参数 | 默认值 | 说明 |
|
|
398
|
+
|------|--------|------|
|
|
399
|
+
| 图片来源 | 必填 | 顶层或 `Image` / `Source` |
|
|
400
|
+
| `Horizontal` | `true` | 水平翻转 |
|
|
401
|
+
| `Vertical` | `false` | 垂直翻转 |
|
|
402
|
+
|
|
403
|
+
```javascript
|
|
404
|
+
var result = V8.Image.Flip({
|
|
405
|
+
Image: sourceBase64,
|
|
406
|
+
Horizontal: false,
|
|
407
|
+
Vertical: true
|
|
408
|
+
});
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## Convert 格式转换
|
|
412
|
+
|
|
413
|
+
保留原图宽高,把静态画面重新编码为指定输出格式。
|
|
414
|
+
|
|
415
|
+
```javascript
|
|
416
|
+
var result = V8.Image.Convert({
|
|
417
|
+
Image: sourceBase64,
|
|
418
|
+
OutputFormat: 'jpeg',
|
|
419
|
+
Quality: 88,
|
|
420
|
+
BackgroundColor: '#ffffff',
|
|
421
|
+
FileName: 'converted.jpg'
|
|
422
|
+
});
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
透明图片转换为 JPEG 时,透明背景会使用不透明背景色;未设置时为白色。
|
|
426
|
+
|
|
427
|
+
## Draw 绘制
|
|
428
|
+
|
|
429
|
+
`Draw` 在输入图片上绘制 `Elements`,输出尺寸与输入相同。`Create` 也使用同一套元素结构。
|
|
430
|
+
|
|
431
|
+
### 元素通用参数
|
|
432
|
+
|
|
433
|
+
| 参数 | 默认值 | 说明 |
|
|
434
|
+
|------|--------|------|
|
|
435
|
+
| `Type` | `text` | 元素类型 |
|
|
436
|
+
| `X` / `Y` | `0` | 起点;文字按对齐方式解释 |
|
|
437
|
+
| `X2` / `Y2` | 未设置 | 线段终点;未设置时使用 `X + Width` / `Y + Height` |
|
|
438
|
+
| `Width` / `Height` | `0` | 图形尺寸,也用于旋转中心计算 |
|
|
439
|
+
| `Color` | `#111827` | 默认文字、填充和描边颜色 |
|
|
440
|
+
| `FillColor` | 取 `Color` | 图形填充色 |
|
|
441
|
+
| `StrokeColor` | 取 `Color` | 图形描边色 |
|
|
442
|
+
| `StrokeWidth` | `0` | 描边宽度;线段未设置时使用 1 像素 |
|
|
443
|
+
| `CornerRadius` | `0` | 矩形圆角 |
|
|
444
|
+
| `Opacity` | `1` | 透明度,运行时限制到 0 至 1 |
|
|
445
|
+
| `Rotation` | `0` | 顺时针旋转角度 |
|
|
446
|
+
|
|
447
|
+
### 元素类型
|
|
448
|
+
|
|
449
|
+
| 类型 | 专用参数 |
|
|
450
|
+
|------|----------|
|
|
451
|
+
| `text` | `Text`、`FontSize`、`FontFamily`、`FontStyle`、`Align`、`VerticalAlign` |
|
|
452
|
+
| `rectangle` / `rect` / `round-rect` | `Width`、`Height`、`CornerRadius` |
|
|
453
|
+
| `ellipse` / `circle` | `Width`、`Height` |
|
|
454
|
+
| `line` | `X2`、`Y2` 或 `Width`、`Height`,以及描边参数 |
|
|
455
|
+
|
|
456
|
+
文字默认 `FontSize: 24`、`FontStyle: 'normal'`、`Align: 'left'`、`VerticalAlign: 'top'`。`FontStyle` 可包含 `bold`、`italic` 或两者;水平对齐支持 `left`、`center` / `middle`、`right` / `end`,垂直对齐支持 `top`、`middle` / `center`、`bottom`。
|
|
457
|
+
|
|
458
|
+
`FontFamily` 表示首选字体。即使没有传入,或传入的字体族在服务器上不存在,运行时也会逐个 Unicode 字符检查实际字形,先回退到服务器已安装且包含该字形的字体,再回退到 `Dos.Common` 程序集内置的 Noto Sans CJK SC;同一段中英文混排文字可使用多个字体段。没有系统字体的 Linux / 群晖 / 精简容器仍可绘制基础拉丁字符、数字和简体中文。只有系统字体与内置字体都不包含某字符时,调用才返回包含字符和 `U+XXXX` 码位的明确错误,不会生成“口口”缺字方框。
|
|
459
|
+
|
|
460
|
+
单次最多绘制 500 个元素。
|
|
461
|
+
|
|
462
|
+
```javascript
|
|
463
|
+
var result = V8.Image.Draw({
|
|
464
|
+
Image: sourceBase64,
|
|
465
|
+
Elements: [
|
|
466
|
+
{
|
|
467
|
+
Type: 'text',
|
|
468
|
+
X: 40,
|
|
469
|
+
Y: 40,
|
|
470
|
+
Text: 'CONFIDENTIAL',
|
|
471
|
+
Color: 'rgba(239,68,68,0.75)',
|
|
472
|
+
FontSize: 36,
|
|
473
|
+
FontStyle: 'bold',
|
|
474
|
+
Rotation: -8
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
Type: 'line',
|
|
478
|
+
X: 40,
|
|
479
|
+
Y: 70,
|
|
480
|
+
X2: 360,
|
|
481
|
+
Y2: 70,
|
|
482
|
+
StrokeColor: '#ef4444',
|
|
483
|
+
StrokeWidth: 3
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
});
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## Watermark 水印
|
|
490
|
+
|
|
491
|
+
| 参数 | 默认值 | 说明 |
|
|
492
|
+
|------|--------|------|
|
|
493
|
+
| `BaseImage` / `Image` | 必填 | 主图;`BaseImage` 优先 |
|
|
494
|
+
| `Watermark` | 必填 | 水印图 |
|
|
495
|
+
| `Width` / `Height` | 水印原尺寸 | 水印目标尺寸 |
|
|
496
|
+
| `Scale` | `1` | 水印附加缩放比例 |
|
|
497
|
+
| `Position` | `bottom-right` | 水印锚点 |
|
|
498
|
+
| `Margin` | `10` | 根据锚点向内保留的边距 |
|
|
499
|
+
| `OffsetX` / `OffsetY` | `0` | 锚点定位后的附加偏移 |
|
|
500
|
+
| `Opacity` | `1` | 水印透明度 |
|
|
501
|
+
| `Rotation` | `0` | 水印旋转角度 |
|
|
502
|
+
|
|
503
|
+
```javascript
|
|
504
|
+
var result = V8.Image.Watermark({
|
|
505
|
+
BaseImage: sourceBase64,
|
|
506
|
+
Watermark: logoBase64,
|
|
507
|
+
Width: 180,
|
|
508
|
+
Position: 'bottom-right',
|
|
509
|
+
Margin: 24,
|
|
510
|
+
Opacity: 0.7,
|
|
511
|
+
FileName: 'watermarked.png'
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
## CreateQRCode 生成二维码
|
|
516
|
+
|
|
517
|
+
| 参数 | 默认值 | 说明 |
|
|
518
|
+
|------|--------|------|
|
|
519
|
+
| `Content` / `Text` | 必填 | 二维码内容;`Content` 优先 |
|
|
520
|
+
| `Size` | `300` | 正方形边长 |
|
|
521
|
+
|
|
522
|
+
```javascript
|
|
523
|
+
var result = V8.Image.CreateQRCode({
|
|
524
|
+
Content: 'https://microi.net/',
|
|
525
|
+
Size: 420,
|
|
526
|
+
OutputFormat: 'png',
|
|
527
|
+
FileName: 'qrcode.png'
|
|
528
|
+
});
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
## GetInfo 读取信息
|
|
532
|
+
|
|
533
|
+
参数使用任一图片来源形式。成功时 `Data` 为:
|
|
534
|
+
|
|
535
|
+
| 字段 | 说明 |
|
|
536
|
+
|------|------|
|
|
537
|
+
| `Width` / `Height` | 编码图片宽高 |
|
|
538
|
+
| `Format` | 检测到的原始编码格式 |
|
|
539
|
+
| `ContentType` | 对应 MIME 类型 |
|
|
540
|
+
| `Size` | 输入字节数 |
|
|
541
|
+
| `FrameCount` | 帧数 |
|
|
542
|
+
| `RepetitionCount` | 动画重复次数 |
|
|
543
|
+
| `Origin` | 编码方向信息 |
|
|
544
|
+
| `HasAlpha` | 是否包含 Alpha 通道 |
|
|
545
|
+
|
|
546
|
+
```javascript
|
|
547
|
+
var info = V8.Image.GetInfo({ Image: sourceBase64 });
|
|
548
|
+
if (info.Code !== 1) return info;
|
|
549
|
+
if (info.Data.Width < 800 || info.Data.Height < 600) {
|
|
550
|
+
return { Code: 0, Msg: '图片尺寸不能小于 800×600' };
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
`GetInfo` 可以报告多帧信息,但其它处理方法输出的是重新编码后的静态图片,不应把它们当作动画编辑 API。
|
|
555
|
+
|
|
556
|
+
## 兼容别名
|
|
557
|
+
|
|
558
|
+
字段名匹配不区分大小写,仍建议使用规范名称。
|
|
559
|
+
|
|
560
|
+
### 公共别名
|
|
561
|
+
|
|
562
|
+
| 别名 | 规范字段 |
|
|
563
|
+
|------|----------|
|
|
564
|
+
| `ImageFormat` / `OutputType` | `OutputFormat` |
|
|
565
|
+
| `Background` / `BgColor` | `BackgroundColor` |
|
|
566
|
+
| `ImageBase64` | 顶层 `FileByteBase64`(单图方法) |
|
|
567
|
+
|
|
568
|
+
### 合并别名
|
|
569
|
+
|
|
570
|
+
| 别名 | 规范字段 |
|
|
571
|
+
|------|----------|
|
|
572
|
+
| `MergeType` / `Type` | `Mode` |
|
|
573
|
+
| `Items` | `Images` |
|
|
574
|
+
| 图层 `Order` | `ZIndex` |
|
|
575
|
+
| 图层 `Alpha` | `Opacity` |
|
|
576
|
+
| 图层 `Rotate` | `Rotation` |
|
|
577
|
+
| 图层 `Left` / `Top` | `X` / `Y` |
|
|
578
|
+
|
|
579
|
+
图层对象还可通过嵌套的 `Image` 或 `Source` 提供图片来源;来源字段会展开到图层对象。
|
|
580
|
+
|
|
581
|
+
### 水印别名
|
|
582
|
+
|
|
583
|
+
| 别名 | 规范字段 |
|
|
584
|
+
|------|----------|
|
|
585
|
+
| `Base` | `BaseImage` |
|
|
586
|
+
| `Overlay` | `Watermark` |
|
|
587
|
+
|
|
588
|
+
## 颜色、格式与资源限制
|
|
589
|
+
|
|
590
|
+
### 颜色
|
|
591
|
+
|
|
592
|
+
支持:
|
|
593
|
+
|
|
594
|
+
- `transparent`、`white`、`black`、`red`、`green`、`blue`、`yellow`、`gray` / `grey`、`orange`、`purple`;
|
|
595
|
+
- `#RGB`、`#RGBA`、`#RRGGBB`、`#RRGGBBAA`;
|
|
596
|
+
- `rgb(r,g,b)`、`rgba(r,g,b,a)`,其中 Alpha 可用 0 至 1 或 0 至 255。
|
|
597
|
+
|
|
598
|
+
颜色自身的 Alpha 会与图层或元素的 `Opacity` 相乘,不会被覆盖。
|
|
599
|
+
|
|
600
|
+
### 输出格式
|
|
601
|
+
|
|
602
|
+
只支持 `png`、`jpeg` / `jpg`、`webp`、`bmp`。输入格式取决于当前 SkiaSharp 运行环境能否解码;可先用 `GetInfo` 验证。
|
|
603
|
+
|
|
604
|
+
### 内置限制
|
|
605
|
+
|
|
606
|
+
| 项目 | 限制 |
|
|
607
|
+
|------|------|
|
|
608
|
+
| 单次合并图片数 | 50 |
|
|
609
|
+
| 输入或输出单边 | 16,384 像素 |
|
|
610
|
+
| 单张输入或输出画布像素 | 25,000,000 |
|
|
611
|
+
| 单次解码总像素 | 50,000,000 |
|
|
612
|
+
| 单次缩放后图层总像素 | 50,000,000 |
|
|
613
|
+
| 单张输入文件 | 25 MB |
|
|
614
|
+
| 单次输入总量 | 100 MB |
|
|
615
|
+
| 输出文件 | 50 MB |
|
|
616
|
+
| 单次绘制元素 | 500 |
|
|
617
|
+
|
|
618
|
+
这些是运行时保护上限,不是业务推荐值。匿名接口、批量任务和高并发场景应配置更严格的业务限制,并控制并发,避免大量图片同时解码占用内存。
|
|
619
|
+
|
|
620
|
+
文字绘制优先使用操作系统字体,并以内置 Noto Sans CJK SC 保证零字体环境下的基础中英文可用性。运行时会对不存在的 `FontFamily` 和缺失字形逐字回退,并在系统字体与内置字体都确实没有字形时明确失败,绝不输出“口口”缺字方框。内置字体不承诺品牌字形、区域异体字、特殊符号和 Emoji;这些场景仍应安装业务字体并显式传 `FontFamily`,不要假设开发机字体在生产容器中存在。
|