@coralai/sps-cli 0.65.71 → 0.65.73

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 (80) hide show
  1. package/dist/commands/artCommand.d.ts +4 -0
  2. package/dist/commands/artCommand.d.ts.map +1 -0
  3. package/dist/commands/artCommand.js +277 -0
  4. package/dist/commands/artCommand.js.map +1 -0
  5. package/dist/console/lib/sessionConfig.d.ts +63 -0
  6. package/dist/console/lib/sessionConfig.d.ts.map +1 -0
  7. package/dist/console/lib/sessionConfig.js +204 -0
  8. package/dist/console/lib/sessionConfig.js.map +1 -0
  9. package/dist/console/routes/cards.d.ts.map +1 -1
  10. package/dist/console/routes/cards.js +17 -4
  11. package/dist/console/routes/cards.js.map +1 -1
  12. package/dist/console/routes/chat.d.ts.map +1 -1
  13. package/dist/console/routes/chat.js +98 -11
  14. package/dist/console/routes/chat.js.map +1 -1
  15. package/dist/console/routes/projectConfig.d.ts.map +1 -1
  16. package/dist/console/routes/projectConfig.js +146 -0
  17. package/dist/console/routes/projectConfig.js.map +1 -1
  18. package/dist/core/agents/projectAgentConfig.d.ts +11 -0
  19. package/dist/core/agents/projectAgentConfig.d.ts.map +1 -1
  20. package/dist/core/agents/projectAgentConfig.js +29 -2
  21. package/dist/core/agents/projectAgentConfig.js.map +1 -1
  22. package/dist/core/agents/readProjectAgent.d.ts +25 -0
  23. package/dist/core/agents/readProjectAgent.d.ts.map +1 -0
  24. package/dist/core/agents/readProjectAgent.js +67 -0
  25. package/dist/core/agents/readProjectAgent.js.map +1 -0
  26. package/dist/core/agents/writeProjectPersona.d.ts +24 -0
  27. package/dist/core/agents/writeProjectPersona.d.ts.map +1 -0
  28. package/dist/core/agents/writeProjectPersona.js +44 -0
  29. package/dist/core/agents/writeProjectPersona.js.map +1 -0
  30. package/dist/core/skills/distribution.d.ts +8 -0
  31. package/dist/core/skills/distribution.d.ts.map +1 -1
  32. package/dist/core/skills/distribution.js +18 -6
  33. package/dist/core/skills/distribution.js.map +1 -1
  34. package/dist/core/skills/ownership.d.ts +46 -0
  35. package/dist/core/skills/ownership.d.ts.map +1 -0
  36. package/dist/core/skills/ownership.js +63 -0
  37. package/dist/core/skills/ownership.js.map +1 -0
  38. package/dist/core/workspacePaths.d.ts +13 -0
  39. package/dist/core/workspacePaths.d.ts.map +1 -1
  40. package/dist/core/workspacePaths.js +16 -0
  41. package/dist/core/workspacePaths.js.map +1 -1
  42. package/dist/main.js +18 -1
  43. package/dist/main.js.map +1 -1
  44. package/dist/providers/RuntimeSessionRuntime.d.ts.map +1 -1
  45. package/dist/providers/RuntimeSessionRuntime.js +11 -0
  46. package/dist/providers/RuntimeSessionRuntime.js.map +1 -1
  47. package/dist/providers/art/atlas.d.ts +34 -0
  48. package/dist/providers/art/atlas.d.ts.map +1 -0
  49. package/dist/providers/art/atlas.js +71 -0
  50. package/dist/providers/art/atlas.js.map +1 -0
  51. package/dist/providers/art/frames.d.ts +43 -0
  52. package/dist/providers/art/frames.d.ts.map +1 -0
  53. package/dist/providers/art/frames.js +94 -0
  54. package/dist/providers/art/frames.js.map +1 -0
  55. package/dist/providers/art/pixels.d.ts +33 -0
  56. package/dist/providers/art/pixels.d.ts.map +1 -0
  57. package/dist/providers/art/pixels.js +431 -0
  58. package/dist/providers/art/pixels.js.map +1 -0
  59. package/dist/providers/art/sheet.d.ts +70 -0
  60. package/dist/providers/art/sheet.d.ts.map +1 -0
  61. package/dist/providers/art/sheet.js +312 -0
  62. package/dist/providers/art/sheet.js.map +1 -0
  63. package/dist/providers/llm/codexAuth.d.ts.map +1 -1
  64. package/dist/providers/llm/codexAuth.js +3 -0
  65. package/dist/providers/llm/codexAuth.js.map +1 -1
  66. package/dist/providers/media/mediaProviders.d.ts +15 -0
  67. package/dist/providers/media/mediaProviders.d.ts.map +1 -1
  68. package/dist/providers/media/mediaProviders.js +17 -0
  69. package/dist/providers/media/mediaProviders.js.map +1 -1
  70. package/dist/services/ChatService.d.ts +31 -0
  71. package/dist/services/ChatService.d.ts.map +1 -1
  72. package/dist/services/ChatService.js +22 -3
  73. package/dist/services/ChatService.js.map +1 -1
  74. package/dist/services/SkillService.d.ts +6 -0
  75. package/dist/services/SkillService.d.ts.map +1 -1
  76. package/dist/services/SkillService.js +3 -0
  77. package/dist/services/SkillService.js.map +1 -1
  78. package/package.json +3 -1
  79. package/skills/art-chain/SKILL.md +242 -0
  80. package/skills/registry.yaml +2 -0
@@ -0,0 +1,431 @@
1
+ // ⚠️ 机械抽取自 src/imageGen.ts:60-380(未改一字)。抽取命令见 README。
2
+ import sharp from 'sharp';
3
+ /**
4
+ * 判断图是否"背景已透明"(供自动流程跳过抠图)。看**四角**是否都近乎全透明——四角即背景区,
5
+ * 都透明=背景已抠掉。比"存在任一透明像素"准(后者部分抠图残留一点透明就误判透明)。
6
+ */
7
+ export async function alreadyTransparent(buf) {
8
+ try {
9
+ const meta = await sharp(buf).metadata();
10
+ if (!meta.hasAlpha)
11
+ return false;
12
+ const { data, info } = await sharp(buf).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
13
+ const W = info.width;
14
+ const H = info.height;
15
+ const ch = info.channels;
16
+ const a = (x, y) => data[(y * W + x) * ch + ch - 1];
17
+ return [a(0, 0), a(W - 1, 0), a(0, H - 1), a(W - 1, H - 1)].every((v) => v < 16);
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ /** 品红残留占比:不透明像素里"纯洋红系(s=min(R-G,B-G) ≥ 70)"的比例。chromaKey 是否干净的真判据。 */
24
+ export async function magentaResidue(buf) {
25
+ try {
26
+ const { data, info } = await sharp(buf).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
27
+ const ch = info.channels;
28
+ let opaque = 0, mag = 0;
29
+ for (let p = 0; p < data.length; p += ch) {
30
+ if (data[p + ch - 1] < 20)
31
+ continue;
32
+ opaque++;
33
+ if (Math.min(data[p] - data[p + 1], data[p + 2] - data[p + 1]) >= 70)
34
+ mag++;
35
+ }
36
+ return opaque ? mag / opaque : 0;
37
+ }
38
+ catch {
39
+ return 1; // 读图失败 → 视为有残留(保守走 rembg)
40
+ }
41
+ }
42
+ // rembg 抠图服务(独立 Python 服务,见 docs;默认本机 7000)。
43
+ const REMBG_URL = process.env.REMBG_URL || 'http://127.0.0.1:7000';
44
+ // isnet-general-use:通用显著物体分割,角色/物体/道具/水果都行(isnet-anime 只认动漫角色,
45
+ // 对葡萄等物体会整张删掉,故不用作默认)。可用 env 覆盖。
46
+ const REMBG_MODEL = process.env.REMBG_MODEL || 'isnet-general-use';
47
+ /**
48
+ * 调 rembg 服务抠图(REMBG_MODEL + alpha matting 软边)→ 返回透明 PNG。
49
+ * 服务不可用/出错则抛错,由上层 try/catch 保留原图(不崩)。
50
+ */
51
+ export async function rembgRemove(buf) {
52
+ const form = new FormData();
53
+ // 🔴 仅**类型**适配(本仓 TS 更严:Buffer<ArrayBufferLike> 不满足 BlobPart)。
54
+ // 运行时字节完全一致 —— **不是行为改动**。算法其余部分按只读对待。
55
+ form.append('file', new Blob([new Uint8Array(buf)], { type: 'image/png' }), 'in.png');
56
+ form.append('model', REMBG_MODEL);
57
+ form.append('a', 'true'); // alpha matting:边缘更干净
58
+ const res = await fetch(`${REMBG_URL}/api/remove`, { method: 'POST', body: form, signal: AbortSignal.timeout(60_000) });
59
+ if (!res.ok)
60
+ throw new Error(`rembg 抠图服务 HTTP ${res.status}`);
61
+ return cleanAlpha(Buffer.from(await res.arrayBuffer())); // 清边缘残留 halo,抠得更干净
62
+ }
63
+ /** alpha 清理:把极淡残留(≤lo)压成全透、近实(≥hi)压成全实、中间线性留薄软边。
64
+ * rembg/抠图常在边缘留一圈半透明 halo / 底色边纹 → "抠不干净";这步确定性消掉它,保留细软边。 */
65
+ export async function cleanAlpha(buf, lo = 30, hi = 200) {
66
+ try {
67
+ const { data, info } = await sharp(buf).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
68
+ const ch = info.channels; // 4
69
+ const span = Math.max(1, hi - lo);
70
+ for (let i = 0; i < data.length; i += ch) {
71
+ const a = data[i + 3];
72
+ data[i + 3] = a <= lo ? 0 : a >= hi ? 255 : Math.round(((a - lo) / span) * 255);
73
+ }
74
+ return await sharp(data, { raw: { width: info.width, height: info.height, channels: ch } }).png().toBuffer();
75
+ }
76
+ catch {
77
+ return buf; // 清理失败 → 用原结果
78
+ }
79
+ }
80
+ /** 抠图后处理三连(参考 agentbrush 的 halo-cleanup 思路 + 游戏资产标准 alpha-bleeding):
81
+ * ① 去晕环:紧贴透明区的【不透明边界环】(flood-fill 没覆盖的 s<S_LO 粉边像素)按环距递减把 R/B 拉向 G,消 1~3px 洋红晕;
82
+ * ② RGB 外溢(alpha-bleeding):把边缘不透明像素的 RGB 逐环扩散进透明区 4 环——Phaser/WebGL 双线性过滤会采到
83
+ * 透明邻居的 RGB(alpha=0 也渗),不清洗就在游戏里渗粉边;扩散后透明区颜色≈邻近主体色,采样无害;
84
+ * ③ alpha 边缘空间平滑:仅对透明/不透明交界像素做一次 3×3 alpha 均值,平掉"按色相羽化"留下的锯齿。
85
+ * 顺序必须 ①→②→③:先洗净边界色,再外溢干净色,平滑时新增半透明像素已具正确 RGB。 */
86
+ export function cutoutPostProcess(data, W, H, ch) {
87
+ const N = W * H;
88
+ const A = (i) => data[i * ch + 3];
89
+ const RINGS = 4;
90
+ // 不透明像素距透明区的环距(0=透明自身;1..RINGS;255=更远)
91
+ const ring = new Uint8Array(N).fill(255);
92
+ let frontier = [];
93
+ for (let i = 0; i < N; i++)
94
+ if (A(i) === 0) {
95
+ ring[i] = 0;
96
+ frontier.push(i);
97
+ }
98
+ if (frontier.length === 0 || frontier.length === N)
99
+ return; // 无透明/全透明:不适用
100
+ for (let k = 1; k <= RINGS; k++) {
101
+ const next = [];
102
+ for (const idx of frontier) {
103
+ const x = idx % W, y = (idx / W) | 0;
104
+ const nb = [x > 0 ? idx - 1 : -1, x < W - 1 ? idx + 1 : -1, y > 0 ? idx - W : -1, y < H - 1 ? idx + W : -1];
105
+ for (const n of nb)
106
+ if (n >= 0 && ring[n] === 255 && A(n) > 0) {
107
+ ring[n] = k;
108
+ next.push(n);
109
+ }
110
+ }
111
+ frontier = next;
112
+ }
113
+ // ① 去晕环:1~3 环内仍带洋红色相(R、B 同高于 G)的像素,按环距把 R/B 拉回向 G
114
+ for (let i = 0; i < N; i++) {
115
+ const k = ring[i];
116
+ if (k < 1 || k > 3)
117
+ continue;
118
+ const p = i * ch, g = data[p + 1];
119
+ const keep = 0.25 + 0.25 * (k - 1); // 第1环留 25% 溢色 → 第3环留 75%(渐变防生硬)
120
+ if (data[p] > g)
121
+ data[p] = Math.round(g + (data[p] - g) * keep);
122
+ if (data[p + 2] > g)
123
+ data[p + 2] = Math.round(g + (data[p + 2] - g) * keep);
124
+ }
125
+ // ② alpha-bleeding:透明像素按"距不透明区环距"逐层取上一层邻居 RGB 均值
126
+ const tRing = new Uint8Array(N).fill(255); // 透明像素距不透明区的环距;不透明=0
127
+ frontier = [];
128
+ for (let i = 0; i < N; i++)
129
+ if (A(i) > 0) {
130
+ tRing[i] = 0;
131
+ frontier.push(i);
132
+ }
133
+ for (let k = 1; k <= RINGS; k++) {
134
+ const next = [];
135
+ for (const idx of frontier) {
136
+ const x = idx % W, y = (idx / W) | 0;
137
+ const nb = [x > 0 ? idx - 1 : -1, x < W - 1 ? idx + 1 : -1, y > 0 ? idx - W : -1, y < H - 1 ? idx + W : -1];
138
+ for (const n of nb) {
139
+ if (n < 0 || tRing[n] !== 255)
140
+ continue;
141
+ const nx = n % W, ny = (n / W) | 0;
142
+ const nn = [nx > 0 ? n - 1 : -1, nx < W - 1 ? n + 1 : -1, ny > 0 ? n - W : -1, ny < H - 1 ? n + W : -1];
143
+ let r = 0, gg = 0, b = 0, c = 0;
144
+ for (const m of nn)
145
+ if (m >= 0 && tRing[m] === k - 1) {
146
+ const q = m * ch;
147
+ r += data[q];
148
+ gg += data[q + 1];
149
+ b += data[q + 2];
150
+ c++;
151
+ }
152
+ if (!c)
153
+ continue;
154
+ const q = n * ch;
155
+ data[q] = Math.round(r / c);
156
+ data[q + 1] = Math.round(gg / c);
157
+ data[q + 2] = Math.round(b / c);
158
+ tRing[n] = k;
159
+ next.push(n);
160
+ }
161
+ }
162
+ frontier = next;
163
+ }
164
+ // ③ alpha 边缘空间平滑:交界带(不透明 1~2 环 或 透明贴边 1 环)做一次 3×3 alpha 均值
165
+ const srcA = new Uint8Array(N);
166
+ for (let i = 0; i < N; i++)
167
+ srcA[i] = A(i);
168
+ for (let i = 0; i < N; i++) {
169
+ if (!((ring[i] >= 1 && ring[i] <= 2) || tRing[i] === 1))
170
+ continue;
171
+ const x = i % W, y = (i / W) | 0;
172
+ let sum = 0, c = 0;
173
+ for (let dy = -1; dy <= 1; dy++)
174
+ for (let dx = -1; dx <= 1; dx++) {
175
+ const nx = x + dx, ny = y + dy;
176
+ if (nx < 0 || nx >= W || ny < 0 || ny >= H)
177
+ continue;
178
+ sum += srcA[ny * W + nx];
179
+ c++;
180
+ }
181
+ data[i * ch + 3] = Math.round(sum / c);
182
+ }
183
+ }
184
+ /**
185
+ * 色键去背景:适合纯色底的精灵表(品红/绿幕等)。**不删主体**(按颜色距离判背景,角色色差大→保留)。
186
+ * 自动从四角+边中点采样 AI 实际画的底色(不假设标准 #FF00FF,容色差);距离 ≤ tolerance 全透,
187
+ * tolerance~+feather 软边渐隐。比 rembg 语义抠图更适合多帧表(rembg 会把主体/背景判错)。
188
+ */
189
+ export async function chromaKey(buf, opts) {
190
+ const tol = opts?.tolerance ?? 100;
191
+ const feather = Math.max(1, opts?.feather ?? 30);
192
+ const { data, info } = await sharp(buf).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
193
+ const W = info.width;
194
+ const H = info.height;
195
+ const ch = info.channels; // 4
196
+ const N = W * H;
197
+ // ★ 洋红优先:平台生图背景统一用洋红(FF00FF / 残留的偏粉洋红)。色相维度:洋红 = 红、蓝同时
198
+ // 远高于绿,即 s = min(R-G, B-G) 很大;肤色/黄帽/蓝衣/红物的 s 都为负或近 0。
199
+ // 但⚠️ 色相单判会误杀洋红系的主体色(紫宝石 182,67,249 → s=115 照中)→ 真正抠除还要过第二道门:
200
+ // 颜色≈【本图实测背景色】(从边框洋红像素采样;不假设 FF00FF,偏粉残留 205,27,122 也能自适应)。
201
+ // s 门槛负责"只考虑洋红系"(不吃白底/浅底),距离门负责"洋红系里只抠背景那种"(不吃紫色主体)。
202
+ const sAt = (p) => Math.min(data[p] - data[p + 1], data[p + 2] - data[p + 1]);
203
+ const S_HI = 70; // s≥此 = 纯洋红,全抠
204
+ const S_LO = 35; // s≤此 = 主体,保留;之间羽化软边
205
+ // 顺带累计【纯洋红像素】的均值 → 本图实际背景基准色(下面抠内部镂空要用它判"是不是背景色")。
206
+ let magenta = 0, br = 0, bgc = 0, bb = 0;
207
+ for (let p = 0; p < data.length; p += ch) {
208
+ if (data[p + 3] !== 0 && sAt(p) >= S_HI) {
209
+ magenta++;
210
+ br += data[p];
211
+ bgc += data[p + 1];
212
+ bb += data[p + 2];
213
+ }
214
+ }
215
+ if (magenta >= Math.max(20, N * 0.0003)) {
216
+ // 本图背景洋红的实际色:优先用【图像边框上的洋红像素】均值(边框在生成契约下必是背景,
217
+ // 不会混进主体的紫色系装饰);边框没有(如 rembg 抠后只剩内部残留)才退回全图洋红均值。
218
+ let ebr = 0, ebg = 0, ebb = 0, en = 0;
219
+ const addEdge = (x, y) => {
220
+ const p = (y * W + x) * ch;
221
+ if (data[p + 3] !== 0 && sAt(p) >= S_HI) {
222
+ en++;
223
+ ebr += data[p];
224
+ ebg += data[p + 1];
225
+ ebb += data[p + 2];
226
+ }
227
+ };
228
+ for (let x = 0; x < W; x++) {
229
+ addEdge(x, 0);
230
+ addEdge(x, H - 1);
231
+ }
232
+ for (let y = 0; y < H; y++) {
233
+ addEdge(0, y);
234
+ addEdge(W - 1, y);
235
+ }
236
+ const BR = en >= 20 ? ebr / en : br / magenta;
237
+ const BG = en >= 20 ? ebg / en : bgc / magenta;
238
+ const BB = en >= 20 ? ebb / en : bb / magenta;
239
+ const distBg1 = (p) => {
240
+ const dr = data[p] - BR, dg = data[p + 1] - BG, db = data[p + 2] - BB;
241
+ return Math.sqrt(dr * dr + dg * dg + db * db);
242
+ };
243
+ // 🔴 抠除判据 = 色相是洋红系(s)【且】颜色≈本图实测背景色(距离)——双重门。
244
+ // 只按色相一刀切会误杀洋红系的主体色:紫宝石(182,67,249)s=115 照样≥S_HI,但它到实测
245
+ // 背景(249,3,239)距离≈93,按"是不是这张图的背景色"一眼分开(gmrdgvrlt 宝石被抠事故)。
246
+ const D_CUT = 60; // 距背景 ≤此 = 背景,全抠
247
+ const D_KEEP = 85; // 距背景 ≥此 = 主体,保留;之间羽化软边
248
+ // 🔴 两阶段:① 先抠【与边缘连通】的洋红背景(外部背景);② 再单独判【内部封闭】的洋红块——
249
+ // 是"镂空洞"(甜甜圈/手环中空,颜色=背景洋红)还是"主体自带装饰"(宝石内芯/紫斗篷,偏色)。
250
+ // 阶段①从四边 flood-fill,只穿过"洋红候选(s≥S_LO)且贴近背景色"的像素——碰到偏色主体即止。
251
+ const visited = new Uint8Array(N);
252
+ const stack = [];
253
+ const pushIf = (idx) => {
254
+ if (visited[idx])
255
+ return;
256
+ const p = idx * ch;
257
+ if (data[p + 3] !== 0 && sAt(p) >= S_LO && distBg1(p) <= D_KEEP) {
258
+ visited[idx] = 1;
259
+ stack.push(idx);
260
+ }
261
+ };
262
+ for (let x = 0; x < W; x++) {
263
+ pushIf(x);
264
+ pushIf((H - 1) * W + x);
265
+ }
266
+ for (let y = 0; y < H; y++) {
267
+ pushIf(y * W);
268
+ pushIf(y * W + W - 1);
269
+ }
270
+ while (stack.length) {
271
+ const idx = stack.pop();
272
+ const x = idx % W, y = (idx / W) | 0;
273
+ if (x > 0)
274
+ pushIf(idx - 1);
275
+ if (x < W - 1)
276
+ pushIf(idx + 1);
277
+ if (y > 0)
278
+ pushIf(idx - W);
279
+ if (y < H - 1)
280
+ pushIf(idx + W);
281
+ }
282
+ for (let idx = 0; idx < N; idx++) {
283
+ if (!visited[idx])
284
+ continue; // 阶段①:只抠边缘连通的洋红;内部封闭块留给阶段②判定
285
+ const p = idx * ch;
286
+ const s = sAt(p);
287
+ const d = distBg1(p);
288
+ if (s >= S_HI && d <= D_CUT) {
289
+ data[p + 3] = 0;
290
+ continue;
291
+ }
292
+ // 软边羽化:取"色相纯度"与"距背景远近"两个维度中更保守(更不透明)的一档
293
+ const aS = s >= S_HI ? 0 : (S_HI - s) / (S_HI - S_LO);
294
+ const aD = d <= D_CUT ? 0 : Math.min(1, (d - D_CUT) / (D_KEEP - D_CUT));
295
+ data[p + 3] = Math.round(data[p + 3] * Math.max(aS, aD));
296
+ // 去溢色:把半透明边缘像素里溢出的红/蓝拉回贴近绿,消除紫边
297
+ const g = data[p + 1];
298
+ if (data[p] > g)
299
+ data[p] = Math.round(g + (data[p] - g) * 0.3);
300
+ if (data[p + 2] > g)
301
+ data[p + 2] = Math.round(g + (data[p + 2] - g) * 0.3);
302
+ }
303
+ // 阶段②:内部封闭洋红块——只抠【颜色≈本图背景基准色】的(=透过主体看到的背景,即镂空洞);
304
+ // 偏色的(宝石内芯偏紫、紫斗篷渐变)到基准色距离远 → 保留。判据用【到背景基准色的距离】而非色相 s
305
+ // ——偏紫装饰的 s 也很高(195,40,180 → s=140),按 s 根本分不开镂空与装饰;按"是不是这张图的背景色"才分得开。
306
+ const distBg = (p) => {
307
+ const dr = data[p] - BR, dg = data[p + 1] - BG, db = data[p + 2] - BB;
308
+ return Math.sqrt(dr * dr + dg * dg + db * db);
309
+ };
310
+ const PURE = 60; // 到背景基准色 ≤此 = 就是背景色(抠);偏色装饰距离远 → 保留
311
+ const FEATH = 25; // 镂空边缘软边羽化带宽
312
+ for (let seed = 0; seed < N; seed++) {
313
+ if (visited[seed])
314
+ continue; // 边缘连通的已在阶段①处理
315
+ const ps = seed * ch;
316
+ if (data[ps + 3] === 0 || sAt(ps) < S_HI || distBg(ps) > PURE)
317
+ continue; // 种子:高纯洋红 + 贴近背景基准色
318
+ // flood-fill 这个内部封闭块,只沿"接近背景色"的像素扩散(碰到主体描边/偏色装饰即止)
319
+ const region = [seed];
320
+ visited[seed] = 1;
321
+ const st = [seed];
322
+ while (st.length) {
323
+ const idx = st.pop();
324
+ const x = idx % W, y = (idx / W) | 0;
325
+ const tryNb = (nb) => { if (!visited[nb] && data[nb * ch + 3] !== 0 && distBg(nb * ch) <= PURE + FEATH) {
326
+ visited[nb] = 1;
327
+ st.push(nb);
328
+ region.push(nb);
329
+ } };
330
+ if (x > 0)
331
+ tryNb(idx - 1);
332
+ if (x < W - 1)
333
+ tryNb(idx + 1);
334
+ if (y > 0)
335
+ tryNb(idx - W);
336
+ if (y < H - 1)
337
+ tryNb(idx + W);
338
+ }
339
+ for (const idx of region) {
340
+ const p = idx * ch;
341
+ const d = distBg(p);
342
+ data[p + 3] = d <= PURE ? 0 : Math.round(data[p + 3] * ((PURE + FEATH - d) / FEATH)); // 软边羽化
343
+ const g = data[p + 1]; // 去溢色,消紫边
344
+ if (data[p] > g)
345
+ data[p] = Math.round(g + (data[p] - g) * 0.3);
346
+ if (data[p + 2] > g)
347
+ data[p + 2] = Math.round(g + (data[p + 2] - g) * 0.3);
348
+ }
349
+ }
350
+ cutoutPostProcess(data, W, H, ch); // 去晕环 + alpha-bleeding + 边缘平滑(见函数注释)
351
+ return sharp(data, { raw: { width: W, height: H, channels: ch } }).png().toBuffer();
352
+ }
353
+ // 否则(无洋红 → 资源库任意纯色底):
354
+ // ① 底色用【边缘像素的众数】而非平均:主体填满画框时边缘会混入主体色,
355
+ // 平均会被污染(矿工的脸被抠就是这么来的——上边中点采到头盔、左右采到衣服)。
356
+ // 粗量化(每通道 16 级)分桶计数,取最频繁的桶,再用该桶内像素均值作精确底色。
357
+ const buckets = new Map();
358
+ const addBorder = (x, y) => {
359
+ const i = (y * W + x) * ch;
360
+ const key = ((data[i] >> 4) << 8) | ((data[i + 1] >> 4) << 4) | (data[i + 2] >> 4);
361
+ let b = buckets.get(key);
362
+ if (!b) {
363
+ b = { n: 0, r: 0, g: 0, b: 0 };
364
+ buckets.set(key, b);
365
+ }
366
+ b.n++;
367
+ b.r += data[i];
368
+ b.g += data[i + 1];
369
+ b.b += data[i + 2];
370
+ };
371
+ for (let x = 0; x < W; x++) {
372
+ addBorder(x, 0);
373
+ addBorder(x, H - 1);
374
+ }
375
+ for (let y = 0; y < H; y++) {
376
+ addBorder(0, y);
377
+ addBorder(W - 1, y);
378
+ }
379
+ let best = null;
380
+ for (const b of buckets.values())
381
+ if (!best || b.n > best.n)
382
+ best = b;
383
+ if (!best)
384
+ return sharp(data, { raw: { width: W, height: H, channels: ch } }).png().toBuffer();
385
+ const tr = best.r / best.n;
386
+ const tg = best.g / best.n;
387
+ const tb = best.b / best.n;
388
+ // ② 只从边缘 flood-fill 抠掉【与边缘连通】的底色区:主体内部即便有接近底色的像素
389
+ // (脸/阴影/同色装饰)因不与边缘连通而绝不会被抠 —— 这是"脸被抠没"的根治。
390
+ const distAt = (p) => {
391
+ const dr = data[p] - tr, dg = data[p + 1] - tg, db = data[p + 2] - tb;
392
+ return Math.sqrt(dr * dr + dg * dg + db * db);
393
+ };
394
+ const visited = new Uint8Array(N);
395
+ const stack = [];
396
+ const pushIf = (idx) => {
397
+ if (visited[idx])
398
+ return;
399
+ if (distAt(idx * ch) <= tol + feather) {
400
+ visited[idx] = 1;
401
+ stack.push(idx);
402
+ }
403
+ };
404
+ for (let x = 0; x < W; x++) {
405
+ pushIf(x);
406
+ pushIf((H - 1) * W + x);
407
+ }
408
+ for (let y = 0; y < H; y++) {
409
+ pushIf(y * W);
410
+ pushIf(y * W + W - 1);
411
+ }
412
+ while (stack.length) {
413
+ const idx = stack.pop();
414
+ const p = idx * ch;
415
+ const d = distAt(p);
416
+ data[p + 3] = d <= tol ? 0 : Math.round(data[p + 3] * ((d - tol) / feather)); // 软边羽化
417
+ const x = idx % W, y = (idx / W) | 0;
418
+ if (x > 0)
419
+ pushIf(idx - 1);
420
+ if (x < W - 1)
421
+ pushIf(idx + 1);
422
+ if (y > 0)
423
+ pushIf(idx - W);
424
+ if (y < H - 1)
425
+ pushIf(idx + W);
426
+ }
427
+ cutoutPostProcess(data, W, H, ch);
428
+ return sharp(data, { raw: { width: W, height: H, channels: ch } }).png().toBuffer();
429
+ }
430
+ /** 解析 "WxH"/"W*H" → {w,h};失败返 null。 */
431
+ //# sourceMappingURL=pixels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixels.js","sourceRoot":"","sources":["../../../src/providers/art/pixels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export interface Cell {
2
+ left: number;
3
+ top: number;
4
+ width: number;
5
+ height: number;
6
+ }
7
+ /**
8
+ * 内容感知探测:先按行投影找出 `rows` 个行带,再在每个行带内按列投影找 `cols` 个列带。
9
+ * 行内逐带做列投影(而非全图一次)→ 容忍行与行之间的水平错位。
10
+ * 缝隙判定用"真空"(count<1):ALPHA_T 已滤掉抗锯齿,真正的格间缝隙就是全透明=0;
11
+ * 用相对比例会把圆形/不规则元素渐细的尖端误判成空行 → 带边界切进元素里。
12
+ * 行带数 ≠ rows、或任一行的列带数 ≠ cols → 判为不可靠,返回 detected:false。
13
+ */
14
+ export declare function detectCells(data: Buffer, W: number, H: number, ch: number, cols: number, rows: number): {
15
+ cells: Cell[];
16
+ detected: boolean;
17
+ };
18
+ export interface SliceResult {
19
+ frames: Buffer[];
20
+ sizes: {
21
+ w: number;
22
+ h: number;
23
+ }[];
24
+ detected: boolean;
25
+ }
26
+ /**
27
+ * 把一张图集切成单帧(内容感知 bbox;检测失败退回等分 + 逐格 bbox)。
28
+ * opts.grid=true:强制按 cols×rows 等分网格切(跳过连通域)——用于【规整横排/网格的序列帧】,
29
+ * 避免连通域把一个动作的分离部件(如波动拳能量球)误切成多帧、帧数对不上。
30
+ */
31
+ export declare function sliceSheet(buf: Buffer, cols: number, rows: number, opts?: {
32
+ grid?: boolean;
33
+ }): Promise<SliceResult>;
34
+ export interface NormalizeResult {
35
+ buf: Buffer;
36
+ detected: boolean;
37
+ frames: number;
38
+ cols: number;
39
+ rows: number;
40
+ cellWidth: number;
41
+ cellHeight: number;
42
+ }
43
+ /**
44
+ * 把一张 AI 图集归一化成均匀网格:切出每个元素(紧致 bbox)→ 等大居中重拼。
45
+ * 检测失败时退回"等分 + 逐格 bbox 居中"(不致更糟)。返回新 PNG buffer(尺寸通常与原图不同)。
46
+ */
47
+ export declare function normalizeSheet(buf: Buffer, cols: number, rows: number): Promise<NormalizeResult>;
48
+ export interface AtlasFrame {
49
+ x: number;
50
+ y: number;
51
+ w: number;
52
+ h: number;
53
+ }
54
+ export interface PackedSheet {
55
+ buf: Buffer;
56
+ frames: AtlasFrame[];
57
+ width: number;
58
+ height: number;
59
+ detected: boolean;
60
+ }
61
+ /**
62
+ * 把一张 AI 图集切成单帧(紧致 bbox)后,**紧凑 shelf 重排**成一张图集 + 给出每帧 rect。
63
+ * 不等大(省均匀网格的填充浪费)、不旋转、不用装箱器——按原顺序逐帧码放、超宽换行。
64
+ * 帧顺序保持行优先(索引语义不变);空格用 1×1 透明占位、rect 照常记录。
65
+ */
66
+ export declare function packSheet(buf: Buffer, cols: number, rows: number, opts?: {
67
+ grid?: boolean;
68
+ frameMaxHeight?: number;
69
+ }): Promise<PackedSheet>;
70
+ //# sourceMappingURL=sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../../src/providers/art/sheet.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAkBD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAwB5I;AAoGD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCzH;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAuBtG;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AACD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAsDjJ"}