{"config":{"lang":["en","zh"],"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":"\ud83d\uddbc\ufe0f AnyImage","text":""},{"location":"#image-is-all-you-need","title":"IMAGE is All You Need","text":"
AnyImage \u662f OmooLab \u4e3a Blender \u51c6\u5907\u7684\u56fe\u7247\u5de5\u5177\u3002\u5b83\u8ba9\u56fe\u7247\u4e0d\u518d\u53ea\u662f\u53c2\u8003\u56fe\uff1a\u7c98\u8d34\u8fdb\u6765\uff0c\u9009\u51fa\u9700\u8981\u7684\u90e8\u5206\uff0c\u518d\u628a\u5b83\u53d8\u6210\u5e26\u6750\u8d28\u3001\u8f6e\u5ed3\u4e0e\u6df1\u5ea6\u7684\u573a\u666f\u5143\u7d20\u3002
"},{"location":"#_1","title":"\u4ece\u56fe\u7247\u76f4\u63a5\u5f00\u59cb","text":"\u5728 3D View \u6216 Node Editor \u4e2d\u6309 Ctrl+Shift+V\uff08macOS \u4e3a Cmd+Shift+V\uff09\uff0c\u526a\u8d34\u677f\u91cc\u7684\u56fe\u7247\u4f1a\u76f4\u63a5\u8fdb\u5165\u5f53\u524d\u5de5\u4f5c\u533a\u3002\u4e0d\u5fc5\u5148\u4fdd\u5b58\u6587\u4ef6\uff0c\u4e5f\u4e0d\u7528\u4e2d\u65ad\u6b63\u5728\u8fdb\u884c\u7684\u642d\u5efa\u3002
\u5df2\u6709\u56fe\u7247\u540c\u6837\u53ef\u4ee5\u7ee7\u7eed\u4f7f\u7528\u3002\u9009\u4e2d Image Empty \u540e\uff0c\u53f3\u952e\u6253\u5f00 AnyImage \u83dc\u5355\uff0c\u5e38\u7528\u64cd\u4f5c\u90fd\u5728\u8fd9\u91cc\u3002
"},{"location":"#_2","title":"\u4e00\u5f20\u56fe\uff0c\u591a\u79cd\u7a7a\u95f4\u8868\u8fbe","text":"\u6309\u4f4f\u4e0b\u65b9\u6309\u94ae\u5e76\u62d6\u5230 Blender \u7a97\u53e3\u5373\u53ef\u5b89\u88c5\u3002\u9996\u6b21\u62d6\u5165\u4f1a\u63d0\u793a\u6dfb\u52a0 AnyImage \u6269\u5c55\u4ed3\u5e93\uff0c\u786e\u8ba4\u540e\u518d\u62d6\u5165\u4e00\u6b21\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/","title":"\u5b89\u88c5\u4e0e\u9996\u6b21\u914d\u7f6e","text":"\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 tools.py 3D View WorkspaceTool \u58f0\u660e\u3001\u987a\u5e8f\u4e0e\u6ce8\u518c keymaps.py \u6269\u5c55\u5feb\u6377\u952e\u7684\u6ce8\u518c\u4e0e\u6e05\u7406 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":"\u9876\u5c42\u5165\u53e3\u6ce8\u518c\u7c7b\u578b\u540e\uff0c\u901a\u8fc7 tools.py \u7edf\u4e00\u6ce8\u518c WorkspaceTool\uff0c\u901a\u8fc7 keymaps.py \u7edf\u4e00\u6ce8\u518c\u5feb\u6377\u952e\u3002\u6ce8\u9500\u6309\u76f8\u53cd\u751f\u547d\u5468\u671f\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 --group blender node-group build \u6784\u5efa\u3001\u9a8c\u8bc1\u8282\u70b9\u8d44\u4ea7\u5e76\u8fd0\u884c\u8282\u70b9\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 nodes/groups/ \u4e2d\u7684\u6784\u5efa\u6a21\u5757\u5b9a\u4e49\uff0c\u5171\u7528\u6784\u5efa\u903b\u8f91\u4f4d\u4e8e nodes/common/\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 --group blender node-group build \u6784\u5efa\u5230 src/anyimage/assets/O_AnyImage.blend\u3002\u8be5\u6587\u4ef6\u662f Git \u5ffd\u7565\u7684\u53d1\u5e03\u6784\u5efa\u4ea7\u7269\uff1bCI \u4e0e\u672c\u5730\u53d1\u5e03\u90fd\u4ece\u8282\u70b9\u6e90\u7801\u91cd\u65b0\u751f\u6210\u3002
\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\u52a0\u8f7d nodes/groups/ \u7684\u5b9a\u4e49\uff0c\u8c03\u7528 arrangement/ \u7edf\u4e00\u6392\u5217\u51e0\u4f55\u8282\u70b9\u7ec4\u540e\u4fdd\u5b58\u3002nodes/common/ \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
\u547d\u4ee4\u901a\u8fc7\u5f53\u524d uv Python \u7684\u72ec\u7acb\u5b50\u8fdb\u7a0b\u6267\u884c\u6784\u5efa\u3001\u68c0\u67e5\u548c\u9884\u89c8\uff0cbpy \u7531 blender dependency group \u63d0\u4f9b\u3002\u4fdd\u5b58\u540e\uff0ccheck.py \u91cd\u65b0\u52a0\u8f7d\u8d44\u4ea7\u5e76\u505a\u57fa\u672c\u51e0\u4f55\u6c42\u503c\uff1btests/nodes/ \u8986\u76d6\u8282\u70b9\u5b9a\u4e49\u884c\u4e3a\uff0ctests/tools/nodes/ \u8986\u76d6\u5de5\u5177\u884c\u4e3a\u3002CI \u4f7f\u7528\u540c\u4e00\u5165\u53e3\u5148\u751f\u6210\u8d44\u4ea7\uff0c\u518d\u8fd0\u884c\u5e38\u89c4\u6d4b\u8bd5\u548c\u6253\u5305\u3002
uv run --group blender node-group build\nuv run --group blender node-group build --skip-tests\nuv run --group blender node-group check\nuv run --group blender node-group preview\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\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\u3002\u4ea4\u4e92\u5f0f\u5de5\u5177\u7684 WorkspaceTool \u7edf\u4e00\u5b9a\u4e49\u548c\u6ce8\u518c\u4e8e tools.py\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\u3002Operator \u5165\u53e3\u4f4d\u4e8e operators/cutout_tool/operators.py\uff0cWorkspaceTool \u58f0\u660e\u4f4d\u4e8e tools.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\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 Operator \u53ca\u6ce8\u518c\u6e05\u5355\u3002tools.py \u5b9a\u4e49\u5bf9\u5e94\u7684 FrameTool\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\uff0c\u4f7f\u7528 common/viewport.py \u7684 ImageGesture \u7ba1\u7406 Lasso\u3001Brush \u4e0e Polyline\uff1btools.py \u5b9a\u4e49\u5bf9\u5e94\u7684 MaskTool\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\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 Operator \u53ca\u6ce8\u518c\u6e05\u5355\uff1btools.py \u5b9a\u4e49\u5bf9\u5e94\u7684 RectifyTool\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
AnyImage is an image toolkit for Blender by OmooLab. It turns images into more than references: paste an image, select what you need, and transform it into a scene element with materials, contours, and depth.
"},{"location":"en/#start-directly-from-an-image","title":"Start directly from an image","text":"Press Ctrl+Shift+V in the 3D View or Node Editor (Cmd+Shift+V on macOS) to paste an image from the clipboard directly into the current workspace. There is no need to save the image first or interrupt your workflow.
You can also continue working with existing images. Select an Image Empty, right-click to open the AnyImage menu, and access the most common actions from there.
"},{"location":"en/#one-image-multiple-spatial-forms","title":"One image, multiple spatial forms","text":"Drag the button below into the Blender window to install. The first drag prompts you to add the AnyImage extension repository. Confirm it, then drag the button again.
Drag into Blender to install Windows \u2013 78.3\u00a0MB \u2026or download and use Install from Disk Drag into Blender to install macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026or download and use Install from Disk Drag into Blender to install Linux \u2013 71.0\u00a0MB \u2026or download and use Install from Disk"}]}