2388 字
约 7 分钟
0
AI「生图→切图→补齐→导出」
2026-09-08
AI「生图→切图→补齐→导出」完整流水线 · 通用复现文档
用途:复现一条"把一张图(AI生成或上传)转成可导出的切图/补齐后的完整资产"的流水线时,逐段照着建。 覆盖五段:输入 → 校验 → 拆图 → 补齐 → 输出路径。 本文已把"拆图"环节的切图识别规则(允许/禁止)完整并入阶段③,不再单列。
流水线总览
输入
├─ AI生图/图生图 (后端 → /v1/images/generations)
└─ 本地图片 上传 PNG/JPG/WebP
│
▼
校验 (core/ai-image-dimensions)
· 尺寸 256–4096px
· 支持类型白名单
│
▼
拆图 (core/background-decomposition)
├─ 切图资产 → 可独立导出的像素/形状
├─ 背景候选 → 蓝框(建议)
└─ 覆盖层 → 红框(需移除并 AI 补齐)
│
▼
补齐 (后端 /api/images/edit)
├─ AI补齐·原图 → 整图输出
└─ AI补齐·局部合成 → 仅贴回修补区域(保留其余像素)
│
▼
输出路径
├─ 切图导入 → 插件建 Frame(按原坐标)
├─ AI图层导入 → HTML/CSS预览 → DOM捕获 → Figma图层 / 下载HTML ZIP
└─ 下载HTML → index.html + styles.css + script.js + assets/
阶段① · 输入
AI生图/图生图 (server → /v1/images/generations)
本地图片 上传 PNG/JPG/WebP
复现要点
- 两类输入来源不同:一步走
images/generations,一步走文件上传。别复用错接口。 - 进管线前统一归一化(尺寸+编码+类型检查),不要在两类输入上各写一套。
易错
- ❌ 把"AI 生图"的返回格式和"上传文件"当成同一处理。
- ✅ 统一输入规范化层。
阶段② · 校验
尺寸 256–4096px
类型 PNG / JPG / WebP
复现要点
- 上下限(256、4096)、类型白名单收成常量/配置,别散写魔法数字。
- 校验失败明确报错 + 给合法范围,不静默继续。
- 对超大图/不支持类型要提前拦下,避免卡死后段。
阶段③ · 拆图(背景拆解)
切图资产 → 可独立导出的像素/形状
背景候选 → 蓝框(建议)
覆盖层 → 红框(需移除并 AI 补齐)
复现要点
- 坐标铁律:AI 返回的 bbox 一律原始像素坐标,解析器钳制越界+取整。
- 类型白名单成对:允许切集的种类 + 禁止切的种类都写死(详见下节"切图识别规则")。
- 数量/尺寸上限:背景候选、覆盖层各有上限,超限丢弃或报错,别硬塞。
- 蓝/红框语义别搞反:蓝框=背景候选(建议)、红框=覆盖层(需补齐)。互换后补齐会取错区域。
易错
- ❌ 坐标归一化/换单位 → 后面对齐全错。
- ❌ 只写"允许切"漏"禁止切" → 把文字/按钮切成碎片。
③-A 切图识别规则(允许 vs 禁止,成对写死)★
核心观点:"允许切什么"和"禁止切什么"必须成对写死 —— 只记允许项,复现时会漏掉禁止项,导致不该切的被切成 PNG。
① 允许切(可独立导出为像素/形状的类型)
| 类型 | 例句(按需替换) |
|---|---|
| 图标 | icon |
| 头像 | avatar |
| 插图 | illustration |
| 照片 | photo |
| 产品图 | product-image |
| 复杂装饰 | complex-decoration |
| 复杂图表 | complex-chart |
| Logo | logo |
选型原则:只切"用普通 CSS/简单形状无法可靠重建、必须保留为原始光栅"的区域。
② 禁止切(明确不导出的类型)★ 易漏、必须也写死
以下这些不要切成独立 PNG —— 因为它们用 CSS / 简单形状就能重建:
- 普通 UI 文字(文本/段落标题等,可作为文字图层)
- 按钮背景(可 CSS 实现)
- 卡片 / 容器(可 CSS 实现)
- 分隔线(dividers)
- 简单矩形 / 圆形(基本形状可重建)
- 布局容器(Layout frame/容器,不需要固有 PNG)
- Logo/徽标/插画里不可分割的艺术字 —— 例外:若文字与图无缝融合、无法分离,可作为一个整体 PNG 切出
原则:能重建的就不切成像素;只有"重建不了才保留为 PNG"。
③ 成对写死的 prompt 模板
指令:
1. 只返回"必须保留为 PNG 裁剪"的光栅资产(bbox 用原始像素坐标,不归一化)。
2. 允许的类型仅限:【allowed_kinds】。
3. 禁止返回:【forbidden_kinds(普通文字/按钮背景/卡片/分隔线/简单形状/布局容器)】。
4. 只有文字与图形不可分割的 Logo/徽标/插图,可作为单独 PNG 整体返回。
5. 返回 JSON: {"assets":[{name,kind,bbox:{x,y,width,height},confidence,containsEmbeddedText,reason}]}
关键:"允许"与"禁止"必须成对出现,缺一不可。很多翻车是复现时写了第 2 行、漏了第 3 行。
④ 切图结果解析时的过滤(代码层,同样成对)
| 过滤项 | 规则 | 若漏掉 |
|---|---|---|
| 种类白名单 | kind 必须在允许集内 | 混入不该切的 |
| 禁止项 | kind 命中禁止集 → 丢弃 | 把文字/按钮切出来 |
| 最小尺寸 | 宽或高 < 阈值(如 8px) → 丢弃 | 产生无意义小图 |
| 坐标钳制 | clamp 回原图范围 + 取整 | 越界/错位 |
| 数量上限 | 超过上限 → 丢弃或报错,不硬塞 | 图太多失控 |
阶段④ · 补齐
AI补齐·原图 → 整图输出
AI补齐·局部合成 → 仅贴回修补区域(保留其余像素)
这是最容易复现错的环节,重点注意
- 两种补满是不同回填方式:
- 整图输出 → 输出全新一张图
- 局部合成 → 只贴回修补区域,其余像素原样不动
- 守住:局部合成必须记住"修补区域掩码/bbox",回贴时只覆盖那一块;否则未改部分也被殃及,背景被重画变脏。
- 别图省事全用"整图输出" → 没改的地方也被 AI 改掉。
易错
- ❌ 把"局部合成"做成"整图重绘" → 补坏所有像素。
- ✅ 记住修补区域,只回贴那一块。
阶段⑤ · 输出路径
切图导入 → 插件建 Figma Frame(按原坐标)
AI图层导入 → HTML/CSS预览 → DOM捕获 → Figma图层 / 下载HTML ZIP
下载HTML → index.html + styles.css + script.js + assets/
复现要点
- 坐标体系一致:导入 Figma 的"按原坐标"必须和拆图阶段的坐标同一套(同 origin/单位),否则错位。
- 产物自洽:下载 HTML 的四个部分(
index.html+styles.css+script.js+assets/)相对路径要自洽,先在空目录打开验证能独立还原。 - 锁浏览器版本:DOM捕获→Figma图层依赖 headless 渲染一致性,锁 Playwright/Chromium 版本。
易错
- ❌ 拆图像素坐标 与 导入 placement 不同体系 → 全错位。
- ❌ 下载 HTML 路径引用错/缺 assets → 打开展现不了。
- ❌ 浏览器版本漂移 → 捕获结果不一致。
全流程复现检查清单(照抄打勾)
□ 输入统一规范化(AI生图/上传,进管线前归一)
□ 校验:尺寸 256–4096、类型白名单,失败明确报错带范围
□ 拆图:bbox 一律原始像素坐标 + 钳制 + 取整
□ 拆图:允许/禁止类型白名单成对写死(允许集 + 禁止集,缺一不可)
□ 拆图:例外规则——不可分割的 Logo/插画可整体切(否则会漏切)
□ 拆图:prompt 与 parser 的双白名单保持一致(前端别改、解析漏改)
□ 拆图:数量/尺寸上限,超限丢弃不硬塞
□ 拆图:蓝框=背景候选 / 红框=覆盖层(语义别互换)
□ 补齐:区分"整图输出" vs "局部合成"
□ 补齐:局部合成只回贴修补区,其余像素不动(用掩码/bbox)
□ 输出:导入坐标与拆图坐标同一套 origin/单位
□ 输出:下载HTML 四件套相对路径自洽,先空目录验证
□ 输出:锁定 headless 浏览器版本
最容易复现错的 Top 4
- 坐标/单位体系不一致(拆图像素 ↔ 导入 placement)→ 全部错位。
- 把"局部合成补齐"做成"整图重绘" → 修补淹没未改区域。
- 蓝/红框语义互换或种类白名单漏守 → 切错、补错。
- 下载 HTML 相对路径自洽性 → 单文件能开、整包打开是碎的。
相关
- 通用:
双线程架构通用笔记、缓存失效与改了就更新、模型任务分流(理解 vs 生成) - 注:本文的"阶段③ · 拆图"已完整涵盖切图识别规则(允许/禁止),不再另列专篇。
- 本项目实际位置(参考):
src/core/background-decomposition/、src/core/slice-detection/、src/server/services/
评论
0 条
还没有评论,先写一条吧。