Files
AnyImage/docs/internals/operators/image-tool.md
nan c97b4a3e41 Add image selection refinement functionality with BEN2 integration
- Implemented viewport.py for handling 3D view projections, gestures, and overlay drawing.
- Created refine_image_selection.py to manage the refinement of gesture masks and output image bounds.
- Added selection module with refine_selection.py to process and crop images based on alpha channel visibility.
- Introduced __init__.py for selection module to expose refine_selection function.
2026-08-31 22:10:05 +08:00

2.4 KiB
Raw Blame History

Image Tool

Image Tool 从 Box、Lasso、Line 或 Polyline 手势得到一个图片 Selection,再用它修改当前 Image Empty 的 Alpha。

执行过程

flowchart TD
    Tool["Box / Lasso / Line / Polyline"] --> Gesture["采集图片空间手势"]
    Gesture --> Selection["SelectionPath → SelectionMask"]
    Selection --> Refine{"Refine Selection?"}
    Refine -- "否" --> Mask["使用本地 SelectionMask"]
    Refine -- "是" --> Job["refine-image-selection"]
    Job --> Mask
    Mask --> Alpha["源 Alpha × SelectionMask"]
    Alpha --> Crop["紧裁切并写回 Empty"]

四个工具共用 EditImageMask。Box 和 Lasso 可以执行 Refine Selection;Line 与 Polyline 始终保留几何边界,直接使用本地 SelectionMask。

节点说明

选择工具并采集手势

operators/image_tool/__init__.py 汇总注册类型;box.py、lasso.py、line.py 和 polyline.py 分别定义四个 WorkspaceTool。它们都把操作交给 edit_mask.py 中的 EditImageMask。

屏幕坐标投射、点击选择、轨迹预览和状态切换来自 common/viewport.py。Lasso 按移动距离采点并合并近似共线点;Line 扩展为有向半平面;Polyline 在确认时闭合路径。

SelectionPath → SelectionMask

EditImageMask 通过 common/selection.py 把手势整理为 SelectionPath,再栅格化为 SelectionMask。凹多边形使用三角剖分,自交路径使用 EVEN_ODD 填充。预览缓存只在轨迹变化时更新。

Box 和 Lasso 分别读取自己的 Refine Selection 设置。Line 与 Polyline 直接使用几何边界。

Refine Selection

未开启 Refine Selection 时,edit_mask.py 直接使用本地 SelectionMask。开启后,RefineImageSelection 把带 Selection Alpha 的局部 RGBA 提交给 server/jobs/refine_image_selection.py;Job 调用 server/selection/refine_selection.py 运行 BEN2,并返回收紧后的图片和 bounds。

响应阶段仍由 edit_mask.py 把局部结果映射回完整画布。

源 Alpha × SelectionMask

edit_mask.py 保留源 RGB,只把最终 SelectionMask 乘入源 Alpha,再按非零 Alpha 紧裁切。像素读取、结果 Image 创建和共享引用处理使用 common/image.py。

公共 Image Empty 替换入口同步更新 empty_display_size 和 empty_image_offset,使裁切后的内容对齐原图片平面并保持对象 matrix_world。