Files
AnyImage/docs/internals/operators/crop-tool.md

2.5 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"]
    Kind -- "Perspective" --> Quad["四点 Quad 与 Homography"]
    Local --> Result["创建结果 Image"]
    Job --> 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 矩形并提交 server/jobs/refine_image_selection.py;响应直接加载 BEN2 RGBA。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 下选择并激活结果对象。