@coralai/sps-cli 0.65.72 → 0.65.74

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 (39) 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/commands/skillCommand.js +13 -1
  6. package/dist/commands/skillCommand.js.map +1 -1
  7. package/dist/core/skills/distribution.d.ts +13 -0
  8. package/dist/core/skills/distribution.d.ts.map +1 -1
  9. package/dist/core/skills/distribution.js +50 -12
  10. package/dist/core/skills/distribution.js.map +1 -1
  11. package/dist/core/skills/ownership.d.ts +46 -0
  12. package/dist/core/skills/ownership.d.ts.map +1 -0
  13. package/dist/core/skills/ownership.js +63 -0
  14. package/dist/core/skills/ownership.js.map +1 -0
  15. package/dist/main.js +18 -1
  16. package/dist/main.js.map +1 -1
  17. package/dist/providers/art/atlas.d.ts +34 -0
  18. package/dist/providers/art/atlas.d.ts.map +1 -0
  19. package/dist/providers/art/atlas.js +71 -0
  20. package/dist/providers/art/atlas.js.map +1 -0
  21. package/dist/providers/art/frames.d.ts +43 -0
  22. package/dist/providers/art/frames.d.ts.map +1 -0
  23. package/dist/providers/art/frames.js +94 -0
  24. package/dist/providers/art/frames.js.map +1 -0
  25. package/dist/providers/art/pixels.d.ts +33 -0
  26. package/dist/providers/art/pixels.d.ts.map +1 -0
  27. package/dist/providers/art/pixels.js +431 -0
  28. package/dist/providers/art/pixels.js.map +1 -0
  29. package/dist/providers/art/sheet.d.ts +70 -0
  30. package/dist/providers/art/sheet.d.ts.map +1 -0
  31. package/dist/providers/art/sheet.js +312 -0
  32. package/dist/providers/art/sheet.js.map +1 -0
  33. package/dist/services/SkillService.d.ts +6 -0
  34. package/dist/services/SkillService.d.ts.map +1 -1
  35. package/dist/services/SkillService.js +3 -0
  36. package/dist/services/SkillService.js.map +1 -1
  37. package/package.json +3 -1
  38. package/skills/art-chain/SKILL.md +242 -0
  39. 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"}