Files
AnyImage/docs/image-tools-technical.md
nan f42cba1932 Add image extraction functionality with background removal
- Implemented ExtractImageRegion operator for extracting image regions using box or lasso selection.
- Added RemoveImageRegionBackground job for background removal from selected image regions.
- Created utility functions for polygon bounds, selection canvas creation, and applying selection masks.
- Integrated image processing using PIL and numpy for efficient pixel manipulation.
- Enhanced user experience with modal drawing and status updates during extraction.
2026-08-22 15:47:34 +08:00

78 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Image 工具技术实现
Image Box、Lasso 与 Perspective 位于 `operators/image_extract/`。三者共享源图选择、设置、图片写回、空间定位、Continuous 分层和可选背景清理。
## 模块职责
```mermaid
flowchart LR
Box["box.py\nWorkspaceTool"] --> Region["region.py\nBox / Lasso Operator"]
Lasso["lasso.py\nWorkspaceTool"] --> Region
Perspective["perspective.py\n四点与透视矫正"]
Region --> Common["common.py\n共享选择、设置与结果写回"]
Perspective --> Common
Common --> Job["extract-image-background\n可选 BEN2 Job"]
```
`box.py` 与 `lasso.py` 只声明 WorkspaceTool。两者通过 `selection_shape` 复用 `ExtractImageRegion`;Perspective 保留独立 Operator,因为它还有四点输入、比例预览和 Homography。
## 首次点击
`resolve_image_extract_click()` 将首次点击归为两种结果:
| 点击目标 | 结果 |
| --- | --- |
| 另一张 Image Empty | 只选择并设为 Active |
| 当前 Active 图片、空白或非图片对象 | 使用当前 Active 图片开始取区 |
这段逻辑由三个工具共用。点击非图片对象后会恢复原选择,避免触发对象移动或更换源图。
## 处理管线
```mermaid
flowchart TD
Input["屏幕选区"] --> Pixels["转换到源图片像素坐标"]
Pixels --> Background{"Remove Background?"}
Background -- 否 --> Local["Blender 内处理 RGBA"]
Background -- 是 --> Server["选区画布 → BEN2 → 局部图片"]
Local --> Tool{"工具类型"}
Server --> Tool
Tool -- Box / Lasso --> Crop["Alpha bounds + Padding"]
Tool -- Perspective --> Warp["预乘 Alpha Homography"]
Warp --> Crop
Crop --> Result["创建并 Pack Image\n定位 Empty"]
```
Box 与 Lasso 将选区外 RGBA 清为透明黑,再按非零 Alpha 的最小范围裁切。Perspective 先将四点规范为沿源图 X/Y 方向的凸四边形,再按确认的宽高比重采样;点击顺序不参与输出旋转。
透视预览固定生成一次 512 × 512 临时 Image。鼠标移动只改变屏幕上的预览比例;确认后才执行全分辨率重采样。
## 背景清理
`extract-image-background` 与标准 `remove-background` Job 共用 `remove_image_background()`。图片工具的 Job 只增加三项选区语义:
- polygon mask;
- 局部图片在源图中的 bounds;
- Box / Lasso 使用的透明 Padding。
Perspective 请求的 Job Padding 固定为 0。局部结果回到 Blender 后先换算为源图坐标,再执行透视矫正和最终 Padding。
## Empty 定位与 Continuous
Box 与 Lasso 根据裁切前后的像素 bounds 换算 Empty 的中心和显示尺寸。Perspective 使用源四边形的轴对齐 bounds 近似放置结果。三者都沿用源 Empty 的矩阵,因此朝向与深度不变。
Continuous 关闭时直接更新源 Empty;开启时复制对象,并沿操作开始时捕获的 View 方向偏移:
```text
offset = display_size × world_scale × 0.001 × layer
```
`layer` 记录在源对象的 `_anyimage_extract_layer` Custom Property 中,使连续结果依次靠近当前 View。
## 维护约束
- WorkspaceTool 的显示设置放在 `box.py`、`lasso.py`、`perspective.py`。
- Box / Lasso 的共享交互放在 `region.py`,跨三个工具的行为放在 `common.py`。
- Blender 数据只在主线程 Operator 中读写;Server 参数保持为可序列化字典。
- 普通裁切不启动 Job Server;只有 Remove Background 需要 Environment 与 BEN2。