docs: 更新 HANDOFF.md,添加蒙版编辑功能说明和技术实现细节

This commit is contained in:
InpaintRegionEditor Dev
2026-03-03 15:17:39 +08:00
parent a4f8f78a0e
commit 4d528fff8e
+58 -6
View File
@@ -1,6 +1,6 @@
# InpaintRegionEditor 项目交接文档
> 版本:1.0 | 日期:2026-03-02
> 版本:1.1 | 日期:2026-03-03
> 交接对象:开发团队
> 交接人:项目经理 Agent
@@ -13,7 +13,8 @@
**InpaintRegionEditor** 是一个 ComfyUI 自定义节点,用于解决局部重绘(inpaint)工作流中的两个核心问题:
1. **图像编辑**:ComfyUI 自身没有图像编辑功能,需要集成 Photopea 实现液化、仿制图章等 PS 级功能
2. **选区调整**:原有的扩散选区功能无法手动调整位置,导致边缘参考区域错误
2. **蒙版编辑**:支持羽化效果的蒙版编辑,使用 Photopea 双图层模式
3. **选区调整**:原有的扩散选区功能无法手动调整位置,导致边缘参考区域错误
### 1.2 核心价值
@@ -25,6 +26,8 @@
本节点解决方案:
├─ 集成 Photopea:完整的 Photoshop 功能,浏览器内完成编辑
├─ 双模式编辑:编辑图像 / 编辑蒙版(分离操作)
├─ 羽化支持:半透明蒙版自动转换为羽化效果
├─ 可拖动选区:手动调整参考区域位置,确保参考内容准确
└─ 一体化流程:上传 → 编辑 → 选区调整 → 执行,无需切换工具
```
@@ -33,20 +36,24 @@
```
输入:
- image: 从 ComfyUI input 目录选择(支持上传)
- image: 从 ComfyUI input 目录选择(支持上传、Ctrl+V 粘贴)
- padding: 扩散像素数(默认 64,范围 0-512)
自动处理:
1. 读取图像 Alpha 通道作为 MASK
2. 没有 Alpha → 报错 "请先创建蒙版"
3. 有 Alpha → 计算蒙版边界框
3. 有 Alpha → 计算蒙版边界框(alpha < 255 都计入)
4. 选区 = 蒙版边界 + padding
5. 在图像预览上绘制遮罩 + 选区框(可拖动)
5. 在图像预览上绘制遮罩 + 选区框(可拖动、可调整大小)
用户操作:
- 右键 → "打开 Photopea 编辑":编辑图像 + 蒙版
- 右键 → "编辑图像(Photopea)":编辑图像本身
- 右键 → "编辑蒙版(Photopea)":双图层蒙版编辑(参考图像 + 蒙版层)
- 右键 → "Open in MaskEditor":使用 ComfyUI 自带蒙版编辑器
- 拖动选区框:手动调整参考区域位置
- 调整选区边缘:拖动边缘/角落调整选区大小
- 调整 padding 值:改变扩散像素数
- Ctrl+V:粘贴图片
输出:
- IMAGE: RGB 图像(不含 Alpha)
@@ -510,6 +517,7 @@ doc.selection.copy();
| **Region(选区)** | 定义参考区域,AI 参考这个区域内的原图内容 |
| **Padding(扩散)** | 选区相对于遮罩边界的扩散像素数 |
| **Alpha 通道** | PNG 的透明度通道,用于存储蒙版 |
| **羽化** | 蒙版边缘的半透明过渡效果(alpha = 1-254) |
### 12.2 版本历史
@@ -517,9 +525,53 @@ doc.selection.copy();
|------|------|------|
| 0.1 | 2026-02-27 | 初始版本(简化版,仅 Photopea 集成) |
| 1.0 | 2026-03-02 | 需求最终确认,编写 handoff 文档 |
| 1.1 | 2026-03-03 | Photopea 蒙版编辑功能,修复 RGB 被掏窟窿问题 |
---
## 十三、关键技术实现
### 13.1 Canvas Premultiplied Alpha 问题
**问题描述**:
当 Canvas 通过 `drawImage()` 绘制带有 Alpha < 255 的 PNG 图像时,浏览器会应用 **premultiplied alpha**,导致 Alpha = 0 的像素 RGB 数据丢失(被"掏窟窿")。
**解决方案**:
1. **加载时**:使用 ComfyUI `/view` API 的 `channel=rgb` 和 `channel=a` 参数分别获取 RGB 和 Alpha 数据
2. **保存时**:使用 UPNG.js 库直接编码 RGBA 数据,绑过 Canvas 的 premultiplied alpha
### 13.2 Photopea 蒙版编辑流程
```
1. 加载图像
├─ 获取 RGB 数据(channel=rgb)→ 完整 RGB,无窟窿
└─ 获取 Alpha 数据(channel=a)→ 用于创建蒙版层
2. 创建双图层文档
├─ 底层:参考图像(完整 RGB)
└─ 顶层:蒙版层(用户在此绘制黑色 = 遮罩)
3. 保存蒙版
├─ 隐藏参考图像层
├─ 只导出蒙版层
├─ 获取原图 RGB(channel=rgb)
└─ 合并蒙版到 Alpha 通道(UPNG.js 编码)
```
### 13.3 羽化逻辑
```
蒙版层(用户绘制):
- 黑色不透明(alpha=255)→ 遮罩 → 最终 alpha=0
- 黑色半透明(alpha=128)→ 羽化 → 最终 alpha=128
- 完全透明(alpha=0)→ 不遮罩 → 最终 alpha=255
公式:最终 alpha = 255 - 蒙版层alpha
```
---
*文档创建时间:2026-03-02*
*最后更新时间:2026-03-03*
*基于与用户的多次讨论整理*
*交接完成标志:开发团队确认收到并理解本文档*