1 line
64 KiB
JSON
Executable File
1 line
64 KiB
JSON
Executable File
{"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":"<p>\u628a\u56fe\u7247\u91cc\u7684\u7a7a\u95f4\u611f\u5e26\u8fdb Blender\u3002</p> <p>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</p> <ul> <li>\u6309 Ctrl+V\uff08macOS \u4e3a Cmd+V\uff09\u628a\u526a\u8d34\u677f\u56fe\u7247\u7c98\u8d34\u5230\u5f53\u524d\u7f16\u8f91\u5668</li> <li>\u7528 Plane \u521b\u5efa\u53ef\u8c03\u539a\u5ea6\u548c\u7ec6\u5206\u7684\u56fe\u7247\u7f51\u683c</li> <li>\u7528 Depth Plane \u628a\u9759\u6001\u56fe\u7247\u8f6c\u6362\u4e3a\u53ef\u8c03\u8282\u7684\u7acb\u4f53\u9762\u7247</li> <li>\u7528 Cutout \u4ece\u5957\u7d22\u9009\u533a\u751f\u6210 Surface\u3001Balloon \u4e0e\u4e24\u79cd Depth Shape</li> <li>\u7528 Frame \u4ece\u5f53\u524d\u89c6\u89d2\u91cd\u65b0\u53d6\u666f\u5e76\u5408\u5e76 Image Empty\uff0c\u7528 Mask \u7684 Lasso\u3001Brush \u6216 Polyline \u7f16\u8f91 Alpha\uff1bBrush \u62d6\u52a8\u65f6\u4ee5\u7ea2\u8272\u6216\u7070\u8272\u586b\u5145\u9884\u89c8\u51c6\u786e\u8303\u56f4\uff0c\u91ca\u653e\u540e\u63d0\u4ea4\uff1b\u7528 Rectify \u6821\u6b63\u900f\u89c6</li> <li>\u7528 Remove Background / Upscale \u5904\u7406\u5355\u56fe\u3001\u89c6\u9891\u548c\u5e8f\u5217\u5e27</li> </ul> \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":"<p>\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</p> \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":"<p>AnyImage \u7684\u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u6309\u529f\u80fd\u5206\u7ec4\u3002Environment \u533a\u5305\u542b\uff1a</p> <ul> <li>Storage Root\uff1a\u4fdd\u5b58\u8fd0\u884c\u73af\u5883\u3001\u6a21\u578b\u548c\u4efb\u52a1\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u9ed8\u8ba4\u662f\u7528\u6237\u76ee\u5f55\u4e0b\u7684 <code>.anyimage</code>\uff0c\u4e00\u822c\u65e0\u9700\u4fee\u6539\u3002</li> <li>Device\uff1a\u6b63\u5f0f\u8f6c\u6362\u4efb\u52a1\u4f7f\u7528\u7684\u8ba1\u7b97\u8bbe\u5907\u3002Apple Silicon Mac \u9ed8\u8ba4\u4f7f\u7528 CPU\uff0cWindows \u9ed8\u8ba4\u4f7f\u7528 DirectML\uff1b\u4e5f\u53ef\u624b\u52a8\u9009\u62e9\u5176\u4ed6\u53ef\u7528\u8bbe\u5907\u3002</li> </ul> <p>macOS 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</p> <p>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</p> <ul> <li>Default Upscale Model\uff1aUpscale \u4f7f\u7528\u7684\u6a21\u578b\uff0c\u9ed8\u8ba4\u662f General WDN x4v3\u3002</li> <li>Maximum AI Input Size\uff1aUpscale\u3001Depth \u4e0e Normal Map \u7684 AI \u8f93\u5165\u957f\u8fb9\u4e0a\u9650\uff0c\u9ed8\u8ba4 2048 px\uff1b\u989c\u8272\u8d34\u56fe\u4fdd\u7559\u539f\u59cb\u5206\u8fa8\u7387\u3002</li> <li>Maximum Cutout Mesh Resolution\uff1a\u6240\u6709 Cutout Shape \u7684\u7f51\u683c\u91c7\u6837\u957f\u8fb9\u4e0a\u9650\uff0c\u9ed8\u8ba4 1024\uff0c\u72ec\u7acb\u4e8e AI \u8f93\u5165\u5c3a\u5bf8\u3002</li> </ul> <p>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</p> <p>\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</p>"},{"location":"getting-started/installation/#ai-environment","title":"\u914d\u7f6e AI Environment","text":"<p>\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</p> <p>\u786e\u8ba4\u5b89\u88c5\u524d\uff0c\u5bf9\u8bdd\u6846\u4f1a\u8bf4\u660e\u4ee5\u4e0b\u5185\u5bb9\uff1a</p> <ul> <li>\u5b89\u88c5\u72ec\u7acb Python\u3001ONNX Runtime \u4e0e\u652f\u6301\u5305\uff0c\u5e76\u4e0b\u8f7d MoGe-2 ViT-S Normal\u3001BEN2 Base \u548c Real-ESRGAN General WDN x4v3\u3002</li> <li>\u9ed8\u8ba4\u6a21\u578b\u5408\u8ba1\u7ea6 360 MB\uff1b\u8fde\u540c Environment \u9884\u8ba1\u9700\u8981\u7ea6 600 MB \u4e0b\u8f7d\u91cf\u548c\u7ea6 1 GB \u78c1\u76d8\u7a7a\u95f4\u3002</li> <li>\u6839\u636e\u7f51\u7edc\u901f\u5ea6\uff0c\u9996\u6b21\u5b89\u88c5\u901a\u5e38\u9700\u8981 5\u201320 \u5206\u949f\u3002</li> <li>Use Mirror \u53ea\u8ba9 uv\u3001Python \u548c Python \u5305\u4f7f\u7528\u56fd\u5185\u955c\u50cf\uff1b\u6a21\u578b\u4e0b\u8f7d\u6e90\u4fdd\u6301\u4e0d\u53d8\u3002</li> </ul> <p>\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</p> <p>\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</p>"},{"location":"getting-started/installation/#_3","title":"\u786e\u8ba4\u5b89\u88c5\u5b8c\u6210","text":"<p>\u5b8c\u6210\u540e\u53ef\u4ee5\u7528\u4ee5\u4e0b\u65b9\u5f0f\u786e\u8ba4\uff1a</p> <ul> <li>AnyImage \u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u4e2d\u7684 MoGe-2 ViT-S Normal\u3001BEN2 Base \u548c Real-ESRGAN General WDN x4v3 \u663e\u793a Ready\u3002</li> <li>\u9009\u4e2d Image Empty \u540e\uff0c\u53f3\u952e\u83dc\u5355\u5e95\u90e8\u663e\u793a AI Environment Settings\u2026\u3002</li> </ul> <p>\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</p>"},{"location":"getting-started/installation/#_4","title":"\u4e0b\u4e00\u6b65","text":"<p>\u7ee7\u7eed\u9605\u8bfb\u4e94\u5206\u949f\u4e0a\u624b\uff0c\u7528\u4e00\u5f20\u56fe\u7247\u5b8c\u6210\u7b2c\u4e00\u6b21\u8f6c\u6362\u3002</p>"},{"location":"internals/","title":"\u5185\u90e8\u5b9e\u73b0\u603b\u89c8","text":"<p>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</p> \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 <p>\u6e90\u7801\u4f4d\u4e8e <code>src/anyimage/</code>\uff0c\u5f00\u53d1\u5de5\u5177\u4f4d\u4e8e <code>tools/</code>\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u4f4d\u4e8e <code>tests/</code>\u3002\u6269\u5c55\u7ea7\u8bbe\u7f6e\u7531 <code>preferences.py</code> \u5b9a\u4e49\uff0c\u8fd0\u884c\u65f6\u8d44\u6e90\u7531 <code>runtime.py</code> \u63a5\u5165 BlendJob\u3002</p>"},{"location":"internals/architecture/","title":"\u7a0b\u5e8f\u67b6\u6784","text":"\u6a21\u5757 \u804c\u8d23 <code>__init__.py</code> \u6ce8\u518c\u7c7b\u578b\u3001\u5de5\u5177\u3001\u83dc\u5355\u3001\u5feb\u6377\u952e\u4e0e Runtime <code>menu.py</code>\u3001<code>panel.py</code> Image Empty \u4e0e Shader Image Texture \u4e0a\u4e0b\u6587\u83dc\u5355\u4e0e Job Server \u9762\u677f <code>preferences.py</code> \u6269\u5c55\u8bbe\u7f6e\u53ca\u8bfb\u53d6\u5165\u53e3 <code>properties.py</code> Scene \u624b\u52bf\u72b6\u6001\u3001\u6a21\u578b\u72b6\u6001\u67e5\u8be2\u3001\u679a\u4e3e\u4e0e Operator \u5c5e\u6027\u6784\u9020 <code>common/</code> Blender \u4fa7\u516c\u5171\u80fd\u529b <code>operators/</code> \u4ea4\u4e92\u3001\u4efb\u52a1\u53c2\u6570\u3001\u7ed3\u679c\u5bfc\u5165\u548c Undo <code>server/</code> \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":"<p>\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 <code>CLASSES</code> \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 <code>preferences.py</code> \u8bfb\u53d6\u3002</p> <p>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</p>"},{"location":"internals/architecture/#_3","title":"\u6267\u884c\u8fb9\u754c","text":"<pre><code>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]</code></pre> <p>Plane\u3001Frame\u3001Mask\u3001Rectify \u548c\u65e0\u9700 AI \u7684 Cutout \u5728 Blender \u5185\u6267\u884c\u3002Server \u7684 <code>jobs/</code> \u7f16\u6392\u4efb\u52a1\uff0c<code>models/</code> \u8d1f\u8d23\u6a21\u578b\u9002\u914d\uff0c<code>geometry/</code> \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 <code>common/</code> \u590d\u7528\u3002</p> <p>MoGe-2 \u4e0e MoGe-3 \u8f93\u51fa\u7edf\u4e00\u4e3a <code>GeometryFrame</code>\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</p>"},{"location":"internals/common/","title":"Blender \u516c\u5171\u80fd\u529b","text":"<p><code>src/anyimage/common/</code> \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</p> \u6a21\u5757 \u804c\u8d23\u4e0e\u4e3b\u8981\u5165\u53e3 <code>ai.py</code> \u73af\u5883\u548c\u6a21\u578b\u5c31\u7eea\u68c0\u67e5\u3001\u8f93\u5165\u8def\u5f84\u6821\u9a8c\u3001<code>production_device()</code>\u3001<code>moge2_parameters()</code> \u4e0e\u5b89\u88c5 UI <code>image.py</code> <code>image_rgba()</code>\u3001Image User \u5e27\u8bbe\u7f6e\u8bfb\u53d6\u3001Job \u8f93\u5165\u51c6\u5907\u3001\u50cf\u7d20\u91c7\u6837\u3001\u7ed3\u679c Image \u548c <code>replace_empty_image()</code> <code>color_image.py</code> \u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u7684\u51c6\u5907\u548c\u6e05\u7406 <code>hdr_image.py</code> HDR \u53bb\u80cc\u666f\u5206\u6790\u8f93\u5165\u53ca\u6d6e\u70b9\u989c\u8272\u4fdd\u7559 <code>image_target.py</code> Image Empty \u4e0e Shader Image Texture \u7f16\u8f91\u76ee\u6807 <code>selection.py</code> <code>SelectionPath</code>\u3001<code>SelectionMask</code>\u3001non-zero winding \u6805\u683c\u5316\u4e0e Alpha \u4fee\u6574 <code>viewport.py</code> \u539f\u751f\u70b9\u9009\u3001\u5c4f\u5e55\u6295\u5f71\u3001<code>ImageGesture</code>\u3001Lasso / Brush / Polyline \u4e0e Overlay <code>depth.py</code> \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 <code>material.py</code> Image Layer\u3001Normal\u3001Alpha\u3001Shadeless \u4e0e Depth \u6750\u8d28 <code>object.py</code> Modifier \u8f93\u5165\u8bbe\u7f6e\u4e0e\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u3001\u6e90\u5bf9\u8c61\u66ff\u6362 <code>node.py</code> <code>node_asset_path()</code> \u4e0e <code>load_node_group()</code>"},{"location":"internals/common/#_1","title":"\u56fe\u50cf\u751f\u547d\u5468\u671f","text":"<p>\u4e1a\u52a1\u50cf\u7d20\u91c7\u7528 Top-down RGBA\uff0c<code>image_pixels()</code> \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\u3002<code>ImageEditTarget</code> \u6821\u9a8c\u76ee\u6807\u8eab\u4efd\u540e\u7ecf <code>replace_empty_image()</code> \u6216 <code>replace_texture_image()</code> \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</p> <p><code>prepare_image_input()</code> \u8fd4\u56de\u8def\u5f84\u53ca\u4e34\u65f6\u6807\u8bb0\uff1b<code>cleanup_image_input()</code> \u4e0e\u521b\u5efa\u65b9\u914d\u5bf9\u3002<code>color_image.py</code> \u7684 <code>prepare_material_color_input()</code> \u51c6\u5907\u6750\u8d28\u989c\u8272\uff0c<code>material_analysis_input()</code> \u63d0\u4f9b\u5206\u6790\u8f93\u5165\uff1bCutout \u6309\u51e0\u4f55 bounds \u88c1\u5207\u3002</p>"},{"location":"internals/common/#selection","title":"\u624b\u52bf\u4e0e Selection","text":"<pre><code>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]</code></pre> <p>Brush \u7684\u5706\u5f62\u5370\u8bb0\u548c\u8fde\u63a5\u6761\u7531 <code>brush_footprint_polygons()</code> \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</p>"},{"location":"internals/common/#_2","title":"\u6750\u8d28\u3001\u8282\u70b9\u4e0e\u5bf9\u8c61","text":"<p><code>create_image_material()</code> \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\u3002<code>set_modifier_input()</code> \u6309\u5b9e\u9645 RNA \u8f93\u5165\u5f62\u5f0f\u8bbe\u7f6e\u503c\uff0c<code>finalize_object_result()</code> \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</p> <p>Geometry Nodes \u4ece <code>src/anyimage/assets/O_AnyImage.blend</code> \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</p>"},{"location":"internals/development/","title":"\u5f00\u53d1\u4e0e\u53d1\u5e03","text":"<p>\u4ed3\u5e93\u4f7f\u7528 CPython 3.11 \u4e0e <code>bpy==4.5.3</code> \u6d4b\u8bd5 Blender \u4ee3\u7801\uff1bAI Server \u4f7f\u7528 <code>runtime.py</code> \u58f0\u660e\u7684\u72ec\u7acb Python 3.12 Environment\u3002</p> <pre><code>uv sync\nuv run pytest\n</code></pre>"},{"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 <code>test_addon_registration.py</code>\u3001<code>test_preferences.py</code>\u3001<code>test_ai_setup.py</code>\u3001<code>test_job_operator.py</code> Frame\u3001Mask\u3001Rectify\u3001Plane\u3001Cutout \u5bf9\u5e94 <code>test_*_tool.py</code>\u3001<code>test_*_operators.py</code> \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 <code>test_job_server.py</code>\u3001<code>test_server_jobs.py</code>\u3001<code>test_input_validation.py</code>\u3001<code>test_geometry_artifacts.py</code> \u6a21\u578b <code>test_model_manager.py</code>\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 <p>Blender Stub \u5171\u7528 <code>tests/support/blender.py</code>\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</p>"},{"location":"internals/development/#_3","title":"\u53d1\u5e03\u547d\u4ee4","text":"\u547d\u4ee4 \u804c\u8d23 <code>uv run pack</code> \u751f\u6210 Windows\u3001macOS arm64\u3001Linux \u6269\u5c55\u5305 <code>uv run pack --prepare</code> \u4e3a\u672c\u673a\u540c\u6b65\u6269\u5c55 wheel \u4e0e Manifest <code>uv run node-group build</code> \u6784\u5efa\u3001\u9a8c\u8bc1\u8282\u70b9\u8d44\u4ea7\u5e76\u8fd0\u884c\u6d4b\u8bd5 <code>uv run model sync</code> \u51c6\u5907\u3001\u6821\u9a8c\u5e76\u4e0a\u4f20\u6a21\u578b\u58f0\u660e\u7684\u6587\u4ef6 <code>uv run docs -dev</code> \u672c\u5730\u9884\u89c8\u6587\u6863 <code>uv run docs</code> \u901a\u8fc7 Mike \u53d1\u5e03\u9879\u76ee\u7248\u672c\u5e76\u66f4\u65b0 latest <p><code>tools/pack.py</code> \u4ece <code>pyproject.toml</code> \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 <code>AnyImage.v<version>.<platform>.zip</code>\uff0c\u5199\u5165 <code>dist/</code>\u3002\u672c\u5730 BlendJob wheel \u5185\u5bb9\u53d8\u5316\u540e\u8fd0\u884c <code>uv lock --refresh</code>\uff0c\u5e76\u6838\u5bf9\u9501\u6587\u4ef6\u3001Manifest \u4e0e\u6253\u5305\u6d4b\u8bd5\u3002</p> <p><code>tools/models/cli.py</code> \u6839\u636e\u6a21\u578b\u76ee\u5f55\u9009\u62e9\u4e0a\u6e38 ONNX \u6216\u672c\u5730\u5bfc\u51fa\u6d41\u7a0b\uff1b<code>tools/models/exports.py</code> \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\u3002<code>uv run model prepare</code> \u7528\u4e8e\u672c\u5730\u51c6\u5907\u3002</p>"},{"location":"internals/development/#ci","title":"CI \u4e0e\u6587\u6863\u5bfc\u822a","text":"<pre><code>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]</code></pre> <p>\u7ad9\u70b9\u5bfc\u822a\u7531 <code>mkdocs.yml</code> \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</p>"},{"location":"internals/node-assets/","title":"\u8282\u70b9\u8d44\u4ea7","text":""},{"location":"internals/node-assets/#_2","title":"\u8d44\u4ea7\u6e05\u5355","text":"<p>\u8282\u70b9\u7ec4\u7531 <code>tools/nodes/groups/</code> \u4e2d\u7684\u6784\u5efa\u6a21\u5757\u5b9a\u4e49\u3002</p> \u8282\u70b9\u7ec4 \u6784\u5efa\u6a21\u5757 <code>O Image Plane</code> <code>image_plane.py</code> <code>O Image Depth Plane</code> <code>image_depth_plane.py</code> <code>O Image Relief Plane</code> <code>image_relief_plane.py</code> <code>O Image Cutout</code> <code>image_cutout.py</code> <code>O Image Depth Cutout</code> <code>image_depth_cutout.py</code> <code>O Image Cutout Symmetry</code> <code>image_cutout_symmetry.py</code> <code>O Image Layer</code> <code>image_layer.py</code> <code>O Image Depth Layer</code> <code>image_depth_layer.py</code> <code>O Shadeless</code> <code>shadeless.py</code> <code>O Image Depth Panorama</code> <code>image_depth_panorama.py</code>"},{"location":"internals/node-assets/#_3","title":"\u6784\u5efa\u8282\u70b9\u8d44\u4ea7","text":"<p>\u751f\u4ea7\u8282\u70b9\u7ec4\u7531 <code>uv run node-group build</code> \u6784\u5efa\u5230 <code>src/anyimage/assets/O_AnyImage.blend</code></p> <p>\u8282\u70b9\u7ec4\u89c4\u5219\uff1a</p> <ul> <li>\u5b57\u6bb5\u9ed8\u8ba4\u76f4\u63a5\u8fde\u63a5\uff0c\u591a\u4e2a\u6d88\u8d39\u8005\u53ef\u590d\u7528\u540c\u4e00\u8f93\u51fa\uff1b\u6309\u6d88\u8d39\u4f4d\u7f6e\u7684\u51e0\u4f55\u3001\u57df\u3001\u7c7b\u578b\u548c\u8f93\u5165\u5c5e\u6027\u7248\u672c\u9a8c\u8bc1\u6c42\u503c\u7b49\u4ef7\u6027</li> <li>\u6240\u6709\u51e0\u4f55\u8282\u70b9\u3001\u5d4c\u5957\u7ec4\u53ca\u6d4b\u8bd5\u8f85\u52a9\u56fe\u7981\u6b62\u4f7f\u7528 Capture Attribute\uff1b\u6784\u5efa\u5b9a\u4e49\u548c\u4fdd\u5b58\u8d44\u4ea7\u9012\u5f52\u68c0\u67e5 Capture \u4e3a\u96f6</li> <li>\u57df\u8f6c\u6362\u4f7f\u7528 Evaluate on Domain \u6216\u660e\u786e\u57df\u7684\u91c7\u6837\u8282\u70b9\u8868\u8fbe\uff1b\u8de8\u51e0\u4f55\u53d8\u5316\u4f18\u5148\u8c03\u6574\u6d88\u8d39\u987a\u5e8f\u6216\u5728\u6e90\u51e0\u4f55\u4e0a\u91c7\u6837\uff0c\u660e\u786e\u7d22\u5f15\u5bf9\u5e94\u5173\u7cfb</li> <li>Store Named Attribute \u7528\u4e8e\u5b9e\u9645\u547d\u540d\u534f\u8bae\u6216\u4ecd\u9700\u8de8\u51e0\u4f55\u53d8\u5316\u4fdd\u5b58\u7684\u6700\u5c11\u6570\u636e\uff0c\u9010\u9879\u660e\u786e\u540d\u79f0\u3001\u7c7b\u578b\u3001\u57df\u3001Selection\u3001\u5199\u5165\u9636\u6bb5\u3001\u6d88\u8d39\u8005\u53ca\u5fc5\u8981\u6027\uff1b\u5185\u90e8\u4e34\u65f6\u5c5e\u6027\u4f7f\u7528 <code>_o_</code> \u524d\u7f00\uff0c\u5728\u6700\u540e\u6d88\u8d39\u8005\u4e4b\u540e\u7528\u901a\u914d\u7b26 <code>_o_*</code> \u6e05\u7406\uff0c\u4fdd\u7559 UV\u3001\u7528\u6237\u5c5e\u6027\u548c\u5916\u90e8\u534f\u8bae\u5c5e\u6027\u3002\u6e05\u7406\u5fc5\u987b\u8d70 <code>remove_attribute_pattern</code>\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\u544a</li> <li>Group Input \u6309\u533a\u57df\u91cd\u590d\u653e\u7f6e\uff0c\u901a\u8fc7\u5b57\u6bb5\u6392\u5217\u548c\u5fc5\u8981\u7684 Reroute \u4fdd\u6301\u8fde\u7ebf\u53ef\u8bfb\uff0c\u9690\u85cf\u672a\u4f7f\u7528\u8f93\u51fa\uff1b\u5b58\u50a8\u987b\u6709\u6570\u636e\u751f\u547d\u5468\u671f\u4f9d\u636e</li> <li>\u6784\u5efa\u9636\u6bb5\u901a\u8fc7\u660e\u786e\u7684\u8282\u70b9\u6216 socket \u5f15\u7528\u63a5\u7ebf</li> <li>\u4fdd\u7559\u8282\u70b9\u9ed8\u8ba4 <code>name</code> \u548c\u6807\u9898\uff0c\u4e0d\u7528 <code>label</code> \u8986\u76d6\uff0c\u4e0d\u7528 String \u8282\u70b9\u6ce8\u89e3\u3002Frame \u4ec5\u7528\u4e8e\u786e\u6709\u5305\u88f9\u8bed\u4e49\u7684\u533a\u57df</li> <li>\u5168\u63a5\u7ebf\u7684\u7b80\u5355\u6570\u5b66\u8fd0\u7b97\u53ef\u6298\u53e0\uff1b\u9700\u8981\u9605\u8bfb\u7684\u5e38\u6570\u3001\u8fd0\u7b97\u57df\u548c\u6a21\u5f0f\u4fdd\u6301\u53ef\u89c1</li> <li>\u6bd4\u8f83\u7edf\u4e00\u7528 Compare \u8282\u70b9\u5e76\u6309\u64cd\u4f5c\u6570\u6570\u636e\u7c7b\u578b\u9009\u62e9\u8f93\u5165\uff0c\u5e03\u5c14\u8fd0\u7b97\u7edf\u4e00\u7528 Boolean Math\uff0c\u4e0d\u7528 Math \u8282\u70b9\u505a\u6bd4\u8f83\u3001\u4e5f\u4e0d\u7528\u6570\u503c\u4e58\u6cd5\u4ee3\u66ff\u5e03\u5c14\u8fd0\u7b97\uff1b\u6750\u8d28\u6811\u4e0d\u652f\u6301\u8fd9\u4e24\u4e2a\u8282\u70b9\uff0c\u4ecd\u7528 Math</li> <li>\u4fee\u6539\u5668 Geometry Nodes \u7684\u8f93\u5165 socket \u9ed8\u8ba4\u4f7f\u7528 <code>SINGLE</code></li> <li>socket <code>subtype</code> \u6309\u4e1a\u52a1\u8bed\u4e49\u8bbe\u7f6e\uff1a\u957f\u5ea6\u7528 <code>DISTANCE</code>\uff0c<code>0\u20131</code> \u6bd4\u4f8b\u7528 <code>FACTOR</code>\uff0c<code>0\u2013100</code> \u7528 <code>PERCENTAGE</code>\uff1b\u65e0\u5bf9\u5e94\u8303\u56f4\u8bed\u4e49\u65f6\u4fdd\u7559\u9ed8\u8ba4</li> <li>\u63a5\u53e3\u6216\u5e03\u5c40\u53d8\u66f4\u987b\u9a8c\u8bc1 socket \u987a\u5e8f\u4e0e\u7ed3\u6784\u3001\u672a\u4f7f\u7528\u8f93\u51fa\u9690\u85cf\u53ca\u51e0\u4f55\u6c42\u503c\uff1b\u7eaf\u5e03\u5c40\u53d8\u66f4\u6bd4\u8f83\u8fd0\u7b97\u3001\u9ed8\u8ba4\u503c\u548c\u5b9e\u9645\u8fde\u63a5\uff0c\u786e\u8ba4\u529f\u80fd\u4e0d\u53d8</li> </ul>"},{"location":"internals/node-assets/#_4","title":"\u6784\u5efa\u8d44\u4ea7\u811a\u672c","text":"<p><code>tools/nodes/build.py</code> \u6309\u4f9d\u8d56\u987a\u5e8f\u6784\u5efa\u8d44\u4ea7\uff0c\u8c03\u7528 <code>arrangement/</code> \u7edf\u4e00\u6392\u5217\u51e0\u4f55\u8282\u70b9\u7ec4\u540e\u4fdd\u5b58\u3002<code>common/</code> \u63d0\u4f9b\u5171\u7528\u6784\u5efa\u51fd\u6570\uff1a<code>nodes.py</code> \u521b\u5efa\u63a5\u53e3\u4e0e\u8282\u70b9\uff0c<code>depth_surface.py</code>\u3001<code>cutout.py</code> \u7b49\u7ec4\u88c5\u51e0\u4f55\uff0c<code>shader.py</code> \u6784\u5efa\u6750\u8d28\u7740\u8272\u8282\u70b9\uff0c<code>material_slots.py</code> \u7ee7\u627f\u51e0\u4f55\u6750\u8d28\u69fd\uff1b<code>tools/nodes/preview/</code> \u5bfc\u51fa\u4ea4\u4e92\u9884\u89c8\u3002</p> <p>\u4fdd\u5b58\u540e\uff0c<code>check.py</code> \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 <code>tests/</code> \u68c0\u67e5\u3002</p> <pre><code>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</code></pre> <p>\u811a\u672c\u6309 <code>--blender</code>\u3001\u73af\u5883\u53d8\u91cf <code>BLENDER_BIN</code>\u3001\u9879\u76ee <code>.env</code>\u3001<code>PATH</code> \u7684\u987a\u5e8f\u67e5\u627e Blender\u3002\u65e0\u6cd5\u81ea\u52a8\u627e\u5230\u65f6\uff0c\u5728\u9879\u76ee\u6839\u76ee\u5f55\u7684 <code>.env</code> \u4e2d\u914d\u7f6e\uff1a</p> <pre><code>BLENDER_BIN=\"/absolute/path/to/blender\"\n</code></pre>"},{"location":"internals/outputs/","title":"Job \u4ea7\u7269","text":"<p>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</p> Job \u6587\u4ef6 \u6d88\u8d39\u65b9 <code>remove-background</code> <code>foreground.png</code> \u6216 <code>alpha.npy</code> ImageEditTarget \u6216 HDR Alpha \u7f16\u8f91 <code>upscale-image</code> <code>upscale.png</code> \u56fe\u50cf\u66ff\u6362 <code>generate-depth-plane-geometry</code> <code>depth.exr</code>\u3001<code>depth.json</code> \u548c\u6cd5\u7ebf Depth / Relief Plane <code>generate-cutout-artifacts</code> \u6309\u8bf7\u6c42\u63d0\u4f9b\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf Cutout <code>generate-panorama-geometry</code> <code>depth.exr</code>\u3001<code>depth.json</code> Panorama"},{"location":"internals/outputs/#_1","title":"\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u534f\u8bae","text":"\u8fd4\u56de\u5b57\u6bb5 \u5185\u5bb9 <code>depth</code> 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 <code>depth_metadata</code> JSON\uff0c\u5305\u542b <code>image_size</code> \u4e0e 3\u00d73 <code>intrinsics</code> <code>tangent_normal</code> <code>tangent-normal.png</code>\uff0c\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf <code>object_normal</code> <code>object-normal.png</code>\uff0c\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf <pre><code>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]</code></pre> <p>\u53c2\u8003\u6df1\u5ea6\u7531 <code>common/depth.py</code> \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</p> <p>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 <code>projection: equirectangular</code> \u548c <code>image_size</code>\u3002</p>"},{"location":"internals/outputs/#_2","title":"\u989c\u8272\u4e0e\u56fe\u50cf\u7f16\u8f91","text":"<p><code>common/color_image.py</code> \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</p> <p><code>ImageEditTarget</code> \u7edf\u4e00 Image Empty \u548c Shader Image Texture \u7684\u7f16\u8f91\u76ee\u6807\u53ca\u5171\u4eab\u5f15\u7528\u3002HDR \u53bb\u80cc\u666f\u901a\u8fc7 <code>HdrBackgroundInput</code> \u4fdd\u7559 Blender \u6d6e\u70b9 RGB\uff0c\u5e76\u5e94\u7528 Server \u8fd4\u56de\u7684\u8fde\u7eed Alpha\u3002</p>"},{"location":"internals/runtime/","title":"Job Runtime \u4e0e Server","text":"<p><code>runtime.py</code> \u914d\u7f6e BlendJob <code>JobRuntime</code> \u548c\u72ec\u7acb Python 3.12 Environment\u3002<code>server/app.py</code> \u6ce8\u518c Job\uff0c<code>model_manager.py</code> \u7ba1\u7406\u6a21\u578b\u6587\u4ef6\u4e0e\u7f13\u5b58 Session\u3002</p> <pre><code>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]</code></pre> Job \u5b9e\u73b0\u4e0e\u7528\u9014 <code>download-model</code>\u3001<code>download-required-models</code> <code>app.py</code> \u4e0b\u8f7d\u5355\u4e2a\u6216\u7f3a\u5931\u6a21\u578b <code>remove-background</code> <code>jobs/remove_background.py</code> \u751f\u6210\u900f\u660e\u524d\u666f\u6216\u8fde\u7eed Alpha <code>upscale-image</code> <code>jobs/upscale.py</code> \u751f\u6210 2\u00d7 \u56fe\u50cf <code>generate-depth-plane-geometry</code> <code>jobs/depth_plane.py</code> \u751f\u6210\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf <code>generate-cutout-artifacts</code> <code>jobs/cutout.py</code> \u6309\u8bf7\u6c42\u751f\u6210\u6df1\u5ea6\u548c\u6cd5\u7ebf <code>generate-panorama-geometry</code> <code>jobs/panorama.py</code> \u751f\u6210\u5168\u666f\u5f84\u5411\u6df1\u5ea6 <p><code>media/</code> \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 <code>context.progress()</code> \u8fd4\u56de\u8fdb\u5ea6\uff0cOperator \u6e05\u7406 Blender \u5bfc\u51fa\u7684\u4e34\u65f6\u8f93\u5165\u3002</p> <p><code>geometry/prediction_artifacts.py</code> \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</p>"},{"location":"internals/runtime/#_1","title":"\u6a21\u578b\u4e0e\u7f13\u5b58","text":"\u7528\u9014 \u6a21\u578b Session \u5206\u7c7b Depth \u4e0e Normal MoGe-2 ViT-S / ViT-B Normal\u3001MoGe-3 ViT-L geometry Remove Background BiRefNet Lite\u3001BEN2\u3001BiRefNet HR Matting background Upscale Real-ESRGAN WDN\u3001Real-ESRGAN x4plus\u3001HAT Sharper upscale <p><code>model_catalog.py</code> \u58f0\u660e\u6587\u4ef6\u6765\u6e90\u3001\u8bb8\u53ef\u3001\u5927\u5c0f\u548c SHA-256\uff1b<code>model_download.py</code> \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</p> <p>\u9996\u6b21\u5b89\u88c5\u901a\u8fc7 <code>post_install()</code> \u4e0b\u8f7d\u9ed8\u8ba4 MoGe-2 ViT-S Normal\u3001BiRefNet Lite \u4e0e Real-ESRGAN General WDN x4v3\u3002Storage Root \u9ed8\u8ba4 <code>~/.anyimage</code>\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</p>"},{"location":"internals/operators/","title":"Operator \u5b9e\u73b0\u7d22\u5f15","text":"\u6e90\u7801\uff08\u76f8\u5bf9 <code>src/anyimage/</code>\uff09 \u529f\u80fd <code>operators/ai_setup.py</code> AI \u73af\u5883\u7ba1\u7406 <code>operators/clipboard_image/</code> \u526a\u8d34\u677f\u56fe\u7247 <code>operators/convert_to_plane/</code> Plane \u4e0e Depth Plane <code>operators/convert_to_panorama/</code> Panorama <code>operators/cutout_tool/</code> Cutout <code>operators/frame_tool/operators.py</code> Frame \u591a\u56fe\u5408\u6210 <code>operators/mask_tool.py</code> Mask Alpha \u7f16\u8f91 <code>operators/rectify_tool/operators.py</code> Rectify \u900f\u89c6\u6821\u6b63 <code>operators/remove_background.py</code> Remove Background <code>operators/upscale.py</code> Upscale <p>\u5355\u6587\u4ef6\u529f\u80fd\u6309\u4e1a\u52a1\u547d\u540d\uff1b\u590d\u6742\u529f\u80fd\u5305\u5728 <code>operators.py</code> \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 <code>__init__.py</code> \u6c47\u603b\u5bfc\u51fa\u4e0e <code>CLASSES</code> \u6ce8\u518c\u6e05\u5355\uff0c\u7c7b\u578b\u5728 <code>operators/__init__.py</code> \u548c\u6269\u5c55 <code>__init__.py</code> \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</p>"},{"location":"internals/operators/ai-setup/","title":"AI \u73af\u5883\u7ba1\u7406","text":"<p>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</p>"},{"location":"internals/operators/ai-setup/#_1","title":"\u6267\u884c\u8fc7\u7a0b","text":"<pre><code>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</code></pre> <p><code>SetupAIEnvironment</code> \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</p>"},{"location":"internals/operators/ai-setup/#_2","title":"\u8282\u70b9\u8bf4\u660e","text":""},{"location":"internals/operators/ai-setup/#_3","title":"\u8bfb\u53d6\u72b6\u6001\uff0c\u9009\u62e9\u4e0b\u4e00\u6b65","text":"<p>\u5165\u53e3\u4f4d\u4e8e <code>src/anyimage/operators/ai_setup.py</code>\u3002<code>SetupAIEnvironment</code> \u901a\u8fc7 <code>properties.py</code> \u4e2d\u7684 <code>ai_status()</code> \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 <code>DownloadRequiredModels</code>\u3002\u5bf9\u8bdd\u6846\u540c\u65f6\u663e\u793a\u9884\u8ba1\u4e0b\u8f7d\u91cf\u548c\u7f3a\u5931\u6a21\u578b\u540d\u79f0\u3002</p> <p><code>runtime.py</code> \u63d0\u4f9b\u5f53\u524d Environment \u4e0e Server \u72b6\u6001\uff1bServer \u6b63\u5fd9\u65f6\u4e0d\u4f1a\u542f\u52a8\u65b0\u7684\u5b89\u88c5\u6d41\u7a0b\u3002<code>OpenAIEnvironmentSettings</code> \u6253\u5f00 AnyImage \u7684\u6269\u5c55\u9996\u9009\u9879\u3002</p>"},{"location":"internals/operators/ai-setup/#_4","title":"\u5b89\u88c5\u72ec\u7acb\u73af\u5883","text":"<p>\u73af\u5883\u5c1a\u672a\u5c31\u7eea\u65f6\uff0c<code>SetupAIEnvironment</code> \u8c03\u7528 Runtime \u6ce8\u518c\u7684\u5b89\u88c5 Operator\u3002<code>use_mirror</code> \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</p> <p>\u5b89\u88c5\u5b8c\u6210\u540e\u901a\u8fc7 <code>post_install()</code> \u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff0c\u6a21\u578b\u4f9d\u8d56\u52a0\u8f7d\u4e8e\u72ec\u7acb Server \u73af\u5883\u3002</p>"},{"location":"internals/operators/ai-setup/#_5","title":"\u4e0b\u8f7d\u6a21\u578b","text":"<p><code>ai_setup.py</code> \u4e2d\u7684 <code>DownloadModel</code> \u5904\u7406\u5355\u4e2a\u6a21\u578b\uff0c<code>DownloadRequiredModels</code> \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 <code>download-model</code> \u6216 <code>download-required-models</code> Job\u3002</p> <p>Job \u5728 <code>server/app.py</code> \u6ce8\u518c\uff1b<code>server/model_catalog.py</code> \u4fdd\u5b58\u6a21\u578b\u540d\u79f0\u3001\u6587\u4ef6\u548c\u6765\u6e90\uff0c<code>server/model_download.py</code> \u4e0b\u8f7d\u5e76\u6821\u9a8c\u6587\u4ef6\uff0c<code>server/model_manager.py</code> \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</p>"},{"location":"internals/operators/ai-setup/#_6","title":"\u91ca\u653e\u6a21\u578b\u7f13\u5b58","text":"<p><code>ai_setup.py</code> \u4e2d\u7684 <code>ClearModels</code> \u8c03\u7528 <code>runtime.clear_resource(\"model_manager\")</code>\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</p>"},{"location":"internals/operators/clipboard-image/","title":"\u526a\u8d34\u677f\u56fe\u7247","text":"<p>\u526a\u8d34\u677f\u56fe\u7247\u4ece <code>Ctrl/Cmd + V</code> \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</p>"},{"location":"internals/operators/clipboard-image/#_2","title":"\u6267\u884c\u8fc7\u7a0b","text":"<pre><code>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\"]</code></pre> <p>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</p>"},{"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":"<p><code>operators/clipboard_image/operators.py</code> \u5b9a\u4e49 <code>TrackNativeCopy</code>\u3001<code>PasteClipboardImage</code> \u548c 3D View\u3001Node Editor \u5feb\u6377\u952e\u3002<code>TrackNativeCopy</code> \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\uff0c<code>PasteClipboardImage</code> \u8fd4\u56de <code>PASS_THROUGH</code>\uff0c\u8ba9 Blender \u7ee7\u7eed\u5904\u7406\u5bf9\u8c61\u6216\u8282\u70b9\u7c98\u8d34\u3002</p> <p>\u540c\u4e00\u6587\u4ef6\u968f\u540e\u8c03\u7528 <code>actions.target_for_context()</code> \u5224\u65ad\u5f53\u524d\u7f16\u8f91\u5668\u662f\u5426\u652f\u6301\u56fe\u7247\u843d\u70b9\u3002</p>"},{"location":"internals/operators/clipboard-image/#_4","title":"\u8bfb\u53d6\u7cfb\u7edf\u56fe\u7247","text":"<p><code>clipboard.py</code> \u8d1f\u8d23\u5e73\u53f0\u5dee\u5f02\u3002Windows \u4f9d\u6b21\u5c1d\u8bd5 PNG\u3001DIBV5 \u548c DIB\uff0cDIB \u8865\u6210 BMP\uff1bmacOS \u901a\u8fc7 <code>osascript</code> \u5bfc\u51fa PNG\uff1bLinux \u4f9d\u6b21\u5c1d\u8bd5 <code>wl-paste</code> \u548c <code>xclip</code> \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</p>"},{"location":"internals/operators/clipboard-image/#packed-image","title":"\u521b\u5efa\u6216\u590d\u7528 Packed Image","text":"<p><code>actions.py</code> \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 <code>.blend</code>\uff0c\u907f\u514d\u4f9d\u8d56\u4e34\u65f6\u526a\u8d34\u677f\u6587\u4ef6\u3002</p>"},{"location":"internals/operators/clipboard-image/#_5","title":"\u653e\u5230\u5f53\u524d\u7f16\u8f91\u5668","text":"<p>\u843d\u70b9\u4ecd\u5728 <code>actions.py</code> \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</p> <p>Plane \u8def\u5f84\u8c03\u7528 <code>convert_to_plane/image_plane.py</code> \u521b\u5efa\u4e2d\u5fc3\u539f\u70b9\u57fa\u7840\u7f51\u683c\uff0c\u5e76\u4ece\u8282\u70b9\u8d44\u4ea7\u52a0\u8f7d <code>O Image Plane</code>\u3002<code>actions.py</code> \u521b\u5efa\u56fe\u50cf\u6750\u8d28\u5e76\u653e\u5165 Mesh \u7b2c <code>0</code> \u4e2a\u6750\u8d28\u69fd\uff0c\u8282\u70b9\u7ec4\u53ea\u751f\u6210\u51e0\u4f55\u3002</p>"},{"location":"internals/operators/convert-to-panorama/","title":"Panorama \u8f6c\u6362","text":"<p><code>operators/convert_to_panorama/</code> \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\u3002<code>operators.py</code> \u63d0\u4ea4\u4efb\u52a1\uff0c<code>object.py</code> \u5bfc\u5165\u5bf9\u8c61\uff0c<code>__init__.py</code> \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002</p> <pre><code>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]</code></pre> <p>\u4efb\u52a1\u4f7f\u7528 Preferences \u9009\u62e9\u7684\u51e0\u4f55\u6a21\u578b\u3002\u6e90\u989c\u8272\u7531 Blender \u4fa7\u4fdd\u5b58\uff0cServer \u7684 <code>geometry/panorama.py</code> \u8d1f\u8d23\u89c6\u56fe\u91c7\u6837\u4e0e\u8ddd\u79bb\u878d\u5408\uff0c<code>jobs/panorama.py</code> \u7f16\u6392\u63a8\u7406\u548c\u4ea7\u7269\u5199\u5165\u3002</p>"},{"location":"internals/operators/convert-to-plane/","title":"Plane \u8f6c\u6362","text":"<p><code>operators/convert_to_plane/operators.py</code> \u63d0\u4f9b <code>ConvertToPlane</code>\u3001<code>ConvertToDepthPlane</code>\u3001<code>ConvertToReliefPlane</code> \u4e0e <code>GenerateDepthPlane</code>\u3002<code>object.py</code> \u5bfc\u5165\u5bf9\u8c61\u548c\u6750\u8d28\uff0c<code>image_plane.py</code> \u6784\u5efa\u57fa\u7840\u77e9\u5f62\u7f51\u683c\uff0c<code>__init__.py</code> \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002</p> <pre><code>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</code></pre> <p>\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</p> <p>Depth \u4e0e Relief \u4ece Preferences \u8bfb\u53d6\u51e0\u4f55\u6a21\u578b\u3001\u5206\u8fa8\u7387\u7ea7\u522b\u548c AI \u8f93\u5165\u4e0a\u9650\u3002<code>create_depth_plane_from_result()</code> \u5bfc\u5165\u4ea7\u7269\u5e76\u521b\u5efa\u4fee\u6539\u5668\u3002<code>O Image Depth Plane</code> \u4f7f\u7528\u76f8\u673a XYZ \u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6df1\u5ea6\u8868\u9762\uff1b<code>O Image Relief Plane</code> \u4f7f\u7528\u6df1\u5ea6 Z \u4e0e\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6d6e\u96d5\u3002</p> <p>\u8282\u70b9\u6784\u5efa\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6587\u4ef6\u534f\u8bae\u89c1Job \u4ea7\u7269\u3002</p>"},{"location":"internals/operators/cutout-tool/","title":"Cutout","text":"<p>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 <code>operators/cutout_tool/operators.py</code>\uff0cShape \u83dc\u5355\u4f4d\u4e8e <code>interaction.py</code>\uff0c\u9884\u8bbe\u6807\u8bc6\u4e0e\u8282\u70b9\u7ec4\u5bf9\u5e94\u5173\u7cfb\u4f4d\u4e8e <code>shape.py</code>\u3002</p> <pre><code>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]</code></pre> \u9884\u8bbe \u8282\u70b9\u7ec4 AI \u4ea7\u7269 Flat <code>O Image Cutout</code>\uff0cThickness 0 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Solid <code>O Image Cutout</code>\uff0cThickness 1 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Depth Symmetry <code>O Image Depth Cutout</code> \u4e0e <code>O Image Cutout Symmetry</code> \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Depth Solid <code>O Image Depth Cutout</code> \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf <p>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</p>"},{"location":"internals/operators/cutout-tool/#_1","title":"\u8f6e\u5ed3\u4e0e\u7f51\u683c","text":"<p><code>geometry.py</code> \u4ece\u5185\u5bb9 Alpha \u63d0\u53d6\u8fde\u901a\u8f6e\u5ed3\u4e0e\u5b54\u6d1e\uff0c\u6309 Edge Length \u751f\u6210 <code>BaseShape</code>\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</p> <p><code>mesh.py</code> \u8d1f\u8d23\u8f6e\u5ed3\u5206\u79bb\u3001\u5b54\u6d1e\u5904\u7406\u3001\u8d28\u91cf\u4e09\u89d2\u5316\u548c\u8fb9\u754c\u652f\u6491\uff0c<code>polygon.py</code> \u63d0\u4f9b\u8f6e\u5ed3\u7b80\u5316\uff0c<code>tangle.py</code> \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</p> <p><code>balloon.py</code> \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 <code>o_balloon</code>\u3002<code>boundary_padding.py</code> \u6309 Boundary Padding \u6cbf\u7ed3\u6784\u5185\u6cd5\u7ebf\u91cd\u91c7\u6837\u8f6e\u5ed3\u9644\u8fd1\u7684\u989c\u8272\u4e0e\u6df1\u5ea6\u3002</p>"},{"location":"internals/operators/cutout-tool/#ai","title":"AI \u4e0e\u5bf9\u8c61\u521b\u5efa","text":"<p>Server \u63a5\u6536 Selection bounds \u5185\u4fdd\u7559\u6e90 Alpha \u7684 RGBA\uff0c\u4e00\u6b21 MoGe \u63a8\u7406\u6309 <code>generate_depth</code> \u4e0e <code>normal_mode</code> \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</p> <p><code>object.py</code> \u7684 <code>create_shape_object()</code> \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</p> <p>\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</p>"},{"location":"internals/operators/frame/","title":"Frame \u591a\u56fe\u5408\u6210","text":"<p><code>operators/frame_tool/operators.py</code> \u5b9a\u4e49 <code>FrameImages</code> \u548c <code>FrameTool</code>\u3002<code>projection.py</code> \u8d1f\u8d23\u89c6\u56fe\u6295\u5f71\u3001\u4ea4\u53e0\u548c\u7ed3\u679c\u5e73\u9762\u5b9a\u4f4d\uff0c<code>compositing.py</code> \u8d1f\u8d23\u50cf\u7d20\u6df1\u5ea6\u6392\u5e8f\u4e0e\u8fb9\u754c\u8986\u76d6\u91c7\u6837\uff0c<code>__init__.py</code> \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</p> <pre><code>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]</code></pre> <p>\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</p> <p>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</p> <p>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</p>"},{"location":"internals/operators/mask/","title":"Mask Alpha \u7f16\u8f91","text":"<p><code>operators/mask_tool.py</code> \u5b9a\u4e49 <code>EditImageAlpha</code> \u548c <code>MaskTool</code>\uff0c\u4f7f\u7528 <code>common/viewport.py</code> \u7684 <code>ImageGesture</code> \u7ba1\u7406 Lasso\u3001Brush \u4e0e Polyline\u3002</p> <pre><code>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]</code></pre> \u6a21\u5f0f \u6e90 Alpha A \u4e0e\u8986\u76d6 M \u7684\u7ed3\u679c Set <code>A \u00d7 M</code> Extend <code>max(A, M)</code> Subtract <code>A \u00d7 (1 \u2212 M)</code> <p>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</p> <p>\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</p>"},{"location":"internals/operators/rectify/","title":"Rectify \u900f\u89c6\u6821\u6b63","text":"<p><code>operators/rectify_tool/operators.py</code> \u5b9a\u4e49 <code>RectifyImagePerspective</code> \u4e0e <code>RectifyTool</code>\uff0c\u5c06\u56fe\u7247\u5185\u7684\u56db\u89d2\u533a\u57df\u6821\u6b63\u4e3a\u77e9\u5f62\u3002<code>geometry.py</code> \u8d1f\u8d23\u56db\u89d2\u9a8c\u8bc1\u4e0e\u50cf\u7d20\u6821\u6b63\uff0c<code>preview.py</code> \u8d1f\u8d23\u9884\u89c8\u56fe\u3001Overlay \u548c\u5bbd\u9ad8\u6bd4\u63a7\u5236\uff0c<code>__init__.py</code> \u5bfc\u51fa\u7c7b\u578b\u53ca\u6ce8\u518c\u6e05\u5355\u3002</p> <pre><code>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]</code></pre> <p>\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 <code>common/image.py</code>\u3002\u8f93\u51fa\u6700\u957f\u8fb9\u4e0a\u9650 8192\uff0c\u603b\u50cf\u7d20\u4e0a\u9650 16,777,216\u3002</p> <p><code>replace_empty_image()</code> \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</p>"},{"location":"internals/operators/remove-background/","title":"Remove Background","text":"<p><code>operators/remove_background.py</code> \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u51c6\u5907\u8f93\u5165\u3002<code>RemoveImageBackground</code> \u534f\u8c03\u8bbe\u7f6e\u4e0e\u8f93\u5165\uff0c<code>RunBackgroundRemoval</code> \u63d0\u4ea4 Job \u5e76\u5e94\u7528\u7ed3\u679c\u3002</p> <pre><code>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</code></pre> <p><code>server/jobs/remove_background.py</code> \u8bfb\u53d6\u5355\u5f20\u8f93\u5165\u5e76\u8c03\u7528 <code>server/models/background.py</code>\uff0c\u652f\u6301 BiRefNet \u548c BEN2\u3002\u6a21\u578b\u524d\u666f Alpha \u4e0e\u6e90 Alpha \u5408\u6210\u3002</p> <p>\u666e\u901a\u7ed3\u679c\u901a\u8fc7 <code>ImageEditTarget</code> \u4fdd\u7559\u5171\u4eab\u56fe\u50cf\u5f15\u7528\u4e0e\u5e27\u8bbe\u7f6e\u3002HDR \u4f7f\u7528 <code>common/hdr_image.py</code> \u7684 <code>HdrBackgroundInput</code> \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</p>"},{"location":"internals/operators/upscale/","title":"Upscale","text":"<p><code>operators/upscale.py</code> \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</p> <pre><code>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]</code></pre> <p><code>server/models/upscale.py</code> \u5904\u7406\u8f93\u5165\u4e0a\u9650\u548c\u6700\u7ec8\u5c3a\u5bf8\uff0c<code>onnx_upscale.py</code> \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</p>"}]} |