蒙版绘制与仿制印章
当自动生成的修复蒙版漏掉文字残影、多盖住背景,或者图片上还有水印、网格、气泡线等需要手动抹掉的内容时,可以在编辑器左侧的“图像编辑”分组中切换蒙版画笔、彩色画笔和仿制印章,直接在画布上修改修复蒙版或修补图像。这里说明这三类工具的写入目标、显示控制、自动修复触发、撤销与持久化格式;工具入口、指针语义、缩放平移与选区见画布工具与选区,修复器本身的模型与参数见设置 → 蒙版与修复,快捷键与焦点规则见快捷键。
可以做什么
- 蒙版画笔(
brush)和橡皮擦(eraser)编辑的是优化蒙版(refined_mask,二值数组 0/255),不是检测输出的原始蒙版;每次有效笔画提交一个MaskEditCommand,并触发一次自动修复。 - 彩色画笔(
paint、paint_erase)写入画笔图层(paint_overlay,RGBA);仿制印章(clone、stamp_erase)写入印章图层(stamp_overlay,RGBA)。这两层是覆盖在修复图之上的独立透明层,不参与蒙版二值化。 - “清除所有蒙版”清空的是优化蒙版(没有优化蒙版时以原始蒙版为起点清零);“清除画笔图层”“清除印章图层”分别清空对应 RGBA 层,三者都走可撤销命令。
- 这里不负责工具按钮切换、选区、缩放平移、右键菜单和快捷键注册(见画布工具与选区与快捷键),也不负责修复器模型、修复尺寸、精度和逐块修复等全局参数(见设置 → 蒙版与修复)。
在编辑器中操作
在属性面板选择图层与工具
打开编辑器后,左侧默认显示“属性编辑”。在“图像编辑”分组中有“蒙版”“画笔”“印章”三个页签,各页签提供一组互斥工具按钮;三个页签共用一个按钮组,因此选中任一页签的工具都会取消其他页签的按钮。切换页签时,如果当前工具不属于新页签,会自动切回新页签的“不选择”,避免跨页工具冲突。三个页签还共享同一个“笔刷大小:”字段。
蒙版页签:画笔与橡皮擦
- 打开“蒙版”页签。
- 点击“画笔”或“橡皮擦”;也可以直接按
W/E切换,无需打开面板。 - 拖动“笔刷大小:”滑条调整笔画粗细,范围 5–200,初始 30;在画布上按住
Shift+滚轮每格 ±1 调整同一个字段。 - 在画布上按住左键拖动:画笔把笔画位置写为 255,橡皮擦把笔画位置清为 0。松开后整笔作为一个可撤销命令提交,并触发一次自动修复。
- 勾选“显示优化蒙版”在画布上以半透明红色显示优化蒙版;点击“清除所有蒙版”把优化蒙版整体清空。
画笔页签:彩色画笔
- 打开“画笔”页签。
- 选择“画笔”或“橡皮擦”:前者用“画笔颜色:”选择的颜色写入画笔图层,后者擦除画笔图层。
- 画笔颜色默认
#ffffff(白色),点击颜色按钮打开“选择画笔颜色”对话框;空值会规范化到#ff0000。 - “显示画笔层”只控制画笔图层是否显示,不删除数据,默认勾选。“清除画笔图层”把整层清空,可通过撤销恢复。
印章页签:取样与涂抹
- 打开“印章”页签,选择“仿制印章”。
- 在画布上右键点击要复制的源位置进行取样;仿制印章活动时右键不再打开上下文菜单。
- 按住左键拖动涂抹:落笔瞬间锁定“取样点 − 落笔点”的偏移,之后源位置跟随光标保持该偏移;拖动过程中逐点把源像素盖印到印章图层。
- 需要修正误盖时,选择同一页签的“橡皮擦”,按住左键拖动擦除印章图层。
- 勾选“显示印章层”控制印章图层显示,默认勾选;点击“清除印章层”清空整层,可通过撤销恢复。
图层与数据流
工具按钮、写入目标、显示层和导出之间的数据流如下。蒙版类工具最终影响的是修复蒙版和自动修复结果;画笔/印章类工具写入的是两个独立的 RGBA 覆盖层,不进入蒙版二值化。
flowchart LR
B["蒙版画笔 / 橡皮擦"] --> M["优化蒙版(二值)"]
P["彩色画笔 / 彩色画笔擦除"] --> O["画笔图层(RGBA)"]
C["仿制印章 / 印章擦除"] --> S["印章图层(RGBA)"]
M -->|"有效笔画 / 清除 / 撤销重做"| I["自动修复(增量)"]
M -->|"Show Refined Mask"| DM["红色半透明蒙版显示层"]
I --> V["修复图(画布底层)"]
O -->|"Show Paint Layer"| DO["画笔层显示"]
S -->|"Show Stamp Layer"| DS["印章层显示"]
V --> E["导出与回写"]
DO --> E
DS --> E
E --> J["工程 JSON:蒙版与图层数据"]
修复图、画笔层、印章层都叠加在画布底图之上,文字区域渲染在最上层;仿制印章的取样源正是“画布当前可见内容”(修复图优先,否则原图,再叠加画笔层和本笔已盖印的印章内容),因此同一笔内可以继续传递仿制内容。
修改如何保存
蒙版笔画与自动修复
_build_stroke_mask把落笔点连成带圆头的折线,再按“笔刷大小 × 蒙版/图像尺寸比”换算成蒙版分辨率下的二值笔画;蒙版分辨率以refined_mask为准,没有优化蒙版时以底图像素尺寸为准。- 提交时比较新旧蒙版,只有实际变化才构造
MaskEditCommand(记录变化包围盒内的旧/新像素补丁),通过QUndoStack执行。 - 画笔提交后调用
force_inpaint_stroke(stroke_mask),只用本次笔画包围盒(外扩 50px)做增量修复,而不是整图重跑;橡皮擦提交后走refined_mask_changed信号,由缓存蒙版快照计算“新增/移除”区域后增量修复,移除区域直接恢复为底图像素。 - 修复请求带代数号
_inpaint_request_generation:新笔画会取消并取代未完成的旧请求,所以连续快速涂抹时,画面最终以最后一次请求的结果为准。 - 修复器本身使用设置中的
inpainter、inpainting_size、inpainting_precision、force_use_torch_inpainting,设备为cuda(开启 GPU 且可用时)或cpu,详见设置 → 蒙版与修复。 - 笔画预览颜色:蒙版画笔为半透明红色、橡皮擦为半透明蓝色、彩色画笔为所选颜色、画笔/印章擦除为半透明青色;仿制印章直接显示真实盖印像素。
画笔与印章图层
- 两层的运行态都是
(H, W, 4)的 RGBA uint8 数组,尺寸始终与底图像素一致;空层在显示端隐藏,提交时若与旧层完全一致则跳过。 paint用所选颜色写入 RGB 并置 alpha=255;paint_erase/stamp_erase把笔画位置的 alpha 清为 0(不物理删除数组)。- 每次拖动画笔、橡皮或印章擦除的完整笔画提交一个
PaintOverlayEditCommand,同样只记录变化包围盒,undo/redo 只恢复该包围盒像素。
仿制印章算法
flowchart LR
R["右键取样:记录取样点并清除偏移锁"] --> L["左键落笔:锁定偏移 = 取样点 − 落笔点"]
L --> D["拖动:按 笔刷大小/4 间距插值逐点盖印"]
D --> Q["每点:目标 = 光标,源 = 目标 + 偏移"]
Q --> S["硬边圆形(半径 = 笔刷大小/2)写入印章层"]
S --> U["松开:整笔提交 PaintOverlayEditCommand(layer=stamp)"]
- 取样圈是画布顶层虚线圆,半径随笔刷大小变化;偏移锁定前停在取样点,锁定后跟随光标显示“源位置 = 光标 + 偏移”。
- 单点盖印是像素格对齐的硬边圆,圆内取复合源的 RGB 写入印章层并把 alpha 置 255,边缘不随拖动方向变化。
Escape或画布失焦会取消进行中的盖印,不提交。
显示与清除
- 蒙版显示用
build_mask_display_frame:二值蒙版转成红色(255,0,0)、alpha=128 的预乘 RGBA,预览按最大 200 万像素降采样;优化蒙版 z=11、原始蒙版 z=10。 - 画笔层 z=5、印章层 z=6,都在修复图(z=1)之上、文字区域之下;“显示画笔层/显示印章层”只切换
layer_visible,不删除数据。 - “清除所有蒙版”清空优化蒙版后照常触发自动修复;“清除画笔图层/清除印章图层”在有内容时提交清空命令,空层直接返回。
撤销与重做
蒙版笔画、清除所有蒙版、画笔/印章笔画和图层清除都进入同一个 QUndoStack:
MaskEditCommand:undo/redo 通过补丁或全量数组写回refined_mask;写回同样触发refined_mask_changed,因此撤销/重做蒙版编辑也会重新触发自动修复。PaintOverlayEditCommand:layer='paint'作用于画笔层,layer='stamp'作用于印章层;undo/redo 只改对应层像素,不触发修复。- 撤销粒度是“整笔”,不是单个取样点;
Ctrl+Z/Ctrl+Y的焦点规则见快捷键。
限制与注意事项
- 蒙版类工具依赖修复器配置可加载(模型、尺寸、精度);加载失败或模型缺失时蒙版仍会更新,但修复图不会刷新,日志记录错误。
- 画笔类工具左键总是绘制,不能点选或拖动区域;区域操作必须先切回“选择”。
- 切换页签会把活动工具切回新页签的“不选择”,蒙版画笔与彩色画笔不会同时处于活动状态。
Shift+滚轮调整的是三个页签共享的笔刷大小(5–200),不会缩放画布;Ctrl+滚轮调整选中区域字号,两者都归快捷键。- 仿制印章活动时右键被取样占用,右键菜单完全屏蔽;
Escape/失焦丢弃未提交笔画。 - 笔画数据按底图全分辨率保存(RGBA 层为 H×W×4),超大图片会占用较多内存;显示层会降采样,但落笔与盖印都在全分辨率进行。
- 画笔/印章层、优化蒙版都随导出写入工程文件;导出与回写格式见导入导出与回写。
