Files
AnyImage/docs/internals/operators/crop-tool.md
nan bdbde1a10d Refactor Cutout and Image Editing Logic
- Renamed "Base Plane Depth" to "Reference Depth" across validate_cutout.py for consistency.
- Introduced a new specification for Cutout mesh sampling to ensure source pixel spacing is preserved and limits are applied correctly.
- Unified naming conventions for image editing results to maintain consistency across Remove Background, Upscale, and Crop operations.
- Updated the handling of Refine Selection to ensure it retains the original bounds and does not apply unnecessary cropping.
- Enhanced material generation logic to connect image color directly to IOR Level, improving the rendering of dark areas.
- Established clear requirements for geometry depth controls and image result materials to ensure consistent behavior across different components.
- Removed outdated logic and ensured all changes are documented and tested for regression.
2026-09-03 01:02:10 +08:00

3.1 KiB
Raw Blame History

Crop Tool

工具栏保留两个独立 AnyImage 入口:四合一 Crop Tool 组与紧接其后的 Cutout Tool。Crop Tool 依次包含 Crop Box、Crop Lasso、Crop Polyline 和 Crop Perspective。

工具设置

四个子工具各自保存 Keep Original,默认关闭。关闭时结果替换源 Image Empty;开启时复制源对象承载结果,保留但取消选择原 Empty,并选择、激活新结果。

Crop Box、Crop Lasso 和 Crop Polyline 还分别保存 Invert;Box 与 Lasso 分别保存 Refine Selection。这些状态互不共享。Crop Perspective 没有 Invert 或 Refine Selection。Crop 不注册选项字母快捷键。

执行过程

flowchart TD
    Group["Crop Box / Lasso / Polyline / Perspective"]
    Group --> Kind{"Selection Crop?"}
    Kind -- "Box / Lasso / Polyline" --> Path["采集 SelectionPath"]
    Path --> Mask["栅格化 SelectionMask"]
    Mask --> Refine{"Box / Lasso Refine Selection?"}
    Refine -- "否" --> Local["源 Alpha × Selection"]
    Refine -- "是" --> Job["refine-image-selection<br/>保持 Selection bounds"]
    Job --> Refined["BEN2 Alpha × Selection"]
    Kind -- "Perspective" --> Quad["四点 Quad 与 Homography"]
    Local --> Result["创建结果 Image"]
    Refined --> Result
    Quad --> Result
    Result --> Keep{"当前子工具 Keep Original?"}
    Keep -- "否" --> Replace["替换源 Empty"]
    Keep -- "是" --> Copy["保留源 Empty<br/>选择并激活结果 Empty"]

Selection Crop

box.py、lasso.py 和 polyline.py 定义 WorkspaceTool,交互与落地集中在 selection.py。公共 CropSelectionGesture 从 common/viewport.py 读取当前子工具的独立设置,并把内存中的 SelectionPath 交给 CropImageSelection。

本地路径在几何 bounds 内把 Selection 值乘入源 Alpha,再按可见内容紧裁切。Box 或 Lasso 开启 Refine Selection 时,Operator 写出保留源 Alpha 的 bounds 矩形,并把已栅格化的 Selection Mask 保存为同一临时容器内的 Blender 本地 sidecar。server/jobs/refine_image_selection.py 返回与输入同尺寸的 Source Alpha × BEN2 Alpha RGBA;Blender 读取 sidecar,把 Selection 值乘入结果 Alpha,并以提交前的 bounds 创建结果 Image。Job request 只包含图片输入、模型和设备;Keep Original 在 Blender 主线程落地结果时执行。

Crop Perspective

perspective.py 接受任意顺序的四个角点并规范为凸 Quad,创建 512 × 512 预览,随后按目标宽高比执行分块 Homography。输出最长边不超过 8192 px,总像素不超过 16,777,216;插值使用预乘 Alpha,结果按可见 Alpha 紧裁切。

四种 Crop 最终都调用 common/image.py 的 place_empty_image_result()。该入口负责替换或复制 Image Empty、画布对齐、Collection 归属,以及 Keep Original 下选择并激活结果对象。

本地像素路径与 Refine Job 路径都通过公共 Image 编辑结果入口创建数据块。结果以源 Image 的完整名称请求命名,不移除 .png 等名称内容,也不添加材质贴图后缀;源 Image 被保留时产生的 .001 等数字后缀完全由 Blender 处理。