{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"AnyImage","text":"
\u628a\u56fe\u7247\u91cc\u7684\u7a7a\u95f4\u611f\u5e26\u8fdb Blender\u3002
AnyImage \u662f\u4e00\u6b3e Blender \u6269\u5c55\uff0c\u53ef\u4ee5\u7c98\u8d34\u548c\u7f16\u8f91\u56fe\u7247\u3001\u521b\u5efa\u666e\u901a Plane \u6216 Depth Plane\u3001\u4ece\u5c40\u90e8\u9009\u533a\u751f\u6210 Cutout Shape\uff0c\u5e76\u5728\u72ec\u7acb AI Environment \u4e2d\u5b8c\u6210\u53bb\u80cc\u666f\u4e0e\u9ad8\u6e05\u653e\u5927\u3002
\u9875\u9762\u4f1a\u6309\u5f53\u524d\u7cfb\u7edf\u663e\u793a\u5bf9\u5e94\u7684\u5b89\u88c5\u5305\uff0c\u6309\u4f4f\u6309\u94ae\u62d6\u5230 Blender \u7a97\u53e3\u4efb\u610f\u4f4d\u7f6e\u5373\u53ef\u5b89\u88c5\u3002\u9996\u6b21\u62d6\u5165\u4f1a\u63d0\u793a\u6dfb\u52a0 AnyImage \u6269\u5c55\u4ed3\u5e93\uff0c\u786e\u8ba4\u540e\u91cd\u65b0\u62d6\u5165\u4e00\u6b21\uff0c\u4e4b\u540e\u5347\u7ea7\u540c\u6837\u76f4\u63a5\u62d6\u5165\u3002
\u62d6\u5165 Blender \u5b89\u88c5 Windows \u2013 78.3\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 Linux \u2013 71.0\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5"},{"location":"getting-started/installation/#_2","title":"\u68c0\u67e5\u6269\u5c55\u504f\u597d\u8bbe\u7f6e","text":"AnyImage \u7684\u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u6309\u529f\u80fd\u5206\u7ec4\u3002Environment \u533a\u5305\u542b\uff1a
.anyimage\uff0c\u4e00\u822c\u65e0\u9700\u4fee\u6539\u3002macOS arm64 \u63d0\u4f9b CPU \u4e0e CoreML\u3002CoreML \u7531\u7cfb\u7edf\u5728 Apple CPU\u3001GPU \u4e0e Neural Engine \u4e4b\u95f4\u8c03\u5ea6\uff0c\u4e0d\u662f PyTorch MPS backend\uff0c\u4e5f\u4e0d\u8868\u793a\u53ea\u4f7f\u7528 GPU\uff1b\u5b83\u7684\u5b9e\u9645\u901f\u5ea6\u53d6\u51b3\u4e8e\u6a21\u578b\u3002
Environment \u68c0\u6d4b\u540e\u663e\u793a Diagnostics\u3002Depth & Normal\u3001Remove Background\u3001Upscale \u4e0e Cutout \u662f\u9ed8\u8ba4\u5c55\u5f00\u7684\u53ef\u6298\u53e0\u529f\u80fd\u533a\uff0c\u5404\u81ea\u5305\u542b\u5bf9\u5e94\u8bbe\u7f6e\u548c\u6a21\u578b\u72b6\u6001\u3002\u5176\u4e2d\uff1a
Depth & Normal \u63d0\u4f9b\u4e09\u6863 MoGe-2\uff0cDepth Plane \u4e0e Cutout Depth / Normal Map \u5171\u7528\u5f53\u524d\u9009\u62e9\u3002\u53ef\u9009\u6a21\u578b\u7684 Ready \u72b6\u6001\u6216 Download \u6309\u94ae\u4f4d\u4e8e\u9009\u62e9\u9879\u4e0b\u65b9\uff1bCutout \u533a\u63d0\u4f9b\u72ec\u7acb\u7f51\u683c\u4e0a\u9650\u4e0e Balloon Profile\u3002
\u5982\u679c\u51c6\u5907\u628a Storage Root \u653e\u5230\u5176\u4ed6\u78c1\u76d8\uff0c\u5efa\u8bae\u5728\u9996\u6b21\u5b89\u88c5 Environment \u4e4b\u524d\u4fee\u6539\u3002\u66f4\u6362\u76ee\u5f55\u540e\uff0c\u65e7\u76ee\u5f55\u4e2d\u7684\u73af\u5883\u548c\u6a21\u578b\u4e0d\u4f1a\u81ea\u52a8\u79fb\u52a8\u3002
"},{"location":"getting-started/installation/#ai-environment","title":"\u914d\u7f6e AI Environment","text":"\u9009\u4e2d Image Empty\uff0c\u5728\u53f3\u952e AnyImage \u5b50\u83dc\u5355\u4e2d\u70b9\u51fb Set Up AI Environment\u2026\uff1b\u4e5f\u53ef\u4ee5\u5728 AnyImage \u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u4e2d\u70b9\u51fb\u540c\u540d\u6309\u94ae\u3002
\u786e\u8ba4\u5b89\u88c5\u524d\uff0c\u5bf9\u8bdd\u6846\u4f1a\u8bf4\u660e\u4ee5\u4e0b\u5185\u5bb9\uff1a
\u5b89\u88c5\u8fc7\u7a0b\u4e2d\u8bf7\u4fdd\u6301 Blender \u6253\u5f00\u3002\u72b6\u6001\u680f\u4f1a\u663e\u793a\u5f53\u524d\u9636\u6bb5\u3001\u8fdb\u5ea6\u548c\u4e0b\u8f7d\u901f\u5ea6\u3002
\u5982\u679c Environment \u5df2\u5b89\u88c5\u4f46\u4efb\u4e00\u9ed8\u8ba4\u6a21\u578b\u7f3a\u5931\uff0c\u5165\u53e3\u4f1a\u6539\u4e3a Download Required Models\u2026\uff1b\u5bf9\u8bdd\u6846\u5217\u51fa\u7f3a\u5931\u6a21\u578b\u548c\u4e0b\u8f7d\u4f53\u79ef\uff0c\u786e\u8ba4\u540e\u53ea\u4e0b\u8f7d\u7f3a\u5931\u6a21\u578b\uff0c\u4e0d\u4f1a\u91cd\u88c5 Environment \u6216\u91cd\u590d\u4e0b\u8f7d\u5df2\u5c31\u7eea\u5185\u5bb9\u3002
"},{"location":"getting-started/installation/#_3","title":"\u786e\u8ba4\u5b89\u88c5\u5b8c\u6210","text":"\u5b8c\u6210\u540e\u53ef\u4ee5\u7528\u4ee5\u4e0b\u65b9\u5f0f\u786e\u8ba4\uff1a
\u70b9\u51fb Convert to Depth Plane\u3001Remove Background \u6216 Upscale \u65f6\uff0cAnyImage \u4f1a\u6839\u636e\u72b6\u6001\u8fdb\u5165 Set Up AI Environment\u2026 \u6216 Download Required Models\u2026\u3002\u666e\u901a Plane\u3001Image \u7f16\u8f91\u548c\u57fa\u7840 Cutout Surface / Balloon \u76f4\u63a5\u5728 Blender \u4e2d\u6267\u884c\u3002
"},{"location":"getting-started/installation/#_4","title":"\u4e0b\u4e00\u6b65","text":"\u7ee7\u7eed\u9605\u8bfb\u4e94\u5206\u949f\u4e0a\u624b\uff0c\u7528\u4e00\u5f20\u56fe\u7247\u5b8c\u6210\u7b2c\u4e00\u6b21\u8f6c\u6362\u3002
"},{"location":"internals/","title":"\u5185\u90e8\u5b9e\u73b0\u603b\u89c8","text":"AnyImage \u5728 Blender \u4e3b\u7ebf\u7a0b\u5904\u7406\u4ea4\u4e92\u3001\u50cf\u7d20\u7f16\u8f91\u548c\u6570\u636e\u521b\u5efa\uff0c\u901a\u8fc7 BlendJob \u628a\u6a21\u578b\u63a8\u7406\u4ea4\u7ed9\u72ec\u7acb Job Server\u3002
\u4e3b\u9898 \u5bf9\u5e94\u804c\u8d23 \u7a0b\u5e8f\u67b6\u6784 \u8fdb\u7a0b\u3001\u6ce8\u518c\u3001\u914d\u7f6e\u4e0e\u4e3b\u7ebf\u7a0b\u8fb9\u754c Common Blender \u4fa7\u56fe\u50cf\u3001\u624b\u52bf\u3001\u51e0\u4f55\u4e0e AI \u516c\u5171\u80fd\u529b Runtime \u4e0e Server Environment\u3001Job\u3001\u6a21\u578b\u4e0b\u8f7d\u4e0e Session \u751f\u547d\u5468\u671f Job \u4ea7\u7269 \u6587\u4ef6\u534f\u8bae\u3001\u76f8\u673a\u5750\u6807\u548c Blender \u6d88\u8d39\u65b9\u5f0f Operator \u7d22\u5f15 \u6309\u5b9e\u9645\u7528\u6237\u529f\u80fd\u67e5\u627e\u5b9e\u73b0 \u8282\u70b9\u8d44\u4ea7 \u8d44\u4ea7\u3001\u6e90\u7801\u804c\u8d23\u3001\u6784\u5efa\u548c\u9a8c\u8bc1 \u5f00\u53d1\u4e0e\u53d1\u5e03 \u6d4b\u8bd5\u7ec4\u7ec7\u3001\u5de5\u5177\u547d\u4ee4\u4e0e\u53d1\u5e03\u6d41\u7a0b\u6e90\u7801\u4f4d\u4e8e src/anyimage/\uff0c\u5f00\u53d1\u5de5\u5177\u4f4d\u4e8e tools/\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u4f4d\u4e8e tests/\u3002\u6269\u5c55\u7ea7\u8bbe\u7f6e\u7531 preferences.py \u5b9a\u4e49\uff0c\u8fd0\u884c\u65f6\u8d44\u6e90\u7531 runtime.py \u63a5\u5165 BlendJob\u3002
__init__.py \u6ce8\u518c\u7c7b\u578b\u3001\u5de5\u5177\u3001\u83dc\u5355\u3001\u5feb\u6377\u952e\u4e0e Runtime menu.py\u3001panel.py Image Empty \u4e0e Shader Image Texture \u4e0a\u4e0b\u6587\u83dc\u5355\u4e0e Job Server \u9762\u677f preferences.py \u6269\u5c55\u8bbe\u7f6e\u53ca\u8bfb\u53d6\u5165\u53e3 properties.py Scene \u624b\u52bf\u72b6\u6001\u3001\u6a21\u578b\u72b6\u6001\u67e5\u8be2\u3001\u679a\u4e3e\u4e0e Operator \u5c5e\u6027\u6784\u9020 common/ Blender \u4fa7\u516c\u5171\u80fd\u529b operators/ \u4ea4\u4e92\u3001\u4efb\u52a1\u53c2\u6570\u3001\u7ed3\u679c\u5bfc\u5165\u548c Undo server/ \u72ec\u7acb\u73af\u5883\u5185\u7684\u5a92\u4f53\u5904\u7406\u3001\u63a8\u7406\u548c\u4ea7\u7269\u5199\u51fa"},{"location":"internals/architecture/#_2","title":"\u6ce8\u518c\u4e0e\u914d\u7f6e","text":"\u6ce8\u9500\u5148\u5173\u95ed Runtime\u3001\u5feb\u6377\u952e\u4e0e\u5de5\u5177\uff0c\u518d\u79fb\u9664\u83dc\u5355\u548c Scene \u5c5e\u6027\uff0c\u6309 CLASSES \u9006\u5e8f\u6ce8\u9500\u7c7b\u578b\u3002\u8bbe\u5907\u3001\u5b58\u50a8\u76ee\u5f55\u3001\u6a21\u578b\u3001\u6750\u8d28\u663e\u793a\u9002\u914d\u548c\u529f\u80fd\u4e0a\u9650\u7edf\u4e00\u901a\u8fc7 preferences.py \u8bfb\u53d6\u3002
Maximum AI Input Size \u9650\u5236\u6a21\u578b\u5206\u6790\u8f93\u5165\u548c Upscale \u53ef\u63d0\u4ea4\u6e90\u56fe\u7684\u957f\u8fb9\uff1bMaximum Frame Resolution \u9650\u5236 Frame \u8f93\u51fa\u957f\u8fb9\uff1bMinimum Relative Edge Length \u4e0e Boundary Padding \u63a7\u5236 Cutout \u7684\u7f51\u683c\u5bc6\u5ea6\u548c\u8f6e\u5ed3\u8fb9\u754c\u91c7\u6837\u3002
"},{"location":"internals/architecture/#_3","title":"\u6267\u884c\u8fb9\u754c","text":"flowchart TD\n A[Operator \u5728\u4e3b\u7ebf\u7a0b\u8bfb\u53d6 Blender \u6570\u636e] --> B[\u51c6\u5907\u8f93\u5165\u6587\u4ef6]\n B --> C[request \u8fd4\u56de\u666e\u901a\u5b57\u5178]\n C --> D[BlendJob \u961f\u5217\u6267\u884c Server Job]\n D --> E[\u6a21\u578b\u4e0e\u5a92\u4f53\u5904\u7406\u5199\u5165 Job \u76ee\u5f55]\n E --> F[\u4e3b\u7ebf\u7a0b response \u52a0\u8f7d\u7ed3\u679c]\n F --> G[\u63d0\u4ea4 Image \u6216 Object \u4fee\u6539\u53ca Undo]\n G --> H[\u6e05\u7406\u4e34\u65f6\u8f93\u5165] Plane\u3001Frame\u3001Mask\u3001Rectify \u548c\u65e0\u9700 AI \u7684 Cutout \u5728 Blender \u5185\u6267\u884c\u3002Server \u7684 jobs/ \u7f16\u6392\u4efb\u52a1\uff0cmodels/ \u8d1f\u8d23\u6a21\u578b\u9002\u914d\uff0cgeometry/ \u5904\u7406\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u4ea7\u7269\u3002Server \u6a21\u5757\u901a\u8fc7\u5185\u90e8\u76f8\u5bf9\u5bfc\u5165\u5171\u4eab\u80fd\u529b\uff0cBlender \u4fa7\u901a\u8fc7 common/ \u590d\u7528\u3002
MoGe-2 \u4e0e MoGe-3 \u8f93\u51fa\u7edf\u4e00\u4e3a GeometryFrame\uff1a\u5305\u542b Depth\u3001Validity\u3001Intrinsics\uff0c\u4ee5\u53ca\u6309\u9700\u63d0\u4f9b\u7684 Normal \u548c Points\u3002\u4ea7\u7269\u5199\u5165\u5668\u6d88\u8d39\u540c\u4e00\u4e2a Frame\uff0c\u4fdd\u6301\u6df1\u5ea6\u3001\u6cd5\u7ebf\u548c\u76f8\u673a\u6570\u636e\u4e00\u81f4\u3002\u53c2\u89c1 Runtime \u4e0e \u4ea7\u7269\u534f\u8bae\u3002
src/anyimage/common/ \u6309\u4e1a\u52a1\u804c\u8d23\u63d0\u4f9b\u516c\u5171\u51fd\u6570\uff0c\u8c03\u7528\u65b9\u4ece\u5bf9\u5e94\u6a21\u5757\u76f4\u63a5\u5bfc\u5165\u3002
ai.py \u73af\u5883\u548c\u6a21\u578b\u5c31\u7eea\u68c0\u67e5\u3001\u8f93\u5165\u8def\u5f84\u6821\u9a8c\u3001production_device()\u3001moge2_parameters() \u4e0e\u5b89\u88c5 UI image.py image_rgba()\u3001Image User \u5e27\u8bbe\u7f6e\u8bfb\u53d6\u3001Job \u8f93\u5165\u51c6\u5907\u3001\u50cf\u7d20\u91c7\u6837\u3001\u7ed3\u679c Image \u548c replace_empty_image() color_image.py \u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u7684\u51c6\u5907\u548c\u6e05\u7406 hdr_image.py HDR \u53bb\u80cc\u666f\u5206\u6790\u8f93\u5165\u53ca\u6d6e\u70b9\u989c\u8272\u4fdd\u7559 image_target.py Image Empty \u4e0e Shader Image Texture \u7f16\u8f91\u76ee\u6807 selection.py SelectionPath\u3001SelectionMask\u3001non-zero winding \u6805\u683c\u5316\u4e0e Alpha \u4fee\u6574 viewport.py \u539f\u751f\u70b9\u9009\u3001\u5c4f\u5e55\u6295\u5f71\u3001ImageGesture\u3001Lasso / Brush / Polyline \u4e0e Overlay depth.py \u6df1\u5ea6\u56fe\u7247\u548c\u5143\u6570\u636e\u52a0\u8f7d\u3001\u76f8\u673a\u5750\u6807\u4e0e\u663e\u793a\u8303\u56f4\u7684\u5c3a\u5ea6\u6362\u7b97 material.py Image Layer\u3001Normal\u3001Alpha\u3001Shadeless \u4e0e Depth \u6750\u8d28 object.py Modifier \u8f93\u5165\u8bbe\u7f6e\u4e0e\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u3001\u6e90\u5bf9\u8c61\u66ff\u6362 node.py node_asset_path() \u4e0e load_node_group()"},{"location":"internals/common/#_1","title":"\u56fe\u50cf\u751f\u547d\u5468\u671f","text":"\u4e1a\u52a1\u50cf\u7d20\u91c7\u7528 Top-down RGBA\uff0cimage_pixels() \u4f7f\u7528 Blender \u50cf\u7d20\u987a\u5e8f\u3002\u9884\u4e58\u91c7\u6837\u7528\u4e8e\u6295\u5f71\u63d2\u503c\uff1b\u6587\u4ef6\u6216 Packed \u56fe\u50cf\u7684\u4e1a\u52a1\u8bfb\u53d6\u4fdd\u7559\u9690\u85cf RGB\u3002ImageEditTarget \u6821\u9a8c\u76ee\u6807\u8eab\u4efd\u540e\u7ecf replace_empty_image() \u6216 replace_texture_image() \u63d0\u4ea4\uff1a\u672a\u5171\u4eab\u7684 Image \u539f\u5730\u66ff\u6362\u5185\u5bb9\uff0c\u5171\u4eab\u65f6\u6539\u7528\u65b0\u7684 Image \u6570\u636e\u5757\uff0c\u5931\u8d25\u65f6\u56de\u6eda\u6e90\u6570\u636e\u3002
prepare_image_input() \u8fd4\u56de\u8def\u5f84\u53ca\u4e34\u65f6\u6807\u8bb0\uff1bcleanup_image_input() \u4e0e\u521b\u5efa\u65b9\u914d\u5bf9\u3002color_image.py \u7684 prepare_material_color_input() \u51c6\u5907\u6750\u8d28\u989c\u8272\uff0cmaterial_analysis_input() \u63d0\u4f9b\u5206\u6790\u8f93\u5165\uff1bCutout \u6309\u51e0\u4f55 bounds \u88c1\u5207\u3002
flowchart TD\n A[\u539f\u751f\u5bf9\u8c61\u70b9\u9009] --> B[ImageGesture \u51bb\u7ed3\u6e90\u56fe\u4e0e\u4ea4\u4e92\u72b6\u6001]\n B --> C[\u5c4f\u5e55\u8def\u5f84\u4e0e Overlay]\n C --> D[\u63d0\u4ea4\u65f6\u6295\u5f71\u5230\u56fe\u7247\u7a7a\u95f4]\n D --> E[SelectionPath]\n E --> F[\u5c40\u90e8 non-zero winding \u6805\u683c\u5316]\n F --> G[SelectionMask values \u4e0e bounds]\n G --> H[Mask Alpha \u8fd0\u7b97\u6216 Cutout \u5185\u5bb9\u8f6e\u5ed3] Brush \u7684\u5706\u5f62\u5370\u8bb0\u548c\u8fde\u63a5\u6761\u7531 brush_footprint_polygons() \u751f\u6210\uff0c\u4f9b\u9884\u89c8\u4e0e\u63d0\u4ea4\u5171\u7528\u3002\u62d6\u52a8\u65f6\u7ef4\u62a4\u5c4f\u5e55\u8def\u5f84\u4e0e\u5c40\u90e8 Overlay\uff0c\u63d0\u4ea4\u65f6\u751f\u6210\u8986\u76d6\u503c\u3002Mask\u3001Rectify \u4e0e Cutout \u7684\u7a7a\u547d\u4e2d\u4fdd\u7559 active Image Empty\uff1b\u70b9\u4e2d\u53e6\u4e00\u5bf9\u8c61\u65f6\u5b8c\u6210\u539f\u751f\u9009\u62e9\u3002
create_image_material() \u6309 Shadeless\u3001Normal \u548c Depth \u7ec4\u5408\u8282\u70b9\u3001\u8fde\u63a5\u989c\u8272\u4e0e Alpha\uff1b\u6750\u8d28\u663e\u793a\u9002\u914d\u8bfb\u53d6\u5f53\u524d Preferences\u3002set_modifier_input() \u6309\u5b9e\u9645 RNA \u8f93\u5165\u5f62\u5f0f\u8bbe\u7f6e\u503c\uff0cfinalize_object_result() \u5b8c\u6210\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u548c\u6e90\u5bf9\u8c61\u5904\u7406\u3002Image \u66ff\u6362\u8def\u5f84\u4fdd\u7559 Empty \u7684\u77e9\u9635\u3001\u663e\u793a\u5c3a\u5bf8\u3001\u504f\u79fb\u548c Image User \u5e27\u8bbe\u7f6e\u3002
Geometry Nodes \u4ece src/anyimage/assets/O_AnyImage.blend \u6309\u516c\u5f00\u540d\u79f0\u52a0\u8f7d\u3002\u6784\u5efa\u4e0e\u5e03\u5c40\u804c\u8d23\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6df1\u5ea6\u5b57\u6bb5\u89c1Job \u4ea7\u7269\u3002
\u4ed3\u5e93\u4f7f\u7528 CPython 3.11 \u4e0e bpy==4.5.3 \u6d4b\u8bd5 Blender \u4ee3\u7801\uff1bAI Server \u4f7f\u7528 runtime.py \u58f0\u660e\u7684\u72ec\u7acb Python 3.12 Environment\u3002
uv sync\nuv run pytest\n"},{"location":"internals/development/#_2","title":"\u6d4b\u8bd5\u7ec4\u7ec7","text":"\u6d4b\u8bd5\u8303\u56f4 \u6587\u4ef6 \u6269\u5c55\u6ce8\u518c\u3001\u8bbe\u7f6e\u3001\u5b89\u88c5\u548c Job \u4ea4\u4e92 test_addon_registration.py\u3001test_preferences.py\u3001test_ai_setup.py\u3001test_job_operator.py Frame\u3001Mask\u3001Rectify\u3001Plane\u3001Cutout \u5bf9\u5e94 test_*_tool.py\u3001test_*_operators.py \u4e0e\u5bf9\u8c61\u3001\u6295\u5f71\u3001\u7f51\u683c\u6d4b\u8bd5 \u56fe\u50cf\u8eab\u4efd\u3001Alpha\u3001\u6750\u8d28\u4e0e Undo \u56fe\u50cf\u7f16\u8f91\u96c6\u6210\u3001\u5171\u4eab\u66ff\u6362\u3001\u6750\u8d28\u9002\u914d\u4e0e Undo \u6d4b\u8bd5 Server test_job_server.py\u3001test_server_jobs.py\u3001test_input_validation.py\u3001test_geometry_artifacts.py \u6a21\u578b test_model_manager.py\u3001\u4e0b\u8f7d\u3001\u63a8\u7406\u4e0e\u5404 ONNX \u6a21\u578b\u6d4b\u8bd5 \u8282\u70b9\u8d44\u4ea7 \u5e03\u5c40\u4e0e\u63a5\u53e3\u7b49\u4ef7\u3001\u51e0\u4f55\u6c42\u503c\u3001Cutout \u4e0e\u4e34\u65f6\u5c5e\u6027\u6e05\u7406 \u5de5\u5177\u4e0e\u5305\u534f\u8bae \u6269\u5c55 Manifest\u3001\u6253\u5305\u3001\u6a21\u578b\u540c\u6b65\u4e0e\u8282\u70b9\u542f\u52a8\u5668 Blender Stub \u5171\u7528 tests/support/blender.py\uff1bServer \u548c\u5b9e\u9645 Blender \u51e0\u4f55 fixture \u6309\u4f7f\u7528\u8303\u56f4\u5b58\u653e\u5728\u5bf9\u5e94 support \u6a21\u5757\u3002\u6d4b\u8bd5\u547d\u540d\u63cf\u8ff0\u529f\u80fd\u3001\u89e6\u53d1\u6761\u4ef6\u4e0e\u53ef\u89c2\u5bdf\u7ed3\u679c\u3002
uv run pack \u751f\u6210 Windows\u3001macOS arm64\u3001Linux \u6269\u5c55\u5305 uv run pack --prepare \u4e3a\u672c\u673a\u540c\u6b65\u6269\u5c55 wheel \u4e0e Manifest uv run node-group build \u6784\u5efa\u3001\u9a8c\u8bc1\u8282\u70b9\u8d44\u4ea7\u5e76\u8fd0\u884c\u6d4b\u8bd5 uv run model sync \u51c6\u5907\u3001\u6821\u9a8c\u5e76\u4e0a\u4f20\u6a21\u578b\u58f0\u660e\u7684\u6587\u4ef6 uv run docs -dev \u672c\u5730\u9884\u89c8\u6587\u6863 uv run docs \u901a\u8fc7 Mike \u53d1\u5e03\u9879\u76ee\u7248\u672c\u5e76\u66f4\u65b0 latest tools/pack.py \u4ece pyproject.toml \u8bfb\u53d6\u4f9d\u8d56\uff0c\u6309\u5e73\u53f0\u4e0e Blender Python \u7248\u672c\u89e3\u6790 wheel\uff0c\u4f7f\u7528 Blender \u63d0\u4f9b\u7684 NumPy\u3002\u4ea7\u7269\u547d\u540d\u4e3a AnyImage.v<version>.<platform>.zip\uff0c\u5199\u5165 dist/\u3002\u672c\u5730 BlendJob wheel \u5185\u5bb9\u53d8\u5316\u540e\u8fd0\u884c uv lock --refresh\uff0c\u5e76\u6838\u5bf9\u9501\u6587\u4ef6\u3001Manifest \u4e0e\u6253\u5305\u6d4b\u8bd5\u3002
tools/models/cli.py \u6839\u636e\u6a21\u578b\u76ee\u5f55\u9009\u62e9\u4e0a\u6e38 ONNX \u6216\u672c\u5730\u5bfc\u51fa\u6d41\u7a0b\uff1btools/models/exports.py \u5904\u7406\u5bf9\u5e94 PyTorch \u6743\u91cd\u5bfc\u51fa\u3002\u6587\u4ef6\u6821\u9a8c\u4f9d\u636e\u58f0\u660e\u5927\u5c0f\u548c SHA-256\uff0c\u4e0a\u4f20\u4f7f\u7528\u9010\u6587\u4ef6\u590d\u5236\u3002uv run model prepare \u7528\u4e8e\u672c\u5730\u51c6\u5907\u3002
flowchart TD\n A[main push\u3001Pull Request \u6216\u624b\u52a8\u89e6\u53d1] --> B[test.yml \u8fd0\u884c\u6d4b\u8bd5]\n C[v \u524d\u7f00 Tag] --> D[build.yml \u6d4b\u8bd5\u3001\u6253\u5305\u5e76\u53d1\u5e03 ZIP]\n E[main \u6587\u6863\u8def\u5f84\u53d8\u5316\u6216\u624b\u52a8\u89e6\u53d1] --> F[docs.yml \u6784\u5efa\u7ad9\u70b9\u5e76\u90e8\u7f72\u5230 Cloudflare Workers] \u7ad9\u70b9\u5bfc\u822a\u7531 mkdocs.yml \u663e\u5f0f\u7ef4\u62a4\uff0c\u9875\u9762\u79fb\u52a8\u65f6\u540c\u6b65\u5bfc\u822a\u548c\u76f8\u5bf9\u94fe\u63a5\u3002\u8282\u70b9\u8d44\u4ea7\u7684\u811a\u672c\u804c\u8d23\u53ca\u68c0\u67e5\u5165\u53e3\u89c1\u8282\u70b9\u8d44\u4ea7\u3002
\u8282\u70b9\u7ec4\u7531 tools/nodes/groups/ \u4e2d\u7684\u6784\u5efa\u6a21\u5757\u5b9a\u4e49\u3002
O Image Plane image_plane.py O Image Depth Plane image_depth_plane.py O Image Relief Plane image_relief_plane.py O Image Cutout image_cutout.py O Image Depth Cutout image_depth_cutout.py O Image Cutout Symmetry image_cutout_symmetry.py O Image Layer image_layer.py O Image Depth Layer image_depth_layer.py O Shadeless shadeless.py O Image Depth Panorama image_depth_panorama.py"},{"location":"internals/node-assets/#_3","title":"\u6784\u5efa\u8282\u70b9\u8d44\u4ea7","text":"\u751f\u4ea7\u8282\u70b9\u7ec4\u7531 uv run node-group build \u6784\u5efa\u5230 src/anyimage/assets/O_AnyImage.blend
\u8282\u70b9\u7ec4\u89c4\u5219\uff1a
_o_ \u524d\u7f00\uff0c\u5728\u6700\u540e\u6d88\u8d39\u8005\u4e4b\u540e\u7528\u901a\u914d\u7b26 _o_* \u6e05\u7406\uff0c\u4fdd\u7559 UV\u3001\u7528\u6237\u5c5e\u6027\u548c\u5916\u90e8\u534f\u8bae\u5c5e\u6027\u3002\u6e05\u7406\u5fc5\u987b\u8d70 remove_attribute_pattern\uff1a\u6309\u7cbe\u786e\u540d\u79f0\u5220\u9664\u65f6\uff0c\u82e5\u67d0\u4e2a\u51e0\u4f55\u5206\u652f\u4ece\u672a\u5199\u5165\u8be5\u5c5e\u6027\uff0cRemove Named Attribute \u4f1a\u62a5\u51fa\u7f3a\u5931\u8b66\u544aname \u548c\u6807\u9898\uff0c\u4e0d\u7528 label \u8986\u76d6\uff0c\u4e0d\u7528 String \u8282\u70b9\u6ce8\u89e3\u3002Frame \u4ec5\u7528\u4e8e\u786e\u6709\u5305\u88f9\u8bed\u4e49\u7684\u533a\u57dfSINGLEsubtype \u6309\u4e1a\u52a1\u8bed\u4e49\u8bbe\u7f6e\uff1a\u957f\u5ea6\u7528 DISTANCE\uff0c0\u20131 \u6bd4\u4f8b\u7528 FACTOR\uff0c0\u2013100 \u7528 PERCENTAGE\uff1b\u65e0\u5bf9\u5e94\u8303\u56f4\u8bed\u4e49\u65f6\u4fdd\u7559\u9ed8\u8ba4tools/nodes/build.py \u6309\u4f9d\u8d56\u987a\u5e8f\u6784\u5efa\u8d44\u4ea7\uff0c\u8c03\u7528 arrangement/ \u7edf\u4e00\u6392\u5217\u51e0\u4f55\u8282\u70b9\u7ec4\u540e\u4fdd\u5b58\u3002common/ \u63d0\u4f9b\u5171\u7528\u6784\u5efa\u51fd\u6570\uff1anodes.py \u521b\u5efa\u63a5\u53e3\u4e0e\u8282\u70b9\uff0cdepth_surface.py\u3001cutout.py \u7b49\u7ec4\u88c5\u51e0\u4f55\uff0cshader.py \u6784\u5efa\u6750\u8d28\u7740\u8272\u8282\u70b9\uff0cmaterial_slots.py \u7ee7\u627f\u51e0\u4f55\u6750\u8d28\u69fd\uff1btools/nodes/preview/ \u5bfc\u51fa\u4ea4\u4e92\u9884\u89c8\u3002
\u4fdd\u5b58\u540e\uff0ccheck.py \u5728\u72ec\u7acb Blender \u8fdb\u7a0b\u4e2d\u91cd\u65b0\u52a0\u8f7d\u8d44\u4ea7\u5e76\u505a\u57fa\u672c\u51e0\u4f55\u6c42\u503c\u3002\u63a5\u53e3\u3001\u9ed8\u8ba4\u503c\u548c\u8be6\u7ec6\u51e0\u4f55\u884c\u4e3a\u7531 tests/ \u68c0\u67e5\u3002
uv run node-group build --blender \"/path/to/blender\"\nuv run node-group build --skip-tests\nuv run node-group check\nuv run node-group preview\n \u811a\u672c\u6309 --blender\u3001\u73af\u5883\u53d8\u91cf BLENDER_BIN\u3001\u9879\u76ee .env\u3001PATH \u7684\u987a\u5e8f\u67e5\u627e Blender\u3002\u65e0\u6cd5\u81ea\u52a8\u627e\u5230\u65f6\uff0c\u5728\u9879\u76ee\u6839\u76ee\u5f55\u7684 .env \u4e2d\u914d\u7f6e\uff1a
BLENDER_BIN=\"/absolute/path/to/blender\"\n"},{"location":"internals/outputs/","title":"Job \u4ea7\u7269","text":"Server \u5c06\u7ed3\u679c\u5199\u5165 Job \u76ee\u5f55\uff0c\u8fd4\u56de\u4ee5\u76f8\u5bf9\u6587\u4ef6\u540d\u4e3a\u503c\u7684\u5b57\u5178\u3002Blender \u4e3b\u7ebf\u7a0b\u901a\u8fc7 JobResult \u8bfb\u53d6\u6587\u4ef6\uff0c\u521b\u5efa\u6216\u66f4\u65b0 Image\u3001Mesh\u3001Material \u548c Object\u3002
Job \u6587\u4ef6 \u6d88\u8d39\u65b9remove-background foreground.png \u6216 alpha.npy ImageEditTarget \u6216 HDR Alpha \u7f16\u8f91 upscale-image upscale.png \u56fe\u50cf\u66ff\u6362 generate-depth-plane-geometry depth.exr\u3001depth.json \u548c\u6cd5\u7ebf Depth / Relief Plane generate-cutout-artifacts \u6309\u8bf7\u6c42\u63d0\u4f9b\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf Cutout generate-panorama-geometry depth.exr\u3001depth.json Panorama"},{"location":"internals/outputs/#_1","title":"\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u534f\u8bae","text":"\u8fd4\u56de\u5b57\u6bb5 \u5185\u5bb9 depth float32 EXR\uff0c\u900f\u89c6\u4ea7\u7269 RGB \u4fdd\u5b58\u76f8\u673a\u7a7a\u95f4 XYZ\uff0cAlpha \u4fdd\u5b58\u6e90 Alpha \u00d7 \u6a21\u578b\u6709\u6548\u6027 depth_metadata JSON\uff0c\u5305\u542b image_size \u4e0e 3\u00d73 intrinsics tangent_normal tangent-normal.png\uff0c\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf object_normal object-normal.png\uff0c\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf flowchart TD\n A[\u6e90 RGB \u4e0e Alpha] --> B[\u9650\u5c3a\u5bf8 RGB \u63a8\u7406]\n B --> C[GeometryFrame]\n C --> D[\u5199\u51fa\u6df1\u5ea6\u4e0e\u6cd5\u7ebf]\n A --> E[\u6e90 Alpha \u5199\u5165\u6709\u6548\u901a\u9053]\n E --> D\n D --> F[Blender \u52a0\u8f7d\u5e76 Pack] \u53c2\u8003\u6df1\u5ea6\u7531 common/depth.py \u4ece\u4ea7\u7269\u8ba1\u7b97\uff1a\u5148\u6309 Alpha \u9608\u503c\u548c\u6709\u9650\u6b63\u6df1\u5ea6\u7b5b\u9009\u6837\u672c\uff0c\u5254\u9664\u8d85\u8fc7\u6837\u672c\u4e2d\u4f4d\u6570 1.1 \u500d\u7684\u8fdc\u5904\u80cc\u666f\uff0c\u518d\u53d6 95 \u5206\u4f4d\u6570\uff1b\u65e0\u53ef\u7528\u6837\u672c\u65f6\u8fd4\u56de\u57fa\u51c6\u503c\u3002\u52a0\u8f7d\u540e\u8bbe\u7f6e Non-Color \u548c CHANNEL_PACKED\u3002Depth Plane \u4f7f\u7528\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\uff0cRelief Plane \u4f7f\u7528\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u3002
Panorama \u7684 EXR RGB \u4fdd\u5b58\u5f84\u5411\u8ddd\u79bb\uff0cAlpha \u4fdd\u5b58\u6e90 Alpha \u4e0e\u878d\u5408\u6709\u6548\u6027\uff1b\u5143\u6570\u636e\u5305\u542b projection: equirectangular \u548c image_size\u3002
common/color_image.py \u4e3a Plane\u3001Panorama \u548c Cutout \u51c6\u5907\u72ec\u7acb\u7684\u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u3002Cutout \u4f7f\u7528 Selection bounds \u5185\u7684\u6e90\u56fe\uff1b\u7f51\u683c\u521b\u5efa\u65f6\u7ec4\u5408\u6e90 Alpha \u4e0e SelectionMask\u3002\u989c\u8272\u5206\u8fa8\u7387\u4e0e\u5206\u6790\u5c3a\u5bf8\u5206\u522b\u5904\u7406\u3002
ImageEditTarget \u7edf\u4e00 Image Empty \u548c Shader Image Texture \u7684\u7f16\u8f91\u76ee\u6807\u53ca\u5171\u4eab\u5f15\u7528\u3002HDR \u53bb\u80cc\u666f\u901a\u8fc7 HdrBackgroundInput \u4fdd\u7559 Blender \u6d6e\u70b9 RGB\uff0c\u5e76\u5e94\u7528 Server \u8fd4\u56de\u7684\u8fde\u7eed Alpha\u3002
runtime.py \u914d\u7f6e BlendJob JobRuntime \u548c\u72ec\u7acb Python 3.12 Environment\u3002server/app.py \u6ce8\u518c Job\uff0cmodel_manager.py \u7ba1\u7406\u6a21\u578b\u6587\u4ef6\u4e0e\u7f13\u5b58 Session\u3002
flowchart TD\n A[Operator request] --> B[JobRuntime \u961f\u5217]\n B --> C[Server Job \u8c03\u7528\u5a92\u4f53\u4e0e\u6a21\u578b\u6a21\u5757]\n C --> D[\u5199\u5165 Job \u76ee\u5f55]\n D --> E[\u4e3b\u7ebf\u7a0b response \u5bfc\u5165\u7ed3\u679c] Job \u5b9e\u73b0\u4e0e\u7528\u9014 download-model\u3001download-required-models app.py \u4e0b\u8f7d\u5355\u4e2a\u6216\u7f3a\u5931\u6a21\u578b remove-background jobs/remove_background.py \u751f\u6210\u900f\u660e\u524d\u666f\u6216\u8fde\u7eed Alpha upscale-image jobs/upscale.py \u751f\u6210 2\u00d7 \u56fe\u50cf generate-depth-plane-geometry jobs/depth_plane.py \u751f\u6210\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf generate-cutout-artifacts jobs/cutout.py \u6309\u8bf7\u6c42\u751f\u6210\u6df1\u5ea6\u548c\u6cd5\u7ebf generate-panorama-geometry jobs/panorama.py \u751f\u6210\u5168\u666f\u5f84\u5411\u6df1\u5ea6 media/ \u6821\u9a8c\u8f93\u5165\u56fe\u7247\u5e76\u9650\u5236\u5206\u6790\u5c3a\u5bf8\uff0cServer \u53ea\u5904\u7406\u9759\u6001\u56fe\u7247\u3002Job \u5728\u9636\u6bb5\u8fb9\u754c\u68c0\u67e5\u53d6\u6d88\uff0c\u901a\u8fc7 context.progress() \u8fd4\u56de\u8fdb\u5ea6\uff0cOperator \u6e05\u7406 Blender \u5bfc\u51fa\u7684\u4e34\u65f6\u8f93\u5165\u3002
geometry/prediction_artifacts.py \u7f29\u653e\u6e90 RGB \u540e\u8fd0\u884c\u4e00\u6b21 MoGe\uff0c\u5c06\u540c\u4e00\u9884\u6d4b\u4ea4\u7ed9\u6df1\u5ea6\u3001\u6cd5\u7ebf\u548c\u5143\u6570\u636e\u5199\u5165\u5668\uff1b\u6e90 Alpha \u5199\u5165\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u4ea7\u7269\u7684\u6709\u6548\u901a\u9053\u3002\u53c2\u8003\u6df1\u5ea6\u7531 Blender \u4fa7\u6309\u4ea7\u7269 Alpha \u8ba1\u7b97\uff0c\u6587\u4ef6\u534f\u8bae\u89c1 Job \u4ea7\u7269\u3002
model_catalog.py \u58f0\u660e\u6587\u4ef6\u6765\u6e90\u3001\u8bb8\u53ef\u3001\u5927\u5c0f\u548c SHA-256\uff1bmodel_download.py \u4e0b\u8f7d\u5e76\u6821\u9a8c\u3002ModelManager \u6309\u6a21\u578b\u8def\u5f84\u548c\u8bbe\u5907\u7f13\u5b58 Session\uff0c\u5207\u6362\u6a21\u578b\u6216\u8bbe\u5907\u65f6\u91ca\u653e\u5bf9\u5e94\u7c7b\u522b\u3002Clear Models \u6216\u5173\u95ed Server \u65f6\u91ca\u653e\u5df2\u52a0\u8f7d\u8d44\u6e90\u3002
\u9996\u6b21\u5b89\u88c5\u901a\u8fc7 post_install() \u4e0b\u8f7d\u9ed8\u8ba4 MoGe-2 ViT-S Normal\u3001BiRefNet Lite \u4e0e Real-ESRGAN General WDN x4v3\u3002Storage Root \u9ed8\u8ba4 ~/.anyimage\uff0c\u4fdd\u5b58\u73af\u5883\u3001\u6a21\u578b\u3001Job \u4ea7\u7269\u548c\u65e5\u5fd7\u3002\u8bbe\u7f6e\u5165\u53e3\u89c1 AI \u73af\u5883\u7ba1\u7406\u3002
src/anyimage/\uff09 \u529f\u80fd operators/ai_setup.py AI \u73af\u5883\u7ba1\u7406 operators/clipboard_image/ \u526a\u8d34\u677f\u56fe\u7247 operators/convert_to_plane/ Plane \u4e0e Depth Plane operators/convert_to_panorama/ Panorama operators/cutout_tool/ Cutout operators/frame_tool/operators.py Frame \u591a\u56fe\u5408\u6210 operators/mask_tool.py Mask Alpha \u7f16\u8f91 operators/rectify_tool/operators.py Rectify \u900f\u89c6\u6821\u6b63 operators/remove_background.py Remove Background operators/upscale.py Upscale \u5355\u6587\u4ef6\u529f\u80fd\u6309\u4e1a\u52a1\u547d\u540d\uff1b\u590d\u6742\u529f\u80fd\u5305\u5728 operators.py \u5b9a\u4e49 Operator \u548c\u5165\u53e3\u534f\u8c03\u903b\u8f91\uff0c\u4ea4\u4e92\u5f0f\u5de5\u5177\u540c\u65f6\u5b9a\u4e49 WorkSpaceTool\uff0c\u5176\u4f59\u6a21\u5757\u627f\u8f7d\u5177\u4f53\u5b9e\u73b0\u3002\u5305\u7684 __init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e CLASSES \u6ce8\u518c\u6e05\u5355\uff0c\u7c7b\u578b\u5728 operators/__init__.py \u548c\u6269\u5c55 __init__.py \u6c47\u603b\u6ce8\u518c\u3002AI Operator \u4f7f\u7528\u666e\u901a\u5b57\u5178\u63d0\u4ea4\u4efb\u52a1\uff0c\u5e76\u5728\u4e3b\u7ebf\u7a0b\u54cd\u5e94\u4e2d\u8bfb\u53d6\u6587\u4ef6\u548c\u4fee\u6539 Blender \u6570\u636e\u3002
AI \u73af\u5883\u7ba1\u7406\u4ece\u5f53\u524d\u5b89\u88c5\u72b6\u6001\u51fa\u53d1\uff0c\u8865\u9f50\u72ec\u7acb\u8fd0\u884c\u73af\u5883\u548c\u5fc5\u9700\u6a21\u578b\uff0c\u5e76\u63d0\u4f9b\u8bbe\u7f6e\u5165\u53e3\u4e0e\u6a21\u578b\u7f13\u5b58\u91ca\u653e\u64cd\u4f5c\u3002
"},{"location":"internals/operators/ai-setup/#_1","title":"\u6267\u884c\u8fc7\u7a0b","text":"flowchart TD\n Entry[\"Set Up AI Server\"] --> Status[\"\u8bfb\u53d6\u73af\u5883\u4e0e\u5fc5\u9700\u6a21\u578b\u72b6\u6001\"]\n Status --> Ready{\"\u662f\u5426\u5168\u90e8\u5c31\u7eea\uff1f\"}\n Ready -- \"\u662f\" --> Done[\"\u7ed3\u675f\"]\n Ready -- \"\u5426\" --> Environment{\"\u8fd0\u884c\u73af\u5883\u662f\u5426\u5c31\u7eea\uff1f\"}\n Environment -- \"\u5426\" --> Install[\"\u5b89\u88c5\u9694\u79bb Python \u73af\u5883\"]\n Environment -- \"\u662f\" --> Download[\"\u4e0b\u8f7d\u7f3a\u5931\u7684\u5fc5\u9700\u6a21\u578b\"]\n Install --> Download --> Done SetupAIEnvironment \u662f\u7edf\u4e00\u5165\u53e3\u3002\u9996\u6b21\u4f7f\u7528\u65f6\u5148\u5b89\u88c5\u8fd0\u884c\u73af\u5883\uff0c\u518d\u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff1b\u73af\u5883\u5df2\u7ecf\u5b58\u5728\u65f6\uff0c\u53ea\u8865\u9f50\u7f3a\u5931\u6a21\u578b\u3002\u73af\u5883\u5b89\u88c5\u7531 Blender Operator \u542f\u52a8\uff0c\u6a21\u578b\u4e0b\u8f7d\u901a\u8fc7 Job Server \u6267\u884c\u3002
\u5165\u53e3\u4f4d\u4e8e src/anyimage/operators/ai_setup.py\u3002SetupAIEnvironment \u901a\u8fc7 properties.py \u4e2d\u7684 ai_status() \u8bfb\u53d6\u73af\u5883\u548c\u6a21\u578b\u72b6\u6001\uff0c\u5e76\u6839\u636e\u7ed3\u679c\u7ed3\u675f\u3001\u5b89\u88c5\u73af\u5883\u6216\u8c03\u7528 DownloadRequiredModels\u3002\u5bf9\u8bdd\u6846\u540c\u65f6\u663e\u793a\u9884\u8ba1\u4e0b\u8f7d\u91cf\u548c\u7f3a\u5931\u6a21\u578b\u540d\u79f0\u3002
runtime.py \u63d0\u4f9b\u5f53\u524d Environment \u4e0e Server \u72b6\u6001\uff1bServer \u6b63\u5fd9\u65f6\u4e0d\u4f1a\u542f\u52a8\u65b0\u7684\u5b89\u88c5\u6d41\u7a0b\u3002OpenAIEnvironmentSettings \u6253\u5f00 AnyImage \u7684\u6269\u5c55\u9996\u9009\u9879\u3002
\u73af\u5883\u5c1a\u672a\u5c31\u7eea\u65f6\uff0cSetupAIEnvironment \u8c03\u7528 Runtime \u6ce8\u518c\u7684\u5b89\u88c5 Operator\u3002use_mirror \u51b3\u5b9a uv\u3001Python \u548c\u5b89\u88c5\u5305\u7684\u4e0b\u8f7d\u6e90\uff0c\u6a21\u578b\u4f7f\u7528\u6a21\u578b\u76ee\u5f55\u4e2d\u58f0\u660e\u7684\u6765\u6e90\u3002
\u5b89\u88c5\u5b8c\u6210\u540e\u901a\u8fc7 post_install() \u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff0c\u6a21\u578b\u4f9d\u8d56\u52a0\u8f7d\u4e8e\u72ec\u7acb Server \u73af\u5883\u3002
ai_setup.py \u4e2d\u7684 DownloadModel \u5904\u7406\u5355\u4e2a\u6a21\u578b\uff0cDownloadRequiredModels \u5904\u7406\u9ed8\u8ba4\u5fc5\u9700\u6a21\u578b\u96c6\u5408\u3002\u4e24\u8005\u5148\u68c0\u67e5 Environment\u3001Blender Online Access \u548c\u6a21\u578b\u8bb0\u5f55\uff0c\u518d\u63d0\u4ea4 download-model \u6216 download-required-models Job\u3002
Job \u5728 server/app.py \u6ce8\u518c\uff1bserver/model_catalog.py \u4fdd\u5b58\u6a21\u578b\u540d\u79f0\u3001\u6587\u4ef6\u548c\u6765\u6e90\uff0cserver/model_download.py \u4e0b\u8f7d\u5e76\u6821\u9a8c\u6587\u4ef6\uff0cserver/model_manager.py \u7ba1\u7406\u6a21\u578b\u76ee\u5f55\u4e0e\u5df2\u52a0\u8f7d Session\u3002\u4e0b\u8f7d\u8fdb\u5ea6\u548c\u9519\u8bef\u901a\u8fc7\u540c\u4e00\u5957 BlendJob Runtime \u8fd4\u56de Blender\u3002
ai_setup.py \u4e2d\u7684 ClearModels \u8c03\u7528 runtime.clear_resource(\"model_manager\")\uff0c\u91ca\u653e Server \u4e2d\u5df2\u52a0\u8f7d\u7684\u6a21\u578b Session\u3002\u4e0b\u6b21\u63a8\u7406\u4ece\u6a21\u578b\u76ee\u5f55\u91cd\u65b0\u52a0\u8f7d Session\u3002
\u526a\u8d34\u677f\u56fe\u7247\u4ece Ctrl/Cmd + V \u5f00\u59cb\uff0c\u628a\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u7684\u56fe\u7247\u53d8\u6210 Packed Blender Image\uff0c\u5e76\u653e\u5230\u5f53\u524d\u7f16\u8f91\u5668\u652f\u6301\u7684\u4f4d\u7f6e\u3002
flowchart TD\n Paste[\"Ctrl/Cmd + V\"] --> Priority{\"\u521a\u6267\u884c\u8fc7 Blender Copy\uff1f\"}\n Priority -- \"\u662f\" --> Native[\"\u4ea4\u56de\u539f\u751f Paste\"]\n Priority -- \"\u5426\" --> Read[\"\u8bfb\u53d6\u7cfb\u7edf\u56fe\u7247\"]\n Read --> Image[\"\u590d\u7528\u6216\u521b\u5efa Packed Image\"]\n Image --> Target{\"\u5f53\u524d\u7f16\u8f91\u5668\"}\n Target --> View[\"Reference / Plane\"]\n Target --> Node[\"Image Node\"]\n Target --> Paint[\"Brush Texture\"] Windows \u5feb\u6377\u952e\u4f18\u5148\u5904\u7406 Blender \u81ea\u5df1\u7684 Copy/Paste\uff0c\u7cfb\u7edf\u526a\u8d34\u677f\u51fa\u73b0\u65b0\u7684\u56fe\u7247\u5185\u5bb9\u65f6 AnyImage \u63a5\u7ba1\u7c98\u8d34\uff1bmacOS \u548c Linux \u6ca1\u6709\u7cfb\u7edf\u526a\u8d34\u677f\u5e8f\u5217\u53f7\uff0c\u59cb\u7ec8\u7531 AnyImage \u5904\u7406\u7c98\u8d34\u3002
"},{"location":"internals/operators/clipboard-image/#_3","title":"\u8282\u70b9\u8bf4\u660e","text":""},{"location":"internals/operators/clipboard-image/#blender","title":"\u5224\u65ad\u662f\u5426\u4ea4\u7ed9 Blender","text":"operators/clipboard_image/operators.py \u5b9a\u4e49 TrackNativeCopy\u3001PasteClipboardImage \u548c 3D View\u3001Node Editor \u5feb\u6377\u952e\u3002TrackNativeCopy \u8bb0\u5f55 Blender Copy \u65f6\u7684\u7cfb\u7edf\u526a\u8d34\u677f\u5e8f\u5217\u53f7\uff1b\u7c98\u8d34\u65f6\u82e5\u5e8f\u5217\u53f7\u6ca1\u6709\u53d8\u5316\uff0cPasteClipboardImage \u8fd4\u56de PASS_THROUGH\uff0c\u8ba9 Blender \u7ee7\u7eed\u5904\u7406\u5bf9\u8c61\u6216\u8282\u70b9\u7c98\u8d34\u3002
\u540c\u4e00\u6587\u4ef6\u968f\u540e\u8c03\u7528 actions.target_for_context() \u5224\u65ad\u5f53\u524d\u7f16\u8f91\u5668\u662f\u5426\u652f\u6301\u56fe\u7247\u843d\u70b9\u3002
clipboard.py \u8d1f\u8d23\u5e73\u53f0\u5dee\u5f02\u3002Windows \u4f9d\u6b21\u5c1d\u8bd5 PNG\u3001DIBV5 \u548c DIB\uff0cDIB \u8865\u6210 BMP\uff1bmacOS \u901a\u8fc7 osascript \u5bfc\u51fa PNG\uff1bLinux \u4f9d\u6b21\u5c1d\u8bd5 wl-paste \u548c xclip \u63d0\u4f9b\u7684\u56fe\u7247\u683c\u5f0f\u3002\u5404\u5e73\u53f0\u8f93\u51fa\u7edf\u4e00\u4e3a\u56fe\u7247\u5b57\u8282\u548c\u6269\u5c55\u540d\uff0c\u518d\u4ea4\u7ed9\u540e\u7eed\u6b65\u9aa4\u3002
actions.py \u5bf9\u56fe\u7247\u5185\u5bb9\u8ba1\u7b97 SHA-256\u3002\u76f8\u540c\u5185\u5bb9\u5df2\u7ecf\u7c98\u8d34\u8fc7\u65f6\u4f1a\u590d\u7528\u73b0\u6709 Packed Image\uff0c\u5426\u5219\u521b\u5efa\u65b0 Image \u5e76 Pack \u5230\u5f53\u524d .blend\uff0c\u907f\u514d\u4f9d\u8d56\u4e34\u65f6\u526a\u8d34\u677f\u6587\u4ef6\u3002
\u843d\u70b9\u4ecd\u5728 actions.py \u4e2d\u5b8c\u6210\uff1a3D View \u521b\u5efa Reference \u6216 Plane\uff0cNode Editor \u521b\u5efa\u4e0e\u5f53\u524d\u8282\u70b9\u6811\u5339\u914d\u7684 Image \u8282\u70b9\uff0c\u7ed8\u5236\u6a21\u5f0f\u628a Image \u914d\u7f6e\u4e3a\u5f53\u524d\u753b\u7b14\u7684 Texture\u3002\u9f20\u6807\u4f4d\u7f6e\u548c\u89c6\u56fe\u4f4d\u7f6e\u4e5f\u5728\u8fd9\u91cc\u6362\u7b97\u3002
Plane \u8def\u5f84\u8c03\u7528 convert_to_plane/image_plane.py \u521b\u5efa\u4e2d\u5fc3\u539f\u70b9\u57fa\u7840\u7f51\u683c\uff0c\u5e76\u4ece\u8282\u70b9\u8d44\u4ea7\u52a0\u8f7d O Image Plane\u3002actions.py \u521b\u5efa\u56fe\u50cf\u6750\u8d28\u5e76\u653e\u5165 Mesh \u7b2c 0 \u4e2a\u6750\u8d28\u69fd\uff0c\u8282\u70b9\u7ec4\u53ea\u751f\u6210\u51e0\u4f55\u3002
operators/convert_to_panorama/ \u5c06\u9759\u6001\u7b49\u8ddd\u67f1\u72b6 Image Empty \u8f6c\u6362\u4e3a\u5f84\u5411\u6df1\u5ea6\u8868\u9762\uff0c\u63d0\u4ea4\u524d\u88c1\u526a\u51fa\u6700\u5927\u5c45\u4e2d 2:1 \u533a\u57df\u3002operators.py \u63d0\u4ea4\u4efb\u52a1\uff0cobject.py \u5bfc\u5165\u5bf9\u8c61\uff0c__init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[\u51c6\u5907\u989c\u8272\u4e0e\u5206\u6790\u56fe] --> B[generate-panorama-geometry]\n B --> C[\u91c7\u6837 12 \u4e2a\u900f\u89c6\u89c6\u56fe\u5e76\u63a8\u7406]\n C --> D[\u878d\u5408\u5f84\u5411\u8ddd\u79bb\u4e0e\u6709\u6548\u6027]\n D --> E[\u5199\u51fa depth.exr \u4e0e depth.json]\n E --> F[\u521b\u5efa\u6750\u8d28\u4e0e O Image Depth Panorama] \u4efb\u52a1\u4f7f\u7528 Preferences \u9009\u62e9\u7684\u51e0\u4f55\u6a21\u578b\u3002\u6e90\u989c\u8272\u7531 Blender \u4fa7\u4fdd\u5b58\uff0cServer \u7684 geometry/panorama.py \u8d1f\u8d23\u89c6\u56fe\u91c7\u6837\u4e0e\u8ddd\u79bb\u878d\u5408\uff0cjobs/panorama.py \u7f16\u6392\u63a8\u7406\u548c\u4ea7\u7269\u5199\u5165\u3002
operators/convert_to_plane/operators.py \u63d0\u4f9b ConvertToPlane\u3001ConvertToDepthPlane\u3001ConvertToReliefPlane \u4e0e GenerateDepthPlane\u3002object.py \u5bfc\u5165\u5bf9\u8c61\u548c\u6750\u8d28\uff0cimage_plane.py \u6784\u5efa\u57fa\u7840\u77e9\u5f62\u7f51\u683c\uff0c__init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[Image Empty] --> B[\u51c6\u5907\u6750\u8d28\u989c\u8272]\n B --> C{\u8f6c\u6362\u7c7b\u578b}\n C -- Plane --> D[\u56db\u8fb9\u5f62\u4e0e O Image Plane]\n C -- Depth \u6216 Relief --> E[\u9759\u6001\u56fe\u63d0\u4ea4\u51e0\u4f55 Job]\n E --> F[\u52a0\u8f7d\u6df1\u5ea6\u3001\u5143\u6570\u636e\u4e0e\u6cd5\u7ebf]\n F --> G[\u5bf9\u5e94\u8282\u70b9\u4fee\u6539\u5668\u4e0e\u6750\u8d28]\n D --> H[\u521b\u5efa\u5bf9\u8c61\u5e76\u66ff\u6362\u6e90 Empty]\n G --> H \u4e09\u79cd\u8f6c\u6362\u90fd\u53ea\u63a5\u53d7\u9759\u6001\u56fe\u7247\u3002\u57fa\u7840\u7f51\u683c\u4ee5\u5c40\u90e8\u4e2d\u5fc3\u4e3a\u539f\u70b9\uff0c\u5bf9\u8c61\u77e9\u9635\u8865\u507f\u6e90 Empty \u7684\u663e\u793a\u8303\u56f4\u3002
Depth \u4e0e Relief \u4ece Preferences \u8bfb\u53d6\u51e0\u4f55\u6a21\u578b\u3001\u5206\u8fa8\u7387\u7ea7\u522b\u548c AI \u8f93\u5165\u4e0a\u9650\u3002create_depth_plane_from_result() \u5bfc\u5165\u4ea7\u7269\u5e76\u521b\u5efa\u4fee\u6539\u5668\u3002O Image Depth Plane \u4f7f\u7528\u76f8\u673a XYZ \u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6df1\u5ea6\u8868\u9762\uff1bO Image Relief Plane \u4f7f\u7528\u6df1\u5ea6 Z \u4e0e\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6d6e\u96d5\u3002
\u8282\u70b9\u6784\u5efa\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6587\u4ef6\u534f\u8bae\u89c1Job \u4ea7\u7269\u3002
"},{"location":"internals/operators/cutout-tool/","title":"Cutout","text":"Cutout \u5728\u9759\u6001 Image Empty \u4e0a\u5708\u5b9a Selection\uff0c\u6309\u8f6e\u5ed3\u521b\u5efa Flat\u3001Solid\u3001Depth Symmetry \u6216 Depth Solid\u3002\u5165\u53e3\u4f4d\u4e8e operators/cutout_tool/operators.py\uff0cShape \u83dc\u5355\u4f4d\u4e8e interaction.py\uff0c\u9884\u8bbe\u6807\u8bc6\u4e0e\u8282\u70b9\u7ec4\u5bf9\u5e94\u5173\u7cfb\u4f4d\u4e8e shape.py\u3002
flowchart TD\n A[Lasso \u6216 Polyline \u63d0\u4ea4 SelectionPath] --> B[\u9009\u62e9 Shape]\n B --> C[\u6805\u683c\u5316 SelectionMask \u5e76\u8bfb\u53d6\u6e90 RGBA]\n C --> D{\u9700\u8981 Depth \u6216 Normal\uff1f}\n D -- \u662f --> E[\u51c6\u5907 bounds \u77e9\u5f62 RGBA]\n E --> F[generate-cutout-artifacts]\n F --> G[\u52a0\u8f7d Depth\u3001Metadata \u4e0e Normal]\n D -- \u5426 --> H[\u6e90 Alpha \u4e0e SelectionMask \u7ec4\u5408]\n G --> H\n H --> I[\u8fb9\u754c\u6620\u5c04\u3001\u8f6e\u5ed3\u63d0\u53d6\u4e0e\u8d28\u91cf\u4e09\u89d2\u5316]\n I --> J[BaseShape \u4e0e o_balloon]\n J --> K[\u521b\u5efa\u6750\u8d28\u3001\u5bf9\u8c61\u4e0e\u5bf9\u5e94\u8282\u70b9\u4fee\u6539\u5668] \u9884\u8bbe \u8282\u70b9\u7ec4 AI \u4ea7\u7269 Flat O Image Cutout\uff0cThickness 0 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Solid O Image Cutout\uff0cThickness 1 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Depth Symmetry O Image Depth Cutout \u4e0e O Image Cutout Symmetry \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Depth Solid O Image Depth Cutout \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Flat \u4e0e Solid \u53ef\u4ee5\u4e0d\u5e26 AI \u4ea7\u7269\u751f\u6210\uff1bDepth \u9884\u8bbe\u548c Normal Map \u9700\u8981\u5c31\u7eea\u7684\u51e0\u4f55\u6a21\u578b\uff0cShape \u83dc\u5355\u6309\u8be5\u72b6\u6001\u63d0\u4f9b\u9009\u9879\u3002
"},{"location":"internals/operators/cutout-tool/#_1","title":"\u8f6e\u5ed3\u4e0e\u7f51\u683c","text":"geometry.py \u4ece\u5185\u5bb9 Alpha \u63d0\u53d6\u8fde\u901a\u8f6e\u5ed3\u4e0e\u5b54\u6d1e\uff0c\u6309 Edge Length \u751f\u6210 BaseShape\u3002Edge Length \u662f\u4e16\u754c\u7a7a\u95f4\u7684\u7f51\u683c\u76ee\u6807\u8fb9\u957f\uff0cMinimum Relative Edge Length \u4f1a\u6309\u5185\u5bb9\u8303\u56f4\u63d0\u9ad8\u5176\u4e0b\u754c\u3002
mesh.py \u8d1f\u8d23\u8f6e\u5ed3\u5206\u79bb\u3001\u5b54\u6d1e\u5904\u7406\u3001\u8d28\u91cf\u4e09\u89d2\u5316\u548c\u8fb9\u754c\u652f\u6491\uff0cpolygon.py \u63d0\u4f9b\u8f6e\u5ed3\u7b80\u5316\uff0ctangle.py \u662f\u968f\u5305\u5206\u53d1\u7684 Delaunay \u4e09\u89d2\u5316\u6838\u5fc3\u3002Fine Outline \u5c55\u5f00\u65f6\u4fdd\u7559\u5c0f\u5b54\u4e0e\u7ec6\u8282\u8f6e\u5ed3\uff0c\u5173\u95ed\u65f6\u586b\u6d1e\u5e76\u7b80\u5316\u3002
balloon.py \u8d1f\u8d23 Balloon Profile\uff0c\u6309 Preferences \u9009\u62e9 Poisson \u6216 Teddy\uff0c\u751f\u6210\u6240\u6709\u9884\u8bbe\u5171\u7528\u7684 POINT \u5c5e\u6027 o_balloon\u3002boundary_padding.py \u6309 Boundary Padding \u6cbf\u7ed3\u6784\u5185\u6cd5\u7ebf\u91cd\u91c7\u6837\u8f6e\u5ed3\u9644\u8fd1\u7684\u989c\u8272\u4e0e\u6df1\u5ea6\u3002
Server \u63a5\u6536 Selection bounds \u5185\u4fdd\u7559\u6e90 Alpha \u7684 RGBA\uff0c\u4e00\u6b21 MoGe \u63a8\u7406\u6309 generate_depth \u4e0e normal_mode \u8fd4\u56de\u4ea7\u7269\u3002\u6df1\u5ea6\u53c2\u8003\u533a\u57df\u4f7f\u7528\u6240\u9009 Alpha Threshold\uff0cNormal \u4f7f\u7528\u539f\u9884\u6d4b\uff1bMaximum AI Input Size \u53ea\u5f71\u54cd\u5206\u6790\u5206\u8fa8\u7387\u3002
object.py \u7684 create_shape_object() \u6d88\u8d39 BaseShape\u3001Color\u3001Depth \u548c Normal\uff0c\u52a0\u8f7d\u5bf9\u5e94\u8282\u70b9\u7ec4\u3002\u57fa\u7840\u7f51\u683c\u4f4d\u4e8e\u5c40\u90e8 XZ \u5e73\u9762\uff0c\u539a\u5ea6\u6cbf Y \u5c55\u5f00\uff1b\u5bf9\u8c61\u77e9\u9635\u628a\u7f51\u683c\u653e\u5165 Image Empty \u7684\u56fe\u7247\u5e73\u9762\uff0cDepth Symmetry \u989d\u5916\u53e0\u52a0\u5bf9\u79f0\u8282\u70b9\u7ec4\u4e0e\u65b9\u5411\u53c2\u6570\u3002Object Normal \u968f\u65b9\u5411\u540c\u6b65\u8f6c\u6362\u3002
\u6750\u8d28\u4f7f\u7528 IOR 1.2\uff0c\u989c\u8272\u4e0e\u6cd5\u7ebf\u63a5\u5165 Image Layer\uff0c\u6cd5\u7ebf\u6309\u5207\u7ebf\u6216\u5bf9\u8c61\u7a7a\u95f4\u89e3\u91ca\u3002\u8282\u70b9\u8ba1\u7b97\u89c1\u8282\u70b9\u8d44\u4ea7\u3002
"},{"location":"internals/operators/frame/","title":"Frame \u591a\u56fe\u5408\u6210","text":"operators/frame_tool/operators.py \u5b9a\u4e49 FrameImages \u548c FrameTool\u3002projection.py \u8d1f\u8d23\u89c6\u56fe\u6295\u5f71\u3001\u4ea4\u53e0\u548c\u7ed3\u679c\u5e73\u9762\u5b9a\u4f4d\uff0ccompositing.py \u8d1f\u8d23\u50cf\u7d20\u6df1\u5ea6\u6392\u5e8f\u4e0e\u8fb9\u754c\u8986\u76d6\u91c7\u6837\uff0c__init__.py \u5bfc\u51fa\u7c7b\u578b\u53ca\u6ce8\u518c\u6e05\u5355\u3002Frame \u5c06\u9009\u4e2d\u7684\u9759\u6001 Image Empty \u6309\u5f53\u524d\u89c6\u56fe\u5408\u6210\u4e3a\u4e00\u5f20\u56fe\u7247\u3002
flowchart TD\n A[\u62d6\u51fa\u5c4f\u5e55\u77e9\u5f62] --> B[\u51bb\u7ed3\u89c6\u56fe\u77e9\u9635\u5e76\u6536\u96c6\u9009\u4e2d\u9759\u6001\u56fe\u7247]\n B --> C[\u68c0\u67e5\u77e9\u5f62\u4e0e active \u56fe\u7247\u7684\u6709\u6548\u6295\u5c04\u4ea4\u96c6]\n C --> D[\u6309 Region \u4e0e Maximum Frame Resolution \u8ba1\u7b97\u8f93\u51fa\u5c3a\u5bf8]\n D --> E[\u89c2\u5bdf\u5c04\u7ebf\u6295\u5f71\u5230\u5404\u56fe\u7247\u5e73\u9762]\n E --> F[\u6309\u6837\u672c\u6df1\u5ea6\u4ece\u8fdc\u5230\u8fd1\u5408\u6210\uff0c\u7b49\u6df1\u5ea6 active \u4f18\u5148]\n F --> G[\u8fb9\u754c\u8986\u76d6\u91c7\u6837\u4e0e\u72ec\u7acb Alpha]\n G --> H[\u521b\u5efa Packed Image \u5e76\u590d\u7528 active Object]\n H --> I[\u5220\u9664\u5176\u4ed6\u53c2\u4e0e\u56fe\u7247\u5bf9\u8c61\u5e76\u63d0\u4ea4 Undo] \u6b63\u4ea4\u89c6\u56fe\u63a5\u53d7\u6709\u9650\u6df1\u5ea6\uff0c\u900f\u89c6\u89c6\u56fe\u91c7\u6837\u89c2\u5bdf\u65b9\u5411\u524d\u65b9\u7684\u4ea4\u70b9\u3002\u4ea4\u53e0\u68c0\u67e5\u91c7\u7528\u8fde\u7eed\u6295\u5f71\u8303\u56f4\uff1b\u8f93\u51fa\u5c3a\u5bf8\u53d7 Region\u3001\u6700\u957f\u8fb9\u4e0a\u9650\u548c\u603b\u50cf\u7d20\u4e0a\u9650\u7ea6\u675f\u3002
RGB \u4e0e Alpha \u5206\u522b\u7d2f\u8ba1\uff0c\u4fdd\u7559\u88ab Mask \u9690\u85cf\u7684\u6709\u6548\u989c\u8272\u3002\u8fb9\u754c\u4f7f\u7528\u8986\u76d6\u91c7\u6837\uff0c\u5185\u90e8\u590d\u7528\u76f4\u63a5\u91c7\u6837\uff0c\u907f\u514d\u9ed1\u8fb9\u548c\u4e0d\u5fc5\u8981\u7684\u6a21\u7cca\u3002\u7ed3\u679c\u5e73\u9762\u671d\u5411\u89c2\u5bdf\u8005\uff0c\u4f4d\u7f6e\u7531 active \u56fe\u7247\u7684\u6709\u6548\u6df1\u5ea6\u786e\u5b9a\u3002
Frame \u4fdd\u7559 active \u5bf9\u8c61\u8eab\u4efd\u3001\u540d\u79f0\u548c Collection\uff1b\u56fe\u50cf\u66ff\u6362\u590d\u7528 Common \u7684\u5171\u4eab\u6570\u636e\u4e0e\u5931\u8d25\u6062\u590d\u903b\u8f91\u3002
"},{"location":"internals/operators/mask/","title":"Mask Alpha \u7f16\u8f91","text":"operators/mask_tool.py \u5b9a\u4e49 EditImageAlpha \u548c MaskTool\uff0c\u4f7f\u7528 common/viewport.py \u7684 ImageGesture \u7ba1\u7406 Lasso\u3001Brush \u4e0e Polyline\u3002
flowchart TD\n A[\u51bb\u7ed3 Scene \u7684 Gesture\u3001Mode\u3001Radius] --> B[\u5c4f\u5e55\u624b\u52bf\u4e0e Overlay]\n B --> C[\u5b8c\u6210\u540e\u6295\u5f71\u5e76\u751f\u6210\u8986\u76d6 M]\n C --> D[\u8bfb\u53d6\u6e90 RGBA]\n D --> E[\u6309\u6a21\u5f0f\u8ba1\u7b97 Alpha]\n E --> F[\u4fdd\u7559 RGB \u548c\u6e90\u753b\u5e03\u5c3a\u5bf8]\n F --> G[\u66ff\u6362 Packed Image \u5e76\u63d0\u4ea4\u4e00\u4e2a Undo] \u6a21\u5f0f \u6e90 Alpha A \u4e0e\u8986\u76d6 M \u7684\u7ed3\u679c Set A \u00d7 M Extend max(A, M) Subtract A \u00d7 (1 \u2212 M) Brush \u62d6\u52a8\u65f6\u7ef4\u62a4\u7b80\u5316\u5c4f\u5e55\u8def\u5f84\u3001\u5706\u5f62\u5370\u8bb0\u4e0e\u8fde\u63a5\u6761\u7684\u5e76\u96c6\u9884\u89c8\uff1b\u91ca\u653e\u65f6\u4e00\u6b21\u751f\u6210\u56fe\u7247\u8986\u76d6\u3002Polyline \u4f7f\u7528\u9010\u70b9\u8def\u5f84\uff0c\u81f3\u5c11\u4e09\u4e2a\u70b9\u540e\u901a\u8fc7\u95ed\u5408\u5708\u3001\u53cc\u51fb\u6216 Enter \u5b8c\u6210\uff0cBackspace \u5220\u9664\u672b\u70b9\u3002
\u7ed3\u679c\u4fdd\u7559 Empty \u7684\u8eab\u4efd\u3001\u77e9\u9635\u3001\u663e\u793a\u5c3a\u5bf8\u548c\u504f\u79fb\u3002\u5168\u900f\u660e\u7ed3\u679c\u6709\u6548\uff0c\u53d6\u6d88\u6216\u5207\u6362\u5de5\u5177\u6e05\u7406\u672a\u63d0\u4ea4\u7684 Overlay\uff1b\u5171\u4eab Image \u901a\u8fc7\u7edf\u4e00\u66ff\u6362\u5165\u53e3\u5206\u6d41\u3002
"},{"location":"internals/operators/rectify/","title":"Rectify \u900f\u89c6\u6821\u6b63","text":"operators/rectify_tool/operators.py \u5b9a\u4e49 RectifyImagePerspective \u4e0e RectifyTool\uff0c\u5c06\u56fe\u7247\u5185\u7684\u56db\u89d2\u533a\u57df\u6821\u6b63\u4e3a\u77e9\u5f62\u3002geometry.py \u8d1f\u8d23\u56db\u89d2\u9a8c\u8bc1\u4e0e\u50cf\u7d20\u6821\u6b63\uff0cpreview.py \u8d1f\u8d23\u9884\u89c8\u56fe\u3001Overlay \u548c\u5bbd\u9ad8\u6bd4\u63a7\u5236\uff0c__init__.py \u5bfc\u51fa\u7c7b\u578b\u53ca\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[\u70b9\u9009\u56db\u89d2] --> B[\u89c4\u8303\u4e3a\u51f8 Quad \u5e76\u68c0\u67e5\u56fe\u7247\u4ea4\u53e0]\n B --> C[512\u00d7512 \u9884\u89c8\u4e0e\u5bbd\u9ad8\u6bd4\u8c03\u6574]\n C --> D[\u6309\u50cf\u7d20\u5bc6\u5ea6\u548c\u8f93\u51fa\u4e0a\u9650\u786e\u5b9a\u5c3a\u5bf8]\n D --> E[\u5206\u5757 Homography \u4e0e\u9884\u4e58 Alpha \u63d2\u503c]\n E --> F[\u6309\u53ef\u89c1 Alpha \u88c1\u526a]\n F --> G[\u6620\u5c04 placement bounds \u5e76\u66ff\u6362 Packed Image] \u56db\u89d2\u5141\u8bb8\u4efb\u610f\u70b9\u51fb\u987a\u5e8f\uff0c\u9000\u5316\u6216\u975e\u51f8\u8f93\u5165\u5728\u63d0\u4ea4\u524d\u6821\u9a8c\u3002\u9884\u89c8\u6839\u636e\u6e90\u989c\u8272\u7a7a\u95f4\u914d\u7f6e\u663e\u793a\uff0c\u50cf\u7d20\u91cd\u91c7\u6837\u590d\u7528 common/image.py\u3002\u8f93\u51fa\u6700\u957f\u8fb9\u4e0a\u9650 8192\uff0c\u603b\u50cf\u7d20\u4e0a\u9650 16,777,216\u3002
replace_empty_image() \u6839\u636e\u6821\u6b63\u533a\u57df\u7684 placement bounds \u8c03\u6574\u753b\u6846\uff0c\u4fdd\u7559\u6e90 Image \u540d\u79f0\u3001\u5bf9\u8c61\u8eab\u4efd\u548c\u5171\u4eab\u5f15\u7528\u8bed\u4e49\u3002
operators/remove_background.py \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u51c6\u5907\u8f93\u5165\u3002RemoveImageBackground \u534f\u8c03\u8bbe\u7f6e\u4e0e\u8f93\u5165\uff0cRunBackgroundRemoval \u63d0\u4ea4 Job \u5e76\u5e94\u7528\u7ed3\u679c\u3002
flowchart TD\n A[ImageEditTarget \u53d6\u5f97\u7f16\u8f91\u76ee\u6807] --> B[\u51c6\u5907\u56fe\u50cf\u8f93\u5165]\n B --> C[remove-background Job]\n C --> D[\u6240\u9009\u80cc\u666f\u6a21\u578b\u751f\u6210\u524d\u666f Alpha]\n D --> E{\u8f93\u5165\u7c7b\u578b}\n E -- \u666e\u901a\u56fe\u7247 --> F[\u900f\u660e PNG \u524d\u666f]\n E -- HDR --> G[alpha.npy]\n F --> H[\u5e94\u7528\u7ed3\u679c\u4e0e Undo]\n G --> H server/jobs/remove_background.py \u8bfb\u53d6\u5355\u5f20\u8f93\u5165\u5e76\u8c03\u7528 server/models/background.py\uff0c\u652f\u6301 BiRefNet \u548c BEN2\u3002\u6a21\u578b\u524d\u666f Alpha \u4e0e\u6e90 Alpha \u5408\u6210\u3002
\u666e\u901a\u7ed3\u679c\u901a\u8fc7 ImageEditTarget \u4fdd\u7559\u5171\u4eab\u56fe\u50cf\u5f15\u7528\u4e0e\u5e27\u8bbe\u7f6e\u3002HDR \u4f7f\u7528 common/hdr_image.py \u7684 HdrBackgroundInput \u51c6\u5907\u5206\u6790\u8f93\u5165\uff0c\u5e76\u5c06\u8fd4\u56de Alpha \u5e94\u7528\u4e8e\u539f\u6d6e\u70b9 RGB\u3002Operator \u8d1f\u8d23\u4e34\u65f6\u8f93\u5165\u6e05\u7406\u3002
operators/upscale.py \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u751f\u6210 2\u00d7 \u7ed3\u679c\uff0c\u6e90\u56fe\u957f\u8fb9\u5fc5\u987b\u5c0f\u4e8e Maximum AI Input Size\u3002
flowchart TD\n A[\u68c0\u67e5\u6e90\u56fe\u5c3a\u5bf8\u5e76\u51bb\u7ed3\u6a21\u578b\u8bbe\u7f6e] --> B[\u51c6\u5907\u56fe\u7247\u8f93\u5165]\n B --> C[upscale-image \u5355\u5f20\u5904\u7406]\n C --> D[\u5206\u5757\u6267\u884c 4\u00d7 RGB \u63a8\u7406]\n D --> E[\u7edf\u4e00\u7f29\u653e\u4e3a\u6e90\u56fe 2\u00d7]\n E --> F[\u539f Alpha \u72ec\u7acb Lanczos \u7f29\u653e]\n F --> G[ImageEditTarget \u5e94\u7528\u7ed3\u679c\u5e76\u63d0\u4ea4 Undo] server/models/upscale.py \u5904\u7406\u8f93\u5165\u4e0a\u9650\u548c\u6700\u7ec8\u5c3a\u5bf8\uff0connx_upscale.py \u6267\u884c Real-ESRGAN \u4e0e HAT \u6a21\u578b\u3002ModelManager \u7ba1\u7406 Session\uff1bProvider \u8d44\u6e90\u9519\u8bef\u4f1a\u91ca\u653e\u5f53\u524d Session \u5e76\u8fd4\u56de\u5904\u7406\u5efa\u8bae\u3002