5 Commits
Author SHA1 Message Date
rui40000andClaude Opus 4.8 cea14ef327 feat: 八方向拆分支持锚点对齐——尺寸统一、切换朝向不跳
原来每个方向各按自己的内容裁剪,8 个方向出 8 种尺寸,角色在各自
画面里的位置也不一致,游戏里切换朝向会跳。人工做法是一帧一帧手动
对位置,这里把它自动化。

新增三个参数:
- align_mode   锚点对齐·统一画布(默认)
- anchor_type  脚底中心(默认)/ 包围盒底边中心 / 包围盒中心
- align_scope  逐帧对齐·脚底钉死(默认)/ 按方向统一平移

锚点为什么取「脚底中心」:角色站在地面上,脚底才是它在世界里的位置;
而斗篷、披风、手杖会把包围盒拽向一侧。故 y 取最低的不透明行,
x 取底部窄带的水平质心 —— 那些外挂物基本不会垂到脚底,走路时两脚
一前一后,窄带质心正好落在两脚之间,即人真正站立的点。

画布尺寸由「所有方向、所有帧相对各自锚点的最大延展」求并集得出,
因此既统一又不会切到任何一帧。

实测(97 帧真实素材):
  不对齐        8 种尺寸    各方向锚点散布 x 48.9px / y 27px
  按方向统一平移 统一267x372  x 7.1px / y 4px,跨帧位移 13~23px(保留摆动)
  逐帧对齐      统一284x367  x 0.76px / y 0px,跨帧位移约 1px
默认取逐帧对齐:行走循环本就该原地播放、位移交给游戏代码,sprite
内部不该有整体漂移,而 AI 生成的视频往往有(实测达 22px)。

info 输出新增统一画布尺寸、锚点坐标与 Unity/Godot 归一化 pivot
(左下为原点),照着填进引擎 8 个方向即可共用同一套坐标。

两个示例工作流同步更新 widgets(13→16,不同步会参数错位),
并已校验 widget 数量与结构自洽性。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-30 22:27:41 +08:00
rui40000andClaude Opus 4.8 2a6fd42c57 fix: 治理抠图白边——推荐改用模型 alpha,新增收边与颜色反溢出
用户反馈边缘一圈白边。诊断:按 alpha 分层统计 RGB 均值,
alpha 0.05~0.3 的边缘像素 RGB 高达 0.989(角色本体只有 0.363),
证实边缘掺了背景白 —— 我只设了 alpha 却没动 RGB。

新增两个参数:
- decontaminate 颜色反溢出,按 观察色=前景×a+白×(1-a) 反解前景色
- edge_shrink 把边缘那圈几乎全是背景的半透明像素收掉

实测白边强度(合成到深绿底,量主体外缘3像素环带比背景亮多少):
  都关闭 0.0483 / 只反溢出 0.0466 / 只收边 0.0283 / 两者 0.0261 / 狠收边 0.0164
即:收边是主力(-41%),反溢出单独几乎无效(-3.5%)——因为观察色
本身就太白,反解出来还是白。这点如实写进 tooltip 与 README。

但收边暴露了颜色阈值法的死穴:它按「离白色多远」估 alpha,
白衬衫接近白、alpha 天生偏低,收边会把衬衫啃出破洞(肉眼可见背景
透过衣服)。这不是调参能解决的,故改推荐语义级抠图:

- bg_mode 默认改为「已带透明通道(推荐·上游接抠图节点)」,
  选项名直接把取舍写进去,旧选项名保留在 _BG_ALIAS 里做兼容
- edge_shrink 默认 0.2(配模型 alpha 够用;配阈值法需 0.35+)
- 示例工作流插入 Lucida 节点:加载视频 → Lucida → 拆分(masks 输入)

实测 Lucida 一次识别整张雪碧图全部 8 个角色(各格前景占比 0.18~0.24,
中间空格 0.002);同等白边水平下主体被啃面积比阈值法少 35%,白衬衫完好。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-30 10:23:54 +08:00
rui40000andClaude Opus 4.8 9c674bac42 fix: bg_mode=不处理 时角色仍被格线切断(上次修复漏掉了这条路径)
上次加的 expand_beyond_cell 有个致命条件写错:
    use_expand = expand_beyond_cell and mode != "none" and _HAS_SCIPY
选「不处理(输出不透明)」时整个修复被跳过,退回严格格线切分,
输出尺寸恒为格子大小(834/3 x 1112/3 = 278x371),角色照样被切。
当初这么写的理由是「不透明模式没有 alpha 可做连通分析」——
但定位和输出是两件事,内部照样可以算一份白底检测只用于圈定范围。

改为:locate_alpha() 专用于定位(三种 bg_mode 都算),
frame_alpha() 才是真正写进输出的。修复后三种模式尺寸完全一致。

连带解决「不处理」模式的一个矛盾:裁剪框为了不切断角色必然框进
邻居的像素,而该模式不做透明处理,邻居就会直接显示出来。
现在把非本角色区域按软 alpha 合成到白底 —— 保住完整角色,
也不会混进旁边那位。

crop_padding 默认 8 → 16:给描边/发光/阴影等后续特效留余量,
也免得内容贴着边看起来像被切。

验证:三种 bg_mode 全部「贴边被切的方向 = 无」。
判据按模式区分——透明模式看输出 alpha 的四边,不处理模式看非白像素的四边。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-30 09:35:42 +08:00
rui40000andClaude Opus 4.8 5d3834503e fix: 八方向拆分不再切断角色;全仓库参数补齐中文 tooltip
【修复】角色被格线切断(脚、手杖、飘起的斗篷被削掉)
新增 expand_beyond_cell(默认开启):格子只用来判定「这是哪个方向」,
角色的实际范围由它自身的连通区域决定,按质心归属确保邻居不混入。
实测 8/8 方向的裁剪框边缘 alpha 从 1.00(内容顶到边界=被切断)
降到 0.00,S 方向高度 326→356、E 方向宽度 150→188 把缺的部分找了回来。
代价是需要两遍扫描(先求全序列并集框再提取),耗时 4.7s→14.9s。

【规则】每个参数都必须有中文 tooltip,作为以后的统一约定
全仓库 26 个节点 169 个参数,此前缺 115 个,现已 100% 覆盖。
tooltip 写「怎么调」而不只是「是什么」:给取值区间的实际影响、
推荐值与踩坑提示(如 OpenAI/ZenMux 的地址栏不能带 :// ,
素材拆分节点用于动画序列时顺序会漂移等)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 19:07:01 +08:00
rui40000andClaude Opus 4.8 28fd14aaad feat: 新增八方向序列拆分节点(8方向行走动画管线)
把每帧排布着 8 个朝向的雪碧图序列,一次拆成 8 条独立动画序列,
完成方向编号与分组。整条管线只有这一环缺失,其余复用现成实现:
视频转帧用 VHS 的 force_rate,透明 webm 用 VHS 的
format=video/webm + pix_fmt=yuva420p,序列帧用 SaveImage
(4 通道输入 PIL 会自动存成 RGBA)。

三个关键设计:
- 用固定网格而非连通区域拆分:连通区域按包围盒排序,角色走动时
  位置浮动,跨过排序行界方向就错乱,上百帧错一帧整条动画就废;
  且各自 bbox 裁剪导致尺寸不一无法合成视频
- 白底转透明用边缘连通性判断:角色常穿白衣服,按亮度一刀切会把
  白衬衫掏空,故只把与画面边缘相连的白色判为背景
- 裁剪框取全序列并集:逐帧各自裁剪会尺寸不一且角色帧间跳动

另加碎片清理(按连通块面积比):网格切分会把相邻格探进来的手杖尖
切入本格,既难看又撑大裁剪范围。实测 E 方向 172x370 -> 150x335,
跨帧重心极差 8.0 -> 0.5 px。

实测 97 帧 834x1112 素材:拆分约 4 秒,导出 webm 回读透明像素占比
0.635 与素材一致。注意验证 webm 透明需显式 -c:v libvpx-vp9 解码,
内置 vp9 解码器不处理 alpha 边带,否则会误判为透明丢失。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 18:48:50 +08:00