@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.
- package/dist/commands/artCommand.d.ts +4 -0
- package/dist/commands/artCommand.d.ts.map +1 -0
- package/dist/commands/artCommand.js +277 -0
- package/dist/commands/artCommand.js.map +1 -0
- package/dist/commands/skillCommand.js +13 -1
- package/dist/commands/skillCommand.js.map +1 -1
- package/dist/core/skills/distribution.d.ts +13 -0
- package/dist/core/skills/distribution.d.ts.map +1 -1
- package/dist/core/skills/distribution.js +50 -12
- package/dist/core/skills/distribution.js.map +1 -1
- package/dist/core/skills/ownership.d.ts +46 -0
- package/dist/core/skills/ownership.d.ts.map +1 -0
- package/dist/core/skills/ownership.js +63 -0
- package/dist/core/skills/ownership.js.map +1 -0
- package/dist/main.js +18 -1
- package/dist/main.js.map +1 -1
- package/dist/providers/art/atlas.d.ts +34 -0
- package/dist/providers/art/atlas.d.ts.map +1 -0
- package/dist/providers/art/atlas.js +71 -0
- package/dist/providers/art/atlas.js.map +1 -0
- package/dist/providers/art/frames.d.ts +43 -0
- package/dist/providers/art/frames.d.ts.map +1 -0
- package/dist/providers/art/frames.js +94 -0
- package/dist/providers/art/frames.js.map +1 -0
- package/dist/providers/art/pixels.d.ts +33 -0
- package/dist/providers/art/pixels.d.ts.map +1 -0
- package/dist/providers/art/pixels.js +431 -0
- package/dist/providers/art/pixels.js.map +1 -0
- package/dist/providers/art/sheet.d.ts +70 -0
- package/dist/providers/art/sheet.d.ts.map +1 -0
- package/dist/providers/art/sheet.js +312 -0
- package/dist/providers/art/sheet.js.map +1 -0
- package/dist/services/SkillService.d.ts +6 -0
- package/dist/services/SkillService.d.ts.map +1 -1
- package/dist/services/SkillService.js +3 -0
- package/dist/services/SkillService.js.map +1 -1
- package/package.json +3 -1
- package/skills/art-chain/SKILL.md +242 -0
- 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"}
|