├── .gitignore ├── LICENSE ├── README.md ├── README_en.md ├── __init__.py ├── config.ini ├── doc ├── assets │ ├── Dreamina.png │ ├── NanoBanana.png │ ├── NanoBanana2.png │ ├── Qwen-image.png │ ├── addkey.png │ ├── cloth_1.png │ ├── cloth_2.png │ ├── copykey.png │ ├── kontext.png │ ├── node.png │ ├── qr.jpg │ ├── redux.png │ ├── seed.png │ ├── seed2.png │ ├── seedance_1.png │ ├── seedance_2.png │ ├── seedream_v4.png │ ├── vidu_reference.png │ ├── 图片翻译.png │ └── 图片高清放大.png └── node_list.md ├── nodes ├── base.py ├── config.py └── node.py ├── pyproject.toml ├── requirements.txt ├── web └── mojie.js └── workflow ├── Dreamina(参考生图).json ├── Kontext.json ├── NanoBanana.json ├── Qwen-image.json ├── Vidu_reference.json ├── redux万物迁移.json ├── seedance.json ├── seededit.json ├── seedream_v4.json ├── 图片翻译.json ├── 图片高清放大.json ├── 服装模特生成(合集).json └── 服装模特生成(生成组图).json /.gitignore: -------------------------------------------------------------------------------- 1 | *.i 2 | *.ii 3 | *.gpu 4 | *.ptx 5 | *.cubin 6 | *.fatbin 7 | *.ini 8 | config.ini 9 | .idea 10 | __pycache__/ 11 | *.pyc 12 | *.pyo 13 | *.ini 14 | config.ini 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | Logo 3 |
4 | 5 |
6 | 7 | Bilibili 8 | 9 | 10 | YouTube 11 | 12 | 13 | Documentation 14 | 15 |
16 | 17 | *** 18 | 19 | MojieAI开发的Comfyui自定义节点工具。为了让comfyui更加普及,让本地低配置电脑也同样能顺利的运行comfyui,同时避免在comfyui中调用外部API时密钥和地址难以统一管理,以及许多更优秀模型本地算力难以支撑,本地部署耗时耗力,因此mjapi-party将许多优秀常用的API节点做整合,只需要一个API-key即可以调用全网的API接口能力,也能够通过comfyui节点式操作,保留极大的灵活性,极大的拓展了comfyui的易用性。更多API节点正逐步添加中,后续也会逐步增加对扣子和n8n的支持。 20 | 21 | *** 22 | 要使用此节点需前往 [mojieaigc.com](https://www.mojieaigc.com/) 注册账户 23 | 详细说明查看 24 | > [详细安装步骤](#安装步骤) 25 | 26 | > [安装视频教程](https://ecn0nfqh6woh.feishu.cn/wiki/NSrhwpEEQis0b8ktIdAcEbN4neh?from=from_copylink) 27 | 28 | > [摩诘AI的公开文档地址](https://ecn0nfqh6woh.feishu.cn/wiki/GITRwdanFi6gJHkYA9Nc9lDOnHd) 29 | 30 | 更多节点更新信息请关注B站'摩诘AI', 31 | [传送门](https://space.bilibili.com/483532108) 32 | 33 | ### 目前已支持的节点 34 | - [图片翻译节点](/doc/node_list.md#图片翻译节点) 35 | - [图片高清放大节点](/doc/node_list.md#图片高清放大节点) 36 | - [seedance视频生成](/doc/node_list.md#seedance视频生成) 37 | - [服装系列节点](/doc/node_list.md#服装系列节点) 38 | - [seedream-4](/doc/node_list.md#seedream-4使用说明) 39 | - [Gemini-NanoBanana](/doc/node_list.md#gemini-nanobanana使用说明) 40 | - [Qwen-image](/doc/node_list.md#qwen-image-使用说明) 41 | - [Qwen-edit-image](/doc/node_list.md#qwen-edit-image-使用说明) 42 | - [seededit3.0](/doc/node_list.md#seededit30) 43 | - [Dreamina(即梦参考生图)](/doc/node_list.md#dreamina即梦参考生图) 44 | - [Redux万物迁移](/doc/node_list.md#redux万物迁移) 45 | - [Kontext-pro&max](/doc/node_list.md#Kontext-pro&max) 46 | - [自动抠图](/doc/node_list.md#自动抠图) 47 | 48 | ### 节点使用说明 49 | 所有的节点说明文档在: 50 | > doc目录下[node_list.md](doc/node_list.md) 51 | 52 | 所有的节点示例工作流在: 53 | > workflow目录下 54 | 55 | 在comfyui节点列表中找到mjapiparty 56 | ![alt text](doc/assets/node.png) 57 | 58 | - 251012-新增图片翻译节点和图片高清放大节点 59 | #### 图片翻译节点 60 | 该节点支持20多种语言,包括中文、英文、日文、韩文、法文、德文、西班牙文、葡萄牙文、意大利文、俄语等,可以将图片中的文字翻译成其他语言。 61 | ![alt text](doc/assets/图片翻译.png) 62 | 63 | #### 图片高清放大节点 64 | 该节点可以将图片放大最高6倍,在保留细节的同时提高图片的清晰度。 65 | ![alt text](doc/assets/图片高清放大.png) 66 | 67 | - 250929-新增seedance视频生成节点,原有即梦视频生成已下线. 68 | #### seedance 视频生成节点使用说明 69 | 该模型语义理解与指令遵循能力强。运镜专业。支持多种视频风格,可以丝滑兼容各种风格的首图。分辨率支持480P、720P、1080P,时长支持3-10s,帧率24fps 70 | camerafixed是固定镜头开关,开启后将忽略镜头运镜提示词。 71 | duration是生成时长选项 72 | ![alt text](doc/assets/seedance_1.png) 73 | last_image不是必须的,接入了之后就是首尾帧,没有接入就是图生视频。 74 | ![alt text](doc/assets/seedance_2.png) 75 | 76 | 77 | - 250920-新增服装系列节点 78 | #### 服装系列节点 79 | 该节点是系列节点,也是摩诘AI首个集成工作流,因此无需复杂操作即可完成服装类的大部分工作,涵盖服装系列全流程工作流。其中有:服装模特生成,服装白底图提取,姿势更改和服装替换。详细操作教程参考工作流。工作流共有2个,1个是4功能合计,另一个是串联后的组图生成。工作流在workflow目录下,拖入comfyui即可使用. 80 | 4功能合集: 81 | ![alt text](doc/assets/cloth_1.png) 82 | 组图生成工作流: 83 | ![alt text](doc/assets/cloth_2.png) 84 | 85 | - 250915-新增节点 86 | #### seedream-4使用说明 87 | Seedream 4.0 原生支持文本、单图和多图输入,实现基于主体一致性的多图融合创作、图像编辑、组图生成等多样玩法,实现包括组图生成、多参考图生图等图片生成能力。支持中文输入输出,支持多照片组合输入。seedream_v4支持4k高清输出,节点中配置了预设尺寸。 88 | 也可以通过自定义宽高来控制输出尺寸。custom_size是自定义尺寸的开关。 89 | 多图组合和Nano的不一样,无需拼接,可直接组合批次输入,seedream会自动拼接。最多可支持10张图片进行组合。 90 | 91 | ![alt text](/doc/assets/seedream_v4.png) 92 | 93 | - 250902-新增节点 94 | #### Gemini-NanoBanana使用说明 95 | Gemini 2.5 Flash Image Preview又名NanoBanana是一款强大的图片编辑模型。 96 | 支持中文输入,不支持中文输出,同时也自带了翻译开关is_translation默认关闭 97 | ![alt text](doc/assets/NanoBanana.png) 98 | ![alt text](doc/assets/NanoBanana2.png) 99 | 100 | 101 | - 250820-新增节点 102 | #### Qwen-image 103 | Qwen-image是阿里开源的AI绘画工具,对中文的支持非常友好,能够准确的画出细节的小字和排版,支持中文输入,中文输出。 104 | prompt_extend是提示词扩写参数,默认开启,仅需简单提示词就可以出来非常不错的画面效果。 105 | #### Qwen-edit-image 106 | 和seededit功能一样能通过文字描述修改图片。各有千秋,价格便宜,支持使用中文提示词,支持输出中文。 107 | 108 | ![alt text](doc/assets/Qwen-image.png) 109 | 110 | - 250714-新增节点: 111 | seededit3.0 112 | SeedEdit 3.0 是字节跳动开发的图片编辑工具,能通过文字描述修改图片。比如你说 “把背景换成海边”。支持使用中文提示词,支持输出中文,对比kontext一致性保持更好,支持中文提示词输入和中文文本输出。效果相当不错。 113 | ![alt text](doc/assets/seed.png) 114 | ![alt text](doc/assets/seed2.png) 115 | 116 | #### Kontext-pro&max 117 | ![alt text](doc/assets/kontext.png) 118 | Kontext 是一个基于大模型的 AI 绘画工具,它可以通过文字描述生成图像。 119 | - 加入了翻译开关is_translation,在每个节点中都有,默认是关闭的。打开可以输入中文。 120 | - max效果更好,pro性价比更高。视频教程可以查看: 121 | > [Kontext-pro&max详细测评教程](https://www.bilibili.com/video/BV19931zAE4c/?vd_source=25d3add966daa64cbb811354319ec18d#reply268510289936) 122 | - 使用前请确保你的账户中有足够的余额 123 | 124 | *** 125 | 126 | 127 | ### 安装步骤 128 | 1. 确保你已经安装了ComfyUI。 129 | 2. 在comfyui-manager中搜索mojieapi_party直接安装本项目 130 | 3. 或者在comfyui/custom_nodes目录下 131 | ```plaintext 132 | git clone https://github.com/MoJIeAIGC/comfyui-MJAPI-party.git 133 | ``` 134 | 5. mojieaigc.com网站上注册一个账户 135 | ```url 136 | https://www.mojieaigc.com 137 | ``` 138 | 139 | 6. 登录后获取自己的API-KEY 140 | 141 | ![alt text](doc/assets/copykey.png) 142 | 143 | 7. 修改`config.ini`文件,在项目目根目录下,内容示例如下: 144 | 145 | ![alt text](doc/assets/addkey.png) 146 | 147 | ```ini 148 | [API] 149 | KEY = your_api_key 150 | BASE_URL = https://www.mojieaigc.com/v1/completions 151 | ``` 152 | 请求地址不要动,填入KEY就行了。 153 | 填入密钥key后记得重启comfyui,才能生效 154 | 155 | ### 联系我们 156 | wechat:mojie_AIGC 157 | 扫描下方二维码 158 |
159 | QR Code 160 |
161 | 162 | 163 | *** 164 | 165 | ### star 166 |
167 | 168 | Star History Chart 169 | 170 |
171 | -------------------------------------------------------------------------------- /README_en.md: -------------------------------------------------------------------------------- 1 |
2 | Logo 3 |
4 | 5 |
6 | 7 | Bilibili 8 | 9 | 10 | YouTube 11 | 12 | 13 | Documentation 14 | 15 |
16 | 17 | 18 | *** 19 | 20 | ComfyUI custom node tool developed by MojieAI. To address the challenges of managing API keys and endpoints when calling external APIs in ComfyUI, and considering that many superior models require substantial local computing power and time-consuming local deployment, mjapi-party integrates numerous excellent and commonly used API nodes. With just one API key, you can access API capabilities across the web while maintaining the flexibility of ComfyUI's node-based operations, greatly enhancing ComfyUI's usability. More API nodes are being added gradually, and support for Koishi and n8n will be added in the future. 21 | 22 | *** 23 | To use this node, please register an account at [mojieaigc.com](https://www.mojieaigc.com/) 24 | For detailed instructions, see: 25 | > [Detailed Installation Steps](#installation-steps) 26 | 27 | ### Currently Supported Nodes 28 | - [seededit3.0](/doc/node_list.md#seededit30) 29 | - [Dreamina](/doc/node_list.md#Dreamina(即梦)) 30 | - [Redux Migration](/doc/node_list.md#redux万物迁移) 31 | - [Kontext-pro&max](/doc/node_list.md#Kontext-pro&max) 32 | - [Automatic Image Matting](/doc/node_list.md#自动抠图) 33 | 34 | ### Node Usage Instructions 35 | All node documentation can be found in: 36 | > [node_list.md](doc/node_list.md) in the doc directory 37 | 38 | All node example workflows are in: 39 | > workflow directory 40 | 41 | Find mjapiparty in the ComfyUI node list 42 | ![alt text](doc/assets/node.png) 43 | 44 | - 250714-New Node: 45 | seededit3.0 46 | SeedEdit 3.0 is an image editing tool developed by ByteDance that can modify images through text descriptions. For example, you can say "change the background to a beach." It supports Chinese prompts, Chinese output, maintains better consistency compared to Kontext, and supports Chinese prompt input and Chinese text output. The results are quite impressive. 47 | ![alt text](doc/assets/seed.png) 48 | ![alt text](doc/assets/seed2.png) 49 | #### Redux Migration 50 | This is a flux-redux migration integration node. Everything is configured and ready to use without downloading models. 51 | ![alt text](doc/assets/redux.png) 52 | - migrate_image and migrate_mask are required uploads for the image to be migrated and the mask for the migration area. 53 | - Product_image and Product_mask are for uploading the product image to be migrated. The mask is not mandatory. 54 | - However, adding a mask to Product_mask details can make detail restoration more accurate. 55 | - Prompts are optional as there are default prompts. You can simply describe what the item is. 56 | - Strength between 0.6-0.9 is sufficient 57 | #### Kontext-pro&max 58 | ![alt text](doc/assets/kontext.png) 59 | Kontext is an AI drawing tool based on large models that can generate images through text descriptions. 60 | - Added translation switch is_translation in each node, which is off by default. When enabled, you can input Chinese. 61 | - aspect_ratio controls dimensions, default is "default" where Kontext controls the output image size. You can also enable it to select dimensions according to your needs. 62 | - max has better effects, pro offers better value for money. Video tutorial available at: 63 | > [Kontext-pro&max Detailed Review Tutorial](https://www.bilibili.com/video/BV19931zAE4c/?vd_source=25d3add966daa64cbb811354319ec18d#reply268510289936) 64 | - Please ensure you have sufficient balance in your account before use 65 | #### Dreamina 66 | ![alt text](doc/assets/Dreamina.png) 67 | Dreamina is an AI drawing tool based on large models that supports Chinese input and output. It was specifically added to mjapiparty to fully leverage ComfyUI's flexible combination capabilities, and to avoid having to recharge in Dreamina itself. The mojie-api-party node includes two Dreamina nodes: text-to-image and image-to-image. 68 | - Dreamina text-to-image supports Chinese input and output. It has good understanding of obscure or Chinese-specific concepts. 69 | - Dreamina image-to-image has multiple reference modes in gen_mode selection: 70 | - First mode, creative, is creative mode, which can be understood as full image reference 71 | - Second mode, reference, is face reference 72 | - Third mode, reference_char, is character reference 73 | - The default cfg is 2.5, please do not modify 74 | 75 | *** 76 | 77 | 78 | ### Installation Steps 79 | 1. Make sure you have installed ComfyUI. 80 | 2. Search for mojieapi_party in comfyui-manager to install this project directly 81 | 3. Or in the comfyui/custom_nodes directory: 82 | ```plaintext 83 | git clone https://github.com/MoJIeAIGC/comfyui-MJAPI-party.git 84 | 4. Run requirements to install dependencies: 85 | 86 | pip install -r requirements.txt 87 | 88 | 6. Register an account on mojieaigc.com website 89 | 7. Log in to get your API-KEY 90 | 8. Create a config.ini file in the project root directory with the following content: 91 | ``` 92 | [API] 93 | ``` 94 | KEY = your_api_key 95 | BASE_URL = https://www.mojieaigc.com/v1/ 96 | completions 97 | ``` 98 | Do not change the request address, just fill in the KEY. 99 | Remember to restart ComfyUI after entering the key 100 | 101 | ### Contact Us 102 | WeChat: mojie_AIGC 103 | Scan the QR code below 104 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | import importlib.util 2 | import importlib 3 | from .nodes.node import ConfigManager 4 | from server import PromptServer 5 | from aiohttp import web 6 | config_manager = ConfigManager() 7 | import os 8 | import subprocess 9 | import logging 10 | import requests 11 | 12 | routes = PromptServer.instance.routes 13 | @routes.post('/my_node/set_key') 14 | async def set_key(request): 15 | try: 16 | data = await request.json() 17 | key = data.get("api_key", "") 18 | config_manager.set_api_key(key) 19 | print(f"收到保存请求,KEY长度: {len(key)}") 20 | except Exception as e: 21 | print(f"保存KEY失败: {str(e)}") 22 | return web.json_response({"msg": f"保存失败: {e}"}, status=500) 23 | return web.json_response({"msg": "ok"}) 24 | 25 | @routes.get('/my_node/get_key') 26 | async def get_key(request): 27 | oneapi_url, oneapi_token = config_manager.get_api_config() 28 | # 读取pyproject.toml中的version 29 | import toml 30 | pyproject_path = os.path.join(os.path.dirname(__file__), "pyproject.toml") 31 | with open(pyproject_path, "r", encoding="utf-8") as f: 32 | pyproject_data = toml.load(f) 33 | version = pyproject_data["project"]["version"] 34 | 35 | return web.json_response({ 36 | "msg": oneapi_token, 37 | "version": version 38 | }) 39 | 40 | 41 | 42 | @routes.get('/my_node/get_user') 43 | async def get_user(request): 44 | oneapi_url, oneapi_token = config_manager.get_api_config() 45 | oneapi_token = oneapi_token[3:] 46 | response = requests.get(f"https://mojieaigc.com/api/userinfoo?oneapi_token={oneapi_token}") 47 | data = response.json() 48 | print(f"用户信息响应: {data}") 49 | username = data.get("username", "未知用户") 50 | quota = data.get("quota", 0) 51 | quota = round(quota/100, 2) 52 | print(f"获取用户信息: {username}, 配额: {quota}") 53 | 54 | return web.json_response({ 55 | "msg": oneapi_token, 56 | "username": username, 57 | "quota": quota 58 | }) 59 | 60 | 61 | @routes.post('/my_node/update') 62 | async def update(request): 63 | try: 64 | repo_dir = os.path.dirname(__file__) 65 | logging.info(f"[update] 仓库目录: {repo_dir}") 66 | logging.info("[update] 开始执行更新逻辑") 67 | 68 | def run_ok(cmd): 69 | try: 70 | result = subprocess.run( 71 | cmd, cwd=repo_dir, text=True, capture_output=True, check=True 72 | ) 73 | # 成功:仅用于调试的简洁日志;不要用输出内容当成功条件 74 | logging.info(f"[update] ✔ {' '.join(cmd)}\nstdout: {result.stdout.strip()}\nstderr: {result.stderr.strip()}") 75 | return True 76 | except subprocess.CalledProcessError as e: 77 | logging.error(f"[update] ✖ {' '.join(cmd)}\nstdout: {e.stdout.strip() if e.stdout else ''}\nstderr: {e.stderr.strip() if e.stderr else ''}") 78 | return False 79 | 80 | def ensure_remote(name, url): 81 | try: 82 | remotes = subprocess.check_output(["git", "remote"], cwd=repo_dir, text=True).splitlines() 83 | if name not in remotes: 84 | run_ok(["git", "remote", "add", name, url]) 85 | logging.info(f"[update] 新增远程: {name} → {url}") 86 | else: 87 | current_url = subprocess.check_output(["git", "remote", "get-url", name], cwd=repo_dir, text=True).strip() 88 | if current_url != url: 89 | run_ok(["git", "remote", "set-url", name, url]) 90 | logging.info(f"[update] 更新远程 {name} → {url}") 91 | except Exception as e: 92 | logging.error(f"[update] ensure_remote 出错: {e}") 93 | 94 | def get_remote_head_branch(remote): 95 | # 解析 "git remote show " 里的 "HEAD branch: xxx" 96 | try: 97 | info = subprocess.check_output(["git", "remote", "show", remote], cwd=repo_dir, text=True, errors="ignore") 98 | for line in info.splitlines(): 99 | if "HEAD branch" in line: 100 | return line.split(":")[-1].strip() 101 | except Exception as e: 102 | logging.error(f"[update] 获取 {remote} 默认分支失败: {e}") 103 | return None 104 | 105 | GITHUB_NAME, GITHUB_URL = "github", "https://github.com/MoJIeAIGC/comfyui-MJAPI-party.git" 106 | GITEE_NAME, GITEE_URL = "gitee", "https://gitee.com/moja_1/comfyui-MJAPI-party.git" 107 | 108 | ensure_remote(GITHUB_NAME, GITHUB_URL) 109 | ensure_remote(GITEE_NAME, GITEE_URL) 110 | 111 | def hard_reset(remote): 112 | # 自动识别远程默认分支,失败则尝试 main/master 113 | branch = get_remote_head_branch(remote) or "main" 114 | logging.info(f"[update] {remote} 默认分支: {branch}") 115 | 116 | # fetch 默认分支;若失败且不是 master,则再尝试 master 117 | if not run_ok(["git", "fetch", remote, branch]): 118 | if branch != "master" and run_ok(["git", "fetch", remote, "master"]): 119 | branch = "master" 120 | else: 121 | return False 122 | 123 | # 用 checkout -B 强制把本地 指向 remote/ 124 | # -B:存在则重置,不存在则创建;-f 强制切换避免工作区阻塞 125 | if not run_ok(["git", "checkout", "-f", "-B", branch, f"{remote}/{branch}"]): 126 | return False 127 | 128 | # 强制把工作区/索引对齐远程 129 | if not run_ok(["git", "reset", "--hard", f"{remote}/{branch}"]): 130 | return False 131 | 132 | # (可选)清理未跟踪文件:如需更“干净”,解除注释下一行 133 | # run_ok(["git", "clean", "-fd"]) 134 | 135 | logging.info(f"[update] 已成功同步到 {remote}/{branch}") 136 | return True 137 | 138 | # 国内网络优先用 Gitee,同步失败再回退 GitHub 139 | success = hard_reset(GITHUB_NAME) or hard_reset(GITEE_NAME) 140 | if not success: 141 | logging.error("[update] GitHub 和 Gitee 同步都失败") 142 | return web.json_response({"msg": "更新失败"}, status=500) 143 | 144 | logging.info("[update] 更新完成") 145 | return web.json_response({"msg": "ok"}) 146 | except Exception as e: 147 | logging.exception("[update] 发生异常") 148 | return web.json_response({"msg": f"更新失败: {e}"}, status=500) 149 | 150 | node_list = [ 151 | "node", 152 | ] 153 | WEB_DIRECTORY = "./web" 154 | NODE_CLASS_MAPPINGS = {} 155 | NODE_DISPLAY_NAME_MAPPINGS = {} 156 | 157 | for module_name in node_list: 158 | imported_module = importlib.import_module(f".nodes.{module_name}", __name__) 159 | NODE_CLASS_MAPPINGS = {**NODE_CLASS_MAPPINGS, **imported_module.NODE_CLASS_MAPPINGS} 160 | NODE_DISPLAY_NAME_MAPPINGS = {**NODE_DISPLAY_NAME_MAPPINGS, **imported_module.NODE_DISPLAY_NAME_MAPPINGS} 161 | 162 | 163 | __all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [API] 2 | KEY = 3 | BASE_URL = https://www.mojieaigc.com/v1/completions 4 | -------------------------------------------------------------------------------- /doc/assets/Dreamina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/Dreamina.png -------------------------------------------------------------------------------- /doc/assets/NanoBanana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/NanoBanana.png -------------------------------------------------------------------------------- /doc/assets/NanoBanana2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/NanoBanana2.png -------------------------------------------------------------------------------- /doc/assets/Qwen-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/Qwen-image.png -------------------------------------------------------------------------------- /doc/assets/addkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/addkey.png -------------------------------------------------------------------------------- /doc/assets/cloth_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/cloth_1.png -------------------------------------------------------------------------------- /doc/assets/cloth_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/cloth_2.png -------------------------------------------------------------------------------- /doc/assets/copykey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/copykey.png -------------------------------------------------------------------------------- /doc/assets/kontext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/kontext.png -------------------------------------------------------------------------------- /doc/assets/node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/node.png -------------------------------------------------------------------------------- /doc/assets/qr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/qr.jpg -------------------------------------------------------------------------------- /doc/assets/redux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/redux.png -------------------------------------------------------------------------------- /doc/assets/seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/seed.png -------------------------------------------------------------------------------- /doc/assets/seed2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/seed2.png -------------------------------------------------------------------------------- /doc/assets/seedance_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/seedance_1.png -------------------------------------------------------------------------------- /doc/assets/seedance_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/seedance_2.png -------------------------------------------------------------------------------- /doc/assets/seedream_v4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/seedream_v4.png -------------------------------------------------------------------------------- /doc/assets/vidu_reference.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/vidu_reference.png -------------------------------------------------------------------------------- /doc/assets/图片翻译.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/图片翻译.png -------------------------------------------------------------------------------- /doc/assets/图片高清放大.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJIeAIGC/comfyui-MJAPI-party/0a3f225ab3be58f382d2195ab5cc2ce644ec67b7/doc/assets/图片高清放大.png -------------------------------------------------------------------------------- /doc/node_list.md: -------------------------------------------------------------------------------- 1 | #### 所有API节点列表 2 | 所有的节点示例工作流都可以在workflow目录下找到 3 | - [图片翻译节点](#图片翻译节点) 4 | - [图片高清放大节点](#图片高清放大节点) 5 | - [seedance 视频生成节点](#seedance-视频生成节点使用说明) 6 | - [服装系列节点](#服装系列节点) 7 | - [seedream-4.0](#seedream-4使用说明) 8 | - [Gemini-NanoBanana](#gemini-nanobanana使用说明) 9 | - [Qwen-image](#qwen-image-使用说明) 10 | - [Qwen-edit-image](#qwen-edit-image-使用说明) 11 | - [seededit3.0](#seededit30) 12 | - [Redux万物迁移](#redux万物迁移) 13 | - [Kontext-pro&max](#Kontext-pro&max) 14 | - [自动抠图](#自动抠图) 15 | - [Dreamina(即梦参考生图)](#dreamina即梦参考生图) 16 | 17 | *** 18 | #### 图片翻译节点 19 | 该节点支持20多种语言,包括中文、英文、日文、韩文、法文、德文、西班牙文、葡萄牙文、意大利文、俄语等,可以将图片中的文字翻译成其他语言。 20 | ![alt text](assets/图片翻译.png) 21 | 22 | #### 图片高清放大节点 23 | 该节点可以将图片放大最高6倍,在保留细节的同时提高图片的清晰度。 24 | ![alt text](assets/图片高清放大.png) 25 | 26 | #### seedance 视频生成节点使用说明 27 | 该模型语义理解与指令遵循能力强。运镜专业。支持多种视频风格,可以丝滑兼容各种风格的首图。分辨率支持480P、720P、1080P,时长支持3-10s,帧率24fps 28 | camerafixed是固定镜头开关,开启后将忽略镜头运镜提示词。 29 | duration是生成时长选项 30 | ![alt text](assets/seedance_1.png) 31 | last_image不是必须的,接入了之后就是首尾帧,没有接入就是图生视频。 32 | ![alt text](assets/seedance_2.png) 33 | #### 服装系列节点 34 | 该节点是系列节点,涵盖服装系列全流程工作流。其中有:服装模特生成,服装白底图提取,姿势更改和服装替换。详细操作教程参考工作流。工作流共有2个,1个是4功能合计,另一个是串联后的组图生成。 35 | 4功能合集: 36 | ![alt text](assets/cloth_1.png) 37 | 组图生成工作流: 38 | ![alt text](assets/cloth_2.png) 39 | 40 | #### seedream-4使用说明 41 | Seedream 4.0 原生支持文本、单图和多图输入,实现基于主体一致性的多图融合创作、图像编辑、组图生成等多样玩法,实现包括组图生成、多参考图生图等图片生成能力。支持中文输入输出,支持多照片组合输入。seedream_v4支持4k高清输出,节点中配置了预设尺寸。 42 | 也可以通过自定义宽高来控制输出尺寸。custom_size是自定义尺寸的开关。 43 | 多图组合和Nano的不一样,无需拼接,可直接组合批次输入,seedream会自动拼接。最多可支持10张图片进行组合。 44 | 45 | ![alt text](assets/seedream_v4.png) 46 | 47 | #### Gemini-NanoBanana使用说明 48 | NanoBanana又名Gemini 2.5 Flash Image Preview,是google旗下的图片编辑工具。提示词遵循强度很高。基本不需要特别的提示词格式,支持中英文输入,但是不支持中文输出,可输出英文字体。 49 | is_translation是翻译开关,如果中文输入效果不理想,可以把翻译开关打开,翻译过后再试。 50 | ![alt text](assets/NanoBanana.png) 51 | ![alt text](assets/NanoBanana2.png) 52 | 53 | #### Qwen-image 使用说明 54 | Qwen-image是阿里开源的AI绘画工具,对中文的支持非常友好,能够准确的画出细节的小字和排版,支持中文输入,中文输出。 55 | prompt_extend是提示词扩写参数,默认开启,仅需简单提示词就可以出来非常不错的画面效果。 56 | #### Qwen-edit-image 使用说明 57 | 和seededit功能一样能通过文字描述修改图片。各有千秋,价格便宜,支持使用中文提示词,支持输出中文。具体使用方法和标准提示词可以参考seededit 58 | 59 | ![alt text](assets/Qwen-image.png) 60 | 61 | #### seededit3.0 使用说明 62 | SeedEdit 3.0 是字节跳动开发的图片编辑工具, 63 | 能通过文字描述修改图片。比如你说 “把背景换成海边”。支持使用中文提示词,支持输出中文。 64 | ![alt text](assets/seed.png) 65 | ![alt text](assets/seed2.png) 66 | 67 | 用于编辑图像的提示词 ,建议: 68 | - 建议长度 <= 120字符,prompt过长有概率出图异常或不生效 69 | - 编辑指令使用自然语言即可 70 | - 每次编辑使用单指令会更好 71 | - 局部编辑时指令描述尽量精准,尤其是画面有多个实体的时候,描述清楚对谁做什么,能获取更精准的编辑效果 72 | - 发现编辑效果不明显的时候,可以调整一下编辑强度cfg_scale,数值越大越贴近指令执行 73 | 尽量使用清晰的,分辨率高的底片. 74 | ##### 提示词参考示例: 75 | - 添加/删除实体:添加/删除xxx(删除图上的女孩/添加一道彩虹) 76 | - 修改实体:把xxx改成xxx(把手里的鸡腿变成汉堡) 77 | - 修改风格:改成xxx风格(改成漫画风格) 78 | - 修改色彩:把xxx改成xx颜色(把衣服改成粉色的) 79 | - 修改动作:修改表情动作(让他哭/笑/生气) 80 | - 修改环境背景:背景换成xxx,在xxx(背景换成海边/在星空下) 81 | *** 82 | #### Redux万物迁移 83 | 这是flux-redux的迁移整合节点,一切都配置好了,无需下载模型,只需直接使用即可。 84 | ![alt text](assets/redux.png) 85 | - migrate_image和migrate_mask是必选项上传需要被迁移的图片和迁移区域的遮罩。 86 | - Product_image和Product_mask是上传迁移产品图,遮罩不是必须的。 87 | - 但是可以给Product_mask细节处添加遮罩,可以让细节还原更加准确。 88 | - 提示词可以不填,有默认提示词。或者简单形容一下这个是什么物品。 89 | - 强度在0.6-0.9即可 90 | #### Kontext-pro&max 91 | ![alt text](assets/kontext.png) 92 | Kontext 是一个基于大模型的 AI 绘画工具,它可以通过文字描述生成图像。 93 | - 加入了翻译开关is_translation,在每个节点中都有,默认是关闭的。打开可以输入中文。 94 | - aspect_ratio是尺寸控制,默认是default,由kontext自己控制输出图片的尺寸。也可以开启根据自己的需要选择尺寸。 95 | - max效果更好,pro性价比更高。视频教程可以查看: 96 | > [Kontext-pro&max详细测评教程](https://www.bilibili.com/video/BV19931zAE4c/?vd_source=25d3add966daa64cbb811354319ec18d#reply268510289936) 97 | - 使用前请确保你的账户中有足够的余额 98 | 99 | #### Dreamina(即梦参考生图) 100 | 加入Qwen-image后,即梦文身图就没有太多存在的意义了,完全可以平替即梦。但是即梦的参考生图还是非常不错的,在人像还原上也非常准确。 101 | 102 | ![alt text](assets/Dreamina.png) 103 | 104 | 即梦图生图有多种参考模式gen_mode选下下 105 | 第一种 creative 是创意模式,可以理解为全图参考 106 | 第二种 reference 人脸参考 107 | 第三种 reference_char 人物参考 108 | cfg默认2.5请勿修改 109 | 110 | ##### 自动抠图 111 | 图片上传最大不超过10M 112 | 用就行了,没啥参数。 113 | 带了遮罩就按遮罩范围抠图 114 | 115 | 116 | -------------------------------------------------------------------------------- /nodes/base.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | from PIL import Image, ImageDraw, ImageFont, PngImagePlugin 4 | import base64 5 | from io import BytesIO 6 | import os 7 | import requests 8 | import logging 9 | from comfy_api.input_impl.video_types import VideoFromFile 10 | class ImageConverter: 11 | @staticmethod 12 | def pil2tensor(image): 13 | img_array = np.array(image).astype(np.float32) / 255.0 # (H, W, 3) 14 | img_tensor = torch.from_numpy(img_array)[None,] # (1, H, W, 3) 15 | return img_tensor 16 | 17 | @staticmethod 18 | def tensor2pil(tensor): 19 | try: 20 | # Tensor (1, H, W, 3) to PIL 21 | image = tensor.squeeze().numpy() * 255.0 22 | return Image.fromarray(image.astype(np.uint8)) 23 | except Exception as e: 24 | return None 25 | 26 | @staticmethod 27 | def prepare_and_stitch_images(model_image, cloth_image): 28 | """ 29 | 准备并拼接模特图和服装图 30 | 1. 模特图(右图)单边超过1280则等比缩小至1280 31 | 2. 服装图(左图)保持原尺寸 32 | 3. 合并左右图,保持等高,短边图等比拉伸 33 | """ 34 | # 转换模特图为PIL 35 | model_pil = ImageConverter.tensor2pil(model_image) 36 | # 转换服装图为PIL 37 | cloth_pil = ImageConverter.tensor2pil(cloth_image) 38 | 39 | # 1. 处理模特图 - 如果单边超过1280则等比缩小 40 | max_size = 1280 41 | if max(model_pil.size) > max_size: 42 | ratio = max_size / max(model_pil.size) 43 | new_width = int(model_pil.width * ratio) 44 | new_height = int(model_pil.height * ratio) 45 | model_pil = model_pil.resize((new_width, new_height), Image.LANCZOS) 46 | 47 | # 2. 处理服装图 - 保持原尺寸 48 | 49 | # 3. 合并图片 - 保持等高 50 | # 确定目标高度(取两者中较大的高度) 51 | target_height = max(model_pil.height, cloth_pil.height) 52 | 53 | # 调整模特图高度 54 | if model_pil.height != target_height: 55 | ratio = target_height / model_pil.height 56 | new_width = int(model_pil.width * ratio) 57 | model_pil = model_pil.resize((new_width, target_height), Image.LANCZOS) 58 | 59 | # 调整服装图高度 60 | if cloth_pil.height != target_height: 61 | ratio = target_height / cloth_pil.height 62 | new_width = int(cloth_pil.width * ratio) 63 | cloth_pil = cloth_pil.resize((new_width, target_height), Image.LANCZOS) 64 | 65 | # 创建新图片(宽度为两者之和) 66 | new_img = Image.new('RGB', (cloth_pil.width + model_pil.width, target_height)) 67 | new_img.paste(cloth_pil, (0, 0)) # 左图 68 | new_img.paste(model_pil, (cloth_pil.width, 0)) # 右图 69 | 70 | # 转换为base64 71 | buffered = BytesIO() 72 | new_img.save(buffered, format="JPEG") 73 | return base64.b64encode(buffered.getvalue()).decode("utf-8") 74 | 75 | 76 | @staticmethod 77 | def process_images(face_image, cloths_image, save_filename="output.jpg"): 78 | """ 79 | 新逻辑: 80 | - 有脸:832x1248 白色画布,上 1/3 区域放脸,下 2/3 区域放衣服,等比缩放居中 81 | - 无脸:衣服图单独居中缩放到 832x1248,等比缩放,不强行填满 82 | - 保存到项目目录并返回 base64 83 | """ 84 | canvas_width, canvas_height = 832, 1248 85 | face_area_height = canvas_height // 3 # 416 86 | cloth_area_height = canvas_height - face_area_height # 832 87 | 88 | # 创建白色背景 89 | new_img = Image.new('RGB', (canvas_width, canvas_height), (255, 255, 255)) 90 | 91 | if face_image is not None: 92 | # 有脸部图 93 | face_pil = ImageConverter.tensor2pil(face_image) 94 | cloth_pil = ImageConverter.tensor2pil(cloths_image) 95 | 96 | # --- 处理脸部 (放在上方 1/3 区域,等比缩放) --- 97 | ratio = min(canvas_width / face_pil.width, face_area_height / face_pil.height, 1.0) 98 | new_width = int(face_pil.width * ratio) 99 | new_height = int(face_pil.height * ratio) 100 | face_pil = face_pil.resize((new_width, new_height), Image.LANCZOS) 101 | paste_x = (canvas_width - new_width) // 2 102 | paste_y = (face_area_height - new_height) // 2 103 | new_img.paste(face_pil, (paste_x, paste_y)) 104 | 105 | # --- 处理服装 (放在下方 2/3 区域,等比缩放) --- 106 | ratio = min(canvas_width / cloth_pil.width, cloth_area_height / cloth_pil.height, 1.0) 107 | new_width = int(cloth_pil.width * ratio) 108 | new_height = int(cloth_pil.height * ratio) 109 | cloth_pil = cloth_pil.resize((new_width, new_height), Image.LANCZOS) 110 | paste_x = (canvas_width - new_width) // 2 111 | paste_y = face_area_height + (cloth_area_height - new_height) // 2 112 | new_img.paste(cloth_pil, (paste_x, paste_y)) 113 | 114 | else: 115 | # 没有脸部图 → 衣服图单独居中缩放到整个画布 116 | cloth_pil = ImageConverter.tensor2pil(cloths_image) 117 | ratio = min(canvas_width / cloth_pil.width, canvas_height / cloth_pil.height, 1.0) 118 | new_width = int(cloth_pil.width * ratio) 119 | new_height = int(cloth_pil.height * ratio) 120 | cloth_pil = cloth_pil.resize((new_width, new_height), Image.LANCZOS) 121 | paste_x = (canvas_width - new_width) // 2 122 | paste_y = (canvas_height - new_height) // 2 123 | new_img.paste(cloth_pil, (paste_x, paste_y)) 124 | 125 | # 保存到项目目录 126 | # save_path = os.path.join(os.getcwd(), save_filename) 127 | # new_img.save(save_path, format="JPEG") 128 | 129 | # 转 base64 130 | buffered = BytesIO() 131 | new_img.save(buffered, format="JPEG") 132 | return base64.b64encode(buffered.getvalue()).decode("utf-8") 133 | 134 | @staticmethod 135 | def tensor_to_base64(image_tensor): 136 | """ 137 | 将图像张量转换为 base64 编码的字符串 138 | 139 | :param image_tensor: 输入的图像张量 140 | :return: base64 编码的字符串 141 | """ 142 | pil_image = ImageConverter.tensor2pil(image_tensor) 143 | buffered = BytesIO() 144 | pil_image.save(buffered, format="JPEG") 145 | return base64.b64encode(buffered.getvalue()).decode("utf-8") 146 | 147 | @staticmethod 148 | def get_status_error_msg(response,cate=0): 149 | """ 150 | 根据响应对象返回对应的错误信息 151 | 152 | :param response: requests.Response对象 153 | :return: 对应的错误信息字符串 154 | """ 155 | status_code = response.status_code 156 | error_msg_map = { 157 | 400: "请求参数错误,请检查输入 (Bad request, check input)", 158 | 401: "未授权,请检查 API Token (Unauthorized, check API Token)", 159 | 403: "权限不足,请检查余额或令牌权限 (Forbidden, check balance or permissions)", 160 | 404: "请求资源不存在 (Resource not found)", 161 | 500: "服务器繁忙,请稍后再试 (Server busy, try later)", 162 | 502: "网关错误 (Bad gateway)", 163 | 503: "服务不可用 (Service unavailable)", 164 | 504: "网关超时 (Gateway timeout)" 165 | } 166 | error_msg = error_msg_map.get(status_code, f"请求失败,状态码: {status_code}") 167 | # return error_msg_map.get(status_code, f"请求失败,状态码: {status_code}") 168 | 169 | if cate == 1: 170 | try: 171 | error_data = response.json() 172 | error_msg1 = error_data.get("error", {}).get("message", "") 173 | # 尝试解析嵌套的JSON字符串 174 | import json 175 | import re 176 | try: 177 | match = re.search(r'^\{.*\}', error_msg1) 178 | if match: 179 | json_part = match.group(0) 180 | outer = json.loads(json_part) 181 | inner_str = outer['error'][2:-1] # 去掉 b' 和最后的 ' 182 | inner_json = json.loads(inner_str) 183 | error_msg = inner_json['message'] 184 | except: 185 | return error_msg 186 | except: 187 | pass 188 | 189 | error_data = response.json() 190 | print("Error data:", error_data) # 调试输出 191 | print("Error type:", type(error_data.get("error"))) # 调试输出 192 | if error_data.get("error") and type(error_data.get("error")) is not dict: 193 | error_msg = error_data.get("error") 194 | 195 | return error_msg 196 | 197 | @staticmethod 198 | def create_error_image(text, width=512, height=512, font_size=40): 199 | """ 200 | 创建一个红色背景的错误图片,并在上面绘制指定的文字。 201 | 202 | :param text: 要显示的错误文字 203 | :param width: 图片宽度,默认为 512 204 | :param height: 图片高度,默认为 512 205 | :param font_size: 字体大小,默认为 20 206 | :return: 包含错误文字的图片对应的 tensor 207 | """ 208 | error_img = Image.new("RGB", (width, height), (255, 0, 0)) 209 | try: 210 | draw = ImageDraw.Draw(error_img) 211 | try: 212 | # 尝试加载常见支持中文的字体 213 | # Windows 系统 214 | font = ImageFont.truetype("simhei.ttf", font_size) # 黑体 215 | except: 216 | try: 217 | # macOS 系统 218 | font = ImageFont.truetype("PingFang.ttc", font_size) # 苹方 219 | except: 220 | try: 221 | # Linux 系统 222 | font = ImageFont.truetype("WenQuanYi Zen Hei.ttf", font_size) # 文泉驿正黑 223 | except: 224 | # 若都失败,使用默认字体 225 | font = ImageFont.load_default() 226 | 227 | # 根据图片宽度和字体大小计算每行最大字符数 228 | max_chars_per_line = width // (font_size // 2) # 根据字体大小动态计算 229 | max_chars_per_line = max(20, min(max_chars_per_line, 50)) # 限制在20-50字符之间 230 | 231 | # 将错误信息分行,避免单行过长 232 | lines = [] 233 | words = text.split() 234 | current_line = "" 235 | 236 | for word in words: 237 | if len(current_line + word) <= max_chars_per_line: 238 | current_line += word + " " 239 | else: 240 | lines.append(current_line.strip()) 241 | current_line = word + " " 242 | if current_line: 243 | lines.append(current_line.strip()) 244 | 245 | # 在图像上逐行绘制错误信息 246 | y_text = 10 247 | line_height = font_size + 4 248 | max_lines = (height - 20) // line_height # 计算图片能容纳的最大行数 249 | 250 | for line in lines[:max_lines]: # 只显示能容纳的行数 251 | draw.text((10, y_text), line, font=font, fill=(255, 255, 255)) 252 | y_text += line_height 253 | 254 | except Exception as font_error: 255 | print(f"在错误图片上绘制文字时出错: {font_error}") 256 | 257 | return ImageConverter.pil2tensor(error_img) 258 | 259 | 260 | @staticmethod 261 | def merge_image(image, mask): 262 | imageres = ImageConverter.tensor_to_base64(image) 263 | if mask is None: 264 | return imageres 265 | 266 | # 转 PIL 267 | image = ImageConverter.tensor2pil(image).convert("RGB") # 保留原图 268 | mask = ImageConverter.tensor2pil(mask).convert("L") 269 | 270 | # 确保图像和mask尺寸一致 271 | if image.size != mask.size: 272 | # 调整mask尺寸以匹配图像 273 | mask = mask.resize(image.size, Image.BILINEAR) 274 | 275 | # alpha 通道 = 255 - mask(保持透明显示) 276 | alpha = Image.eval(mask, lambda px: 255 - px) 277 | 278 | # 合成 RGBA(但不清理 RGB 内容!) 279 | rgba_image = image.copy() 280 | rgba_image.putalpha(alpha) 281 | 282 | # ---关键:额外保存一份原始 RGB 和 mask 到 PNG metadata--- 283 | meta = PngImagePlugin.PngInfo() 284 | 285 | # 原始 RGB 286 | buf_rgb = BytesIO() 287 | image.save(buf_rgb, format="PNG") 288 | meta.add_text("raw_rgb_base64", base64.b64encode(buf_rgb.getvalue()).decode("utf-8")) 289 | 290 | # 原始 Mask 291 | buf_mask = BytesIO() 292 | mask.save(buf_mask, format="PNG") 293 | meta.add_text("raw_mask_base64", base64.b64encode(buf_mask.getvalue()).decode("utf-8")) 294 | 295 | # 保存 PNG 296 | buffered = BytesIO() 297 | rgba_image.save(buffered, format="PNG", pnginfo=meta) 298 | 299 | return base64.b64encode(buffered.getvalue()).decode("utf-8") 300 | 301 | 302 | @staticmethod 303 | def download_video(video_url: str, save_path: str = "temp_video.mp4") -> str: 304 | """ 305 | 下载视频文件到本地 306 | :param video_url: 视频URL 307 | :param save_path: 本地保存路径 308 | :return: 本地视频文件路径 309 | """ 310 | try: 311 | response = requests.get(video_url, stream=True) 312 | if response.status_code == 200: 313 | with open(save_path, 'wb') as f: 314 | for chunk in response.iter_content(chunk_size=1024): 315 | f.write(chunk) 316 | logging.info(f"视频下载完成: {save_path}") 317 | return save_path 318 | else: 319 | raise ValueError(f"下载视频失败: {response.status_code}") 320 | except Exception as e: 321 | logging.error(f"视频下载出错: {str(e)}") 322 | raise 323 | 324 | @staticmethod 325 | def convert_images_to_base64(image_list): 326 | # 转换图像为Base64编码的字符串数组 327 | base64_images = [] 328 | for img in image_list: 329 | img_base64 = ImageConverter.tensor_to_base64(img) 330 | base64_images.append(img_base64) 331 | return base64_images 332 | 333 | @staticmethod 334 | def get_right_part_of_image(img): 335 | """ 336 | 从输入图片中找到分割线并仅保留右边部分 337 | 338 | :param img: PIL 图像对象 339 | :return: 仅包含右边部分的 PIL 图像对象 340 | """ 341 | # 简单的边缘检测找分割线,计算每列的像素差异 342 | width, height = img.size 343 | diff_values = [] 344 | for x in range(1, width): 345 | diff = 0 346 | for y in range(height): 347 | left_pixel = img.getpixel((x - 1, y)) 348 | right_pixel = img.getpixel((x, y)) 349 | diff += sum(abs(a - b) for a, b in zip(left_pixel, right_pixel)) 350 | diff_values.append(diff) 351 | 352 | # 找到差异最大的位置作为分割线 353 | split_x = diff_values.index(max(diff_values)) + 1 354 | 355 | # 只保留右边部分图片 356 | return img.crop((split_x, 0, width, height)) 357 | 358 | 359 | @staticmethod 360 | def crop_white_borders(img, tolerance=30): 361 | """ 362 | 判断并裁剪图片上下的白色部分 363 | 364 | :param img: PIL 图像对象 365 | :param tolerance: 颜色容差,值越大允许的色差范围越广,默认为 30 366 | :return: 裁剪后的 PIL 图像对象 367 | """ 368 | width, height = img.size 369 | top = 0 370 | bottom = height 371 | 372 | def is_white(pixel, tolerance): 373 | """ 374 | 判断像素是否接近白色,考虑颜色容差 375 | 376 | :param pixel: 像素值 377 | :param tolerance: 颜色容差 378 | :return: 如果接近白色返回 True,否则返回 False 379 | """ 380 | if len(pixel) == 4: # 处理带透明度的图像 381 | r, g, b, a = pixel 382 | else: 383 | r, g, b = pixel 384 | return all(255 - x <= tolerance for x in (r, g, b)) 385 | 386 | # 查找顶部白色区域结束位置 387 | for y in range(height): 388 | # 检查每行的第一个和最后一个像素 389 | if not is_white(img.getpixel((0, y)), tolerance) or not is_white(img.getpixel((width - 1, y)), tolerance): 390 | top = y 391 | break 392 | 393 | # 查找底部白色区域开始位置 394 | for y in range(height - 1, -1, -1): 395 | # 检查每行的第一个和最后一个像素 396 | if not is_white(img.getpixel((0, y)), tolerance) or not is_white(img.getpixel((width - 1, y)), tolerance): 397 | bottom = y + 1 398 | break 399 | 400 | # 执行裁剪 401 | return img.crop((0, top, width, bottom)) 402 | 403 | 404 | 405 | 406 | @staticmethod 407 | def get_lang(lang): 408 | combined_lang_dict = { 409 | "阿拉伯语": "ar", 410 | "法语": "fr", 411 | "英语": "en", 412 | "自动": "auto", 413 | "加泰罗尼亚语": "ca", 414 | "葡萄牙语": "pt", 415 | "西班牙语": "es", 416 | "荷兰语": "nl", 417 | "德语": "de", 418 | "斯洛文尼亚语": "sl", 419 | "阿塞拜疆语": "az", 420 | "孟加拉语": "bn", 421 | "俄语": "ru", 422 | "挪威语": "no", 423 | "马来语": "ms", 424 | "中文": "zh", 425 | "中文 (繁体)": "zh_hant", 426 | "捷克语": "cs", 427 | "斯洛伐克语": "sk", 428 | "波兰语": "pl", 429 | "匈牙利语": "hu", 430 | "越南语": "vi", 431 | "丹麦语": "da", 432 | "芬兰语": "fi", 433 | "瑞典语": "sv", 434 | "印尼语": "id", 435 | "希伯来语": "he", 436 | "意大利语": "it", 437 | "日语": "ja", 438 | "韩语": "ko", 439 | "泰米尔语": "ta", 440 | "泰语": "th", 441 | "土耳其语": "tr" 442 | } 443 | return combined_lang_dict.get(lang, "auto") 444 | -------------------------------------------------------------------------------- /nodes/config.py: -------------------------------------------------------------------------------- 1 | import configparser 2 | import os 3 | 4 | class ConfigManager: 5 | def __init__(self): 6 | self.config = configparser.ConfigParser() 7 | current_dir = os.path.dirname(os.path.abspath(__file__)) 8 | config_path = os.path.join(os.path.dirname(current_dir), 'config.ini') 9 | self.config.read(config_path) 10 | 11 | def get_api_config(self): 12 | oneapi_url = self.config.get('API', 'BASE_URL') 13 | oneapi_token = self.config.get('API', 'KEY') 14 | return oneapi_url, oneapi_token 15 | 16 | def set_api_key(self, key): 17 | """设置新的API KEY并保存到配置文件""" 18 | if not self.config.has_section('API'): 19 | self.config.add_section('API') 20 | self.config.set('API', 'KEY', key) 21 | 22 | current_dir = os.path.dirname(os.path.abspath(__file__)) 23 | config_path = os.path.join(os.path.dirname(current_dir), 'config.ini') 24 | with open(config_path, 'w') as configfile: 25 | self.config.write(configfile) -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "Mojie-API-Party" 3 | description = "A node that aggregates many powerful API features,Easier integration into workflows" 4 | version = "1.9.6" 5 | license = {file = "LICENSE"} 6 | dependencies = [] 7 | classifiers = ["Operating System :: OS Independent"] 8 | 9 | [project.urls] 10 | Repository = "https://github.com/MoJIeAIGC/comfyui-MJAPI-party" 11 | "Request url" = "https://www.mojieaigc.com" 12 | # Used by Comfy Registry https://registry.comfy.org 13 | 14 | [tool.comfy] 15 | PublisherId = "mojieaigc" 16 | DisplayName = "Mojie-API-Party" 17 | Icon = "https://mojieaigc.com/stat/logo.png" 18 | includes = [] 19 | 20 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | torch 3 | requests>=2.32.3 4 | pillow>=10.4.0 5 | aiohttp>=3.11.13 6 | toml 7 | -------------------------------------------------------------------------------- /web/mojie.js: -------------------------------------------------------------------------------- 1 | import { app } from "../../scripts/app.js"; 2 | import { api } from "../../scripts/api.js"; 3 | 4 | app.registerExtension({ 5 | name: "ComfyUI.Mjapi", 6 | async setup() { 7 | 8 | app.ui.settings.addSetting({ 9 | id: "Mjapi.version", 10 | name: "当前版本", 11 | type: () => { 12 | const container = document.createElement("div"); 13 | 14 | const versionText = document.createElement("span"); 15 | versionText.className = "comfy-text"; 16 | versionText.style.fontWeight = "bold"; 17 | 18 | // 获取版本信息 19 | api.fetchApi("/my_node/get_key").then(async (resp) => { 20 | const data = await resp.json(); 21 | console.log(data); 22 | versionText.textContent = `v${data.version}`; // 显示版本号 23 | }); 24 | 25 | container.appendChild(versionText); 26 | 27 | return container; // ✅ 注意这里,不要 return 28 | }, 29 | }); 30 | 31 | app.ui.settings.addSetting({ 32 | id: "Mjapi.api_key", 33 | name: "Mojie API Key (重启生效)", 34 | type: () => { 35 | const container = document.createElement("div"); 36 | 37 | const input = document.createElement("input"); 38 | input.type = "text"; 39 | input.className = "comfy-input"; 40 | input.style.width = "360px"; 41 | 42 | // 默认值 43 | api.fetchApi("/my_node/get_key").then(async (resp) => { 44 | const data = await resp.json(); 45 | console.log(data); 46 | input.value = data.msg || ""; 47 | }); 48 | 49 | const button = document.createElement("button"); 50 | button.className = "comfy-btn"; 51 | button.innerText = "更新"; 52 | button.onclick = async () => { 53 | const resp = await api.fetchApi("/my_node/set_key", { 54 | method: "POST", 55 | body: JSON.stringify({ api_key: input.value }) 56 | }); 57 | const data = await resp.json(); 58 | alert("保存结果: " + data.msg); 59 | }; 60 | 61 | container.appendChild(input); 62 | container.appendChild(button); 63 | 64 | return container; // ✅ 注意这里,不要 return 65 | }, 66 | // category: ["API KEY"] 67 | }); 68 | 69 | 70 | // 更新按钮(git pull) 71 | app.ui.settings.addSetting({ 72 | id: "Mjapi.node_update", 73 | name: "更新节点 (重启生效)", 74 | type: () => { 75 | const row = document.createElement("tr"); 76 | const cell = document.createElement("td"); 77 | const button = document.createElement("button"); 78 | button.className = "comfy-btn"; 79 | button.innerText = "立即更新"; 80 | button.onclick = async () => { 81 | const resp = await api.fetchApi("/my_node/update", { method: "POST" }); 82 | const data = await resp.json(); 83 | alert("更新结果: " + data.msg); 84 | }; 85 | cell.appendChild(button); 86 | row.appendChild(cell); 87 | return row; 88 | }, 89 | // category: ["Custom Nodes"] 90 | }); 91 | 92 | // 账户充值入口 93 | app.ui.settings.addSetting({ 94 | id: "Mjapi.recharge", 95 | name: "账户充值请前往:", 96 | type: () => { 97 | const container = document.createElement("div"); 98 | 99 | const link = document.createElement("a"); 100 | link.href = "https://mojieaigc.com"; 101 | link.innerText = "https://mojieaigc.com"; 102 | link.target = "_blank"; // ✅ 新窗口打开 103 | link.className = "comfy-text"; 104 | link.style.color = "#00aaff"; 105 | link.style.fontWeight = "bold"; 106 | link.style.textDecoration = "underline"; 107 | link.style.cursor = "pointer"; 108 | 109 | container.appendChild(link); 110 | return container; 111 | }, 112 | }); 113 | 114 | // 用户信息 115 | app.ui.settings.addSetting({ 116 | id: "Mjapi.userinfo", 117 | name: "账户信息", 118 | type: () => { 119 | const container = document.createElement("div"); 120 | container.style.display = "flex"; 121 | container.style.flexDirection = "column"; 122 | container.style.gap = "6px"; // 每行间距 123 | container.style.fontSize = "14px"; 124 | container.style.padding = "4px 0"; 125 | 126 | // 第1行:用户名 127 | const userRow = document.createElement("div"); 128 | userRow.style.display = "flex"; 129 | userRow.style.justifyContent = "space-between"; 130 | userRow.style.alignItems = "center"; 131 | 132 | const userLabel = document.createElement("span"); 133 | userLabel.textContent = "当前账户:"; 134 | userLabel.style.color = "#888"; 135 | 136 | const userValue = document.createElement("span"); 137 | userValue.className = "comfy-text"; 138 | userValue.style.fontWeight = "bold"; 139 | userValue.style.color = "#00aaff"; 140 | 141 | userRow.appendChild(userLabel); 142 | userRow.appendChild(userValue); 143 | 144 | // 第2行:余额 145 | const quotaRow = document.createElement("div"); 146 | quotaRow.style.display = "flex"; 147 | quotaRow.style.justifyContent = "space-between"; 148 | quotaRow.style.alignItems = "center"; 149 | 150 | const quotaLabel = document.createElement("span"); 151 | quotaLabel.textContent = "当前余额:"; 152 | quotaLabel.style.color = "#888"; 153 | 154 | const quotaValue = document.createElement("span"); 155 | quotaValue.className = "comfy-text"; 156 | quotaValue.style.fontWeight = "bold"; 157 | quotaValue.style.color = "#00cc66"; 158 | 159 | quotaRow.appendChild(quotaLabel); 160 | quotaRow.appendChild(quotaValue); 161 | 162 | // 加入容器 163 | container.appendChild(userRow); 164 | container.appendChild(quotaRow); 165 | 166 | // 获取用户信息 167 | api.fetchApi("/my_node/get_user").then(async (resp) => { 168 | const data = await resp.json(); 169 | console.log(data); 170 | userValue.textContent = data.username || "未知"; 171 | quotaValue.textContent = data.quota !== undefined ? data.quota : "—"; 172 | }).catch((err) => { 173 | userValue.textContent = "加载失败"; 174 | quotaValue.textContent = "—"; 175 | }); 176 | 177 | return container; 178 | }, 179 | }); 180 | 181 | 182 | } 183 | }); 184 | -------------------------------------------------------------------------------- /workflow/Dreamina(参考生图).json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "dbf43daf-a6f8-467a-a5fd-d8c19c2a3b8b", 3 | "revision": 0, 4 | "last_node_id": 10, 5 | "last_link_id": 7, 6 | "nodes": [ 7 | { 8 | "id": 8, 9 | "type": "LoadImage", 10 | "pos": [ 11 | 579.6439208984375, 12 | -166.67135620117188 13 | ], 14 | "size": [ 15 | 270, 16 | 314.0000305175781 17 | ], 18 | "flags": {}, 19 | "order": 0, 20 | "mode": 0, 21 | "inputs": [], 22 | "outputs": [ 23 | { 24 | "name": "IMAGE", 25 | "type": "IMAGE", 26 | "links": [ 27 | 6 28 | ] 29 | }, 30 | { 31 | "name": "MASK", 32 | "type": "MASK", 33 | "links": null 34 | } 35 | ], 36 | "properties": { 37 | "cnr_id": "comfy-core", 38 | "ver": "0.3.50", 39 | "Node name for S&R": "LoadImage" 40 | }, 41 | "widgets_values": [ 42 | "pasted/image.png", 43 | "image" 44 | ] 45 | }, 46 | { 47 | "id": 1, 48 | "type": "DreaminaI2INode", 49 | "pos": [ 50 | 939.6441040039062, 51 | -376.6712646484375 52 | ], 53 | "size": [ 54 | 400, 55 | 304 56 | ], 57 | "flags": {}, 58 | "order": 3, 59 | "mode": 0, 60 | "inputs": [ 61 | { 62 | "name": "image", 63 | "type": "IMAGE", 64 | "link": 6 65 | }, 66 | { 67 | "name": "prompt", 68 | "type": "STRING", 69 | "widget": { 70 | "name": "prompt" 71 | }, 72 | "link": 4 73 | } 74 | ], 75 | "outputs": [ 76 | { 77 | "name": "output", 78 | "type": "IMAGE", 79 | "links": [ 80 | 7 81 | ] 82 | } 83 | ], 84 | "properties": { 85 | "cnr_id": "Mojie-API-Party", 86 | "ver": "5c2fff706e89118c32c8847569e46fe0fac3a173", 87 | "Node name for S&R": "DreaminaI2INode" 88 | }, 89 | "widgets_values": [ 90 | "", 91 | 1024, 92 | 1280, 93 | 0.4, 94 | 0.3, 95 | 0, 96 | "reference", 97 | 1271, 98 | "randomize", 99 | 1 100 | ] 101 | }, 102 | { 103 | "id": 10, 104 | "type": "MarkdownNote", 105 | "pos": [ 106 | -3.6082472801208496, 107 | -441.4598083496094 108 | ], 109 | "size": [ 110 | 422.8641662597656, 111 | 645.0458984375 112 | ], 113 | "flags": {}, 114 | "order": 1, 115 | "mode": 0, 116 | "inputs": [], 117 | "outputs": [], 118 | "properties": {}, 119 | "widgets_values": [ 120 | "#### Dreamina(即梦)\n- 即梦文生图支持中文输入,中文输出。对一些偏僻或中文概念理解很好。\n- 即梦图生图有多种参考模式gen_mode选下下\n - 第一种 creative 是创意模式,可以理解为全图参考\n - 第二种 reference 人脸参考\n - 第三种 reference_char 人物参考\n- cfg默认2.5请勿修改\n\n" 121 | ], 122 | "color": "#432", 123 | "bgcolor": "#653" 124 | }, 125 | { 126 | "id": 6, 127 | "type": "PrimitiveStringMultiline", 128 | "pos": [ 129 | 477.23297119140625, 130 | -365.1534423828125 131 | ], 132 | "size": [ 133 | 417.6236267089844, 134 | 155.42262268066406 135 | ], 136 | "flags": {}, 137 | "order": 2, 138 | "mode": 0, 139 | "inputs": [], 140 | "outputs": [ 141 | { 142 | "name": "STRING", 143 | "type": "STRING", 144 | "links": [ 145 | 4 146 | ] 147 | } 148 | ], 149 | "properties": { 150 | "cnr_id": "comfy-core", 151 | "ver": "0.3.50", 152 | "Node name for S&R": "PrimitiveStringMultiline" 153 | }, 154 | "widgets_values": [ 155 | "生成一张女孩的全身摄影照片,赛博朋克风格,背景是赛博城市,无数霓虹灯光,她穿着短裙,站在城市的楼顶,俯瞰整个城市。图片上用书法写着几个大字:\"赛博city\"" 156 | ] 157 | }, 158 | { 159 | "id": 9, 160 | "type": "PreviewImage", 161 | "pos": [ 162 | 1378.3546142578125, 163 | -396.77655029296875 164 | ], 165 | "size": [ 166 | 419.276611328125, 167 | 581.517578125 168 | ], 169 | "flags": {}, 170 | "order": 4, 171 | "mode": 0, 172 | "inputs": [ 173 | { 174 | "name": "images", 175 | "type": "IMAGE", 176 | "link": 7 177 | } 178 | ], 179 | "outputs": [], 180 | "properties": { 181 | "cnr_id": "comfy-core", 182 | "ver": "0.3.50", 183 | "Node name for S&R": "PreviewImage" 184 | }, 185 | "widgets_values": [] 186 | } 187 | ], 188 | "links": [ 189 | [ 190 | 4, 191 | 6, 192 | 0, 193 | 1, 194 | 1, 195 | "STRING" 196 | ], 197 | [ 198 | 6, 199 | 8, 200 | 0, 201 | 1, 202 | 0, 203 | "IMAGE" 204 | ], 205 | [ 206 | 7, 207 | 1, 208 | 0, 209 | 9, 210 | 0, 211 | "IMAGE" 212 | ] 213 | ], 214 | "groups": [ 215 | { 216 | "id": 2, 217 | "title": "即梦参考生图", 218 | "bounding": [ 219 | 467.23297119140625, 220 | -470.3765869140625, 221 | 1340.398193359375, 222 | 665.1176147460938 223 | ], 224 | "color": "#b06634", 225 | "font_size": 24, 226 | "flags": {} 227 | } 228 | ], 229 | "config": {}, 230 | "extra": { 231 | "ds": { 232 | "scale": 0.7247295000000082, 233 | "offset": [ 234 | 79.7713557800686, 235 | 658.6247125795362 236 | ] 237 | }, 238 | "frontendVersion": "1.23.4" 239 | }, 240 | "version": 0.4 241 | } -------------------------------------------------------------------------------- /workflow/Kontext.json: -------------------------------------------------------------------------------- 1 | {"id":"90e73179-a28b-49be-b656-c5c30f9556f3","revision":0,"last_node_id":36,"last_link_id":25,"nodes":[{"id":18,"type":"LoadImage","pos":[46.56498718261719,725.2905883789062],"size":[270,314.00006103515625],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[16]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["ComfyUI_temp_kopcc_00003_.png","image"]},{"id":21,"type":"LoadImage","pos":[1540.9090576171875,-203.93939208984375],"size":[270,314],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[18]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["volcengine_20250703190926.png","image"]},{"id":17,"type":"ImageStitch","pos":[365.5914611816406,334.824462890625],"size":[270,150],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"image1","name":"image1","type":"IMAGE","link":15},{"localized_name":"image2","name":"image2","shape":7,"type":"IMAGE","link":16},{"localized_name":"direction","name":"direction","type":"COMBO","widget":{"name":"direction"},"link":null},{"localized_name":"match_image_size","name":"match_image_size","type":"BOOLEAN","widget":{"name":"match_image_size"},"link":null},{"localized_name":"spacing_width","name":"spacing_width","type":"INT","widget":{"name":"spacing_width"},"link":null},{"localized_name":"spacing_color","name":"spacing_color","type":"COMBO","widget":{"name":"spacing_color"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[14,17]}],"properties":{"Node name for S&R":"ImageStitch"},"widgets_values":["right",true,0,"white"]},{"id":19,"type":"PreviewImage","pos":[376.99505615234375,542.160888671875],"size":[263.36529541015625,246],"flags":{},"order":15,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":17}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":33,"type":"LoadImage","pos":[1522.190673828125,725.9595947265625],"size":[270,314.00006103515625],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[24]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["ComfyUI_temp_kopcc_00003_.png","image"]},{"id":32,"type":"LoadImage","pos":[1522.190673828125,335.9595947265625],"size":[270,314.0000305175781],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[23]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["1024 (2).png","image"]},{"id":34,"type":"PreviewImage","pos":[1852.190673828125,545.9595947265625],"size":[263.36529541015625,246],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":22}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":14,"type":"LoadImage","pos":[40.912532806396484,335.68121337890625],"size":[270,314.0000305175781],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[15]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["1024 (2).png","image"]},{"id":35,"type":"ImageStitch","pos":[1842.190673828125,335.9595947265625],"size":[270,150],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"image1","name":"image1","type":"IMAGE","link":23},{"localized_name":"image2","name":"image2","shape":7,"type":"IMAGE","link":24},{"localized_name":"direction","name":"direction","type":"COMBO","widget":{"name":"direction"},"link":null},{"localized_name":"match_image_size","name":"match_image_size","type":"BOOLEAN","widget":{"name":"match_image_size"},"link":null},{"localized_name":"spacing_width","name":"spacing_width","type":"INT","widget":{"name":"spacing_width"},"link":null},{"localized_name":"spacing_color","name":"spacing_color","type":"COMBO","widget":{"name":"spacing_color"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[22,25]}],"properties":{"Node name for S&R":"ImageStitch"},"widgets_values":["right",true,0,"white"]},{"id":12,"type":"LoadImage","pos":[45.11850357055664,-214.39471435546875],"size":[270,314],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[10]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["volcengine_20250703190926.png","image"]},{"id":20,"type":"FluxMaxNode","pos":[1840.9090576171875,-213.93939208984375],"size":[400,208],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"image_input","name":"image_input","shape":7,"type":"IMAGE","link":18},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"is_translation","name":"is_translation","type":"BOOLEAN","widget":{"name":"is_translation"},"link":null},{"localized_name":"aspect_ratio","name":"aspect_ratio","type":"COMBO","widget":{"name":"aspect_ratio"},"link":null},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null}],"outputs":[{"localized_name":"output","name":"output","type":"IMAGE","links":[19]}],"properties":{"Node name for S&R":"FluxMaxNode"},"widgets_values":["remove this text",1291,"randomize",false,"3:4",1]},{"id":29,"type":"FluxMaxNode","pos":[2142.1904296875,335.9595947265625],"size":[400,208],"flags":{},"order":13,"mode":0,"inputs":[{"localized_name":"image_input","name":"image_input","shape":7,"type":"IMAGE","link":25},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"is_translation","name":"is_translation","type":"BOOLEAN","widget":{"name":"is_translation"},"link":null},{"localized_name":"aspect_ratio","name":"aspect_ratio","type":"COMBO","widget":{"name":"aspect_ratio"},"link":null},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null}],"outputs":[{"localized_name":"output","name":"output","type":"IMAGE","links":[20]}],"properties":{"Node name for S&R":"FluxMaxNode"},"widgets_values":["The woman in this image is holding this bag.",77,"randomize",false,"3:4",1]},{"id":15,"type":"FluxProNode","pos":[668.005859375,326.9068603515625],"size":[400,208],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"image_input","name":"image_input","shape":7,"type":"IMAGE","link":14},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"is_translation","name":"is_translation","type":"BOOLEAN","widget":{"name":"is_translation"},"link":null},{"localized_name":"aspect_ratio","name":"aspect_ratio","type":"COMBO","widget":{"name":"aspect_ratio"},"link":null},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null}],"outputs":[{"localized_name":"output","name":"output","type":"IMAGE","links":[13]}],"properties":{"Node name for S&R":"FluxProNode"},"widgets_values":["this woman is holding this handbag.",1892,"randomize",false,"3:4",1]},{"id":13,"type":"PreviewImage","pos":[765.1184692382812,-224.39471435546875],"size":[361.59991455078125,411.5231628417969],"flags":{},"order":16,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":11}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":22,"type":"PreviewImage","pos":[2270.9091796875,-213.93939208984375],"size":[398.0273132324219,397.8628845214844],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":19}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":28,"type":"PreviewImage","pos":[2572.1904296875,345.9595947265625],"size":[398.0273132324219,397.8628845214844],"flags":{},"order":17,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":20}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":16,"type":"PreviewImage","pos":[1086.99560546875,334.62615966796875],"size":[379.8135986328125,517.7697143554688],"flags":{},"order":18,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":13}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":10,"type":"FluxProNode","pos":[335.1183776855469,-214.39471435546875],"size":[400,208],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"image_input","name":"image_input","shape":7,"type":"IMAGE","link":10},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"is_translation","name":"is_translation","type":"BOOLEAN","widget":{"name":"is_translation"},"link":null},{"localized_name":"aspect_ratio","name":"aspect_ratio","type":"COMBO","widget":{"name":"aspect_ratio"},"link":null},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null}],"outputs":[{"localized_name":"output","name":"output","type":"IMAGE","links":[11]}],"properties":{"Node name for S&R":"FluxProNode"},"widgets_values":["去除文字",1680,"randomize",true,"3:4",1]},{"id":36,"type":"MarkdownNote","pos":[-452.6477355957031,-259.70172119140625],"size":[440.6380920410156,717.257080078125],"flags":{},"order":6,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["##### Kontext-pro&max 使用说明\n- 加入了翻译开关is_translation,在每个节点中都有,默认是关闭的。打开可以输入中文。\n- aspect_ratio是尺寸控制,默认是default,由kontext自己控制输出图片的尺寸。也可以开启根据自己的需要选择尺寸。\n- max效果更好,pro性价比更高。视频教程可以查看:https://www.bilibili.com/video/BV19931zAE4c/?vd_source=25d3add966daa64cbb811354319ec18d#reply268510289936\n- 使用前请确保你的账户中有足够的余额\n\n\n"],"color":"#432","bgcolor":"#653"}],"links":[[10,12,0,10,0,"IMAGE"],[11,10,0,13,0,"IMAGE"],[13,15,0,16,0,"IMAGE"],[14,17,0,15,0,"IMAGE"],[15,14,0,17,0,"IMAGE"],[16,18,0,17,1,"IMAGE"],[17,17,0,19,0,"IMAGE"],[18,21,0,20,0,"IMAGE"],[19,20,0,22,0,"IMAGE"],[20,29,0,28,0,"IMAGE"],[22,35,0,34,0,"IMAGE"],[23,32,0,35,0,"IMAGE"],[24,33,0,35,1,"IMAGE"],[25,35,0,29,0,"IMAGE"]],"groups":[{"id":1,"title":"Kontext-pro 单图","bounding":[35.118499755859375,-297.9947204589844,1439.656982421875,530.9985961914062],"color":"#3f789e","font_size":24,"flags":{}},{"id":2,"title":"Kontext-pro 双图","bounding":[30.91252899169922,253.30685424804688,1445.896728515625,795.9837646484375],"color":"#3f789e","font_size":24,"flags":{}},{"id":3,"title":"kontext-max-单图","bounding":[1497.8531494140625,-289.6174621582031,1478.37548828125,520.4207153320312],"color":"#b58b2a","font_size":24,"flags":{}},{"id":4,"title":"kontext-max-多图","bounding":[1500.0872802734375,252.73590087890625,1481.7147216796875,793.4318237304688],"color":"#b58b2a","font_size":24,"flags":{}}],"config":{},"extra":{"ds":{"scale":1.1671841070450135,"offset":[659.7022036530732,312.4543080471589]},"ue_links":[]},"version":0.4} -------------------------------------------------------------------------------- /workflow/NanoBanana.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "9595610a-a68a-4922-a51e-a8ce7e616335", 3 | "revision": 0, 4 | "last_node_id": 45, 5 | "last_link_id": 35, 6 | "nodes": [ 7 | { 8 | "id": 25, 9 | "type": "LoadImage", 10 | "pos": [ 11 | -984.1687622070312, 12 | -403.6693115234375 13 | ], 14 | "size": [ 15 | 371.6400146484375, 16 | 502.760009765625 17 | ], 18 | "flags": {}, 19 | "order": 0, 20 | "mode": 0, 21 | "inputs": [], 22 | "outputs": [ 23 | { 24 | "name": "IMAGE", 25 | "type": "IMAGE", 26 | "links": [ 27 | 32 28 | ] 29 | }, 30 | { 31 | "name": "MASK", 32 | "type": "MASK", 33 | "links": null 34 | } 35 | ], 36 | "properties": { 37 | "cnr_id": "comfy-core", 38 | "ver": "0.3.51", 39 | "Node name for S&R": "LoadImage" 40 | }, 41 | "widgets_values": [ 42 | "ComfyUI_temp_rssbm_00003_.png", 43 | "image" 44 | ] 45 | }, 46 | { 47 | "id": 26, 48 | "type": "SaveImage", 49 | "pos": [ 50 | -160.75445556640625, 51 | -413.05987548828125 52 | ], 53 | "size": [ 54 | 452.3577575683594, 55 | 619.1365356445312 56 | ], 57 | "flags": {}, 58 | "order": 10, 59 | "mode": 0, 60 | "inputs": [ 61 | { 62 | "name": "images", 63 | "type": "IMAGE", 64 | "link": 33 65 | } 66 | ], 67 | "outputs": [], 68 | "properties": { 69 | "cnr_id": "comfy-core", 70 | "ver": "0.3.51" 71 | }, 72 | "widgets_values": [ 73 | "ComfyUI" 74 | ] 75 | }, 76 | { 77 | "id": 31, 78 | "type": "LoadImage", 79 | "pos": [ 80 | -1041.4859619140625, 81 | 925.402099609375 82 | ], 83 | "size": [ 84 | 350.5255126953125, 85 | 450.8933410644531 86 | ], 87 | "flags": {}, 88 | "order": 1, 89 | "mode": 0, 90 | "inputs": [], 91 | "outputs": [ 92 | { 93 | "name": "IMAGE", 94 | "type": "IMAGE", 95 | "links": [ 96 | 20 97 | ] 98 | }, 99 | { 100 | "name": "MASK", 101 | "type": "MASK", 102 | "links": null 103 | } 104 | ], 105 | "properties": { 106 | "cnr_id": "comfy-core", 107 | "ver": "0.3.51", 108 | "Node name for S&R": "LoadImage" 109 | }, 110 | "widgets_values": [ 111 | "152838377312388750868885_x.jpg", 112 | "image" 113 | ] 114 | }, 115 | { 116 | "id": 28, 117 | "type": "LoadImage", 118 | "pos": [ 119 | -1044.3997802734375, 120 | 368.9452209472656 121 | ], 122 | "size": [ 123 | 371.6400146484375, 124 | 502.760009765625 125 | ], 126 | "flags": {}, 127 | "order": 2, 128 | "mode": 0, 129 | "inputs": [], 130 | "outputs": [ 131 | { 132 | "name": "IMAGE", 133 | "type": "IMAGE", 134 | "links": [ 135 | 19 136 | ] 137 | }, 138 | { 139 | "name": "MASK", 140 | "type": "MASK", 141 | "links": null 142 | } 143 | ], 144 | "properties": { 145 | "cnr_id": "comfy-core", 146 | "ver": "0.3.51", 147 | "Node name for S&R": "LoadImage" 148 | }, 149 | "widgets_values": [ 150 | "p (1).jpeg", 151 | "image" 152 | ] 153 | }, 154 | { 155 | "id": 32, 156 | "type": "PreviewImage", 157 | "pos": [ 158 | -641.9852905273438, 159 | 701.002197265625 160 | ], 161 | "size": [ 162 | 336.8999938964844, 163 | 258 164 | ], 165 | "flags": {}, 166 | "order": 11, 167 | "mode": 0, 168 | "inputs": [ 169 | { 170 | "name": "images", 171 | "type": "IMAGE", 172 | "link": 22 173 | } 174 | ], 175 | "outputs": [], 176 | "properties": { 177 | "cnr_id": "comfy-core", 178 | "ver": "0.3.51", 179 | "Node name for S&R": "PreviewImage" 180 | }, 181 | "widgets_values": [] 182 | }, 183 | { 184 | "id": 30, 185 | "type": "ImageStitch", 186 | "pos": [ 187 | -629.2853393554688, 188 | 450.20208740234375 189 | ], 190 | "size": [ 191 | 270, 192 | 150 193 | ], 194 | "flags": {}, 195 | "order": 8, 196 | "mode": 0, 197 | "inputs": [ 198 | { 199 | "name": "image1", 200 | "type": "IMAGE", 201 | "link": 19 202 | }, 203 | { 204 | "name": "image2", 205 | "shape": 7, 206 | "type": "IMAGE", 207 | "link": 20 208 | } 209 | ], 210 | "outputs": [ 211 | { 212 | "name": "IMAGE", 213 | "type": "IMAGE", 214 | "links": [ 215 | 22, 216 | 34 217 | ] 218 | } 219 | ], 220 | "properties": { 221 | "cnr_id": "comfy-core", 222 | "ver": "0.3.51", 223 | "Node name for S&R": "ImageStitch" 224 | }, 225 | "widgets_values": [ 226 | "right", 227 | true, 228 | 0, 229 | "white" 230 | ] 231 | }, 232 | { 233 | "id": 29, 234 | "type": "SaveImage", 235 | "pos": [ 236 | 132.9143829345703, 237 | 436.4742736816406 238 | ], 239 | "size": [ 240 | 571.8168334960938, 241 | 411.7736511230469 242 | ], 243 | "flags": {}, 244 | "order": 14, 245 | "mode": 0, 246 | "inputs": [ 247 | { 248 | "name": "images", 249 | "type": "IMAGE", 250 | "link": 35 251 | } 252 | ], 253 | "outputs": [], 254 | "properties": { 255 | "cnr_id": "comfy-core", 256 | "ver": "0.3.51" 257 | }, 258 | "widgets_values": [ 259 | "ComfyUI" 260 | ] 261 | }, 262 | { 263 | "id": 35, 264 | "type": "LoadImage", 265 | "pos": [ 266 | -1046.1812744140625, 267 | 1493.1412353515625 268 | ], 269 | "size": [ 270 | 371.6400146484375, 271 | 502.760009765625 272 | ], 273 | "flags": {}, 274 | "order": 3, 275 | "mode": 0, 276 | "inputs": [], 277 | "outputs": [ 278 | { 279 | "name": "IMAGE", 280 | "type": "IMAGE", 281 | "links": [ 282 | 24 283 | ] 284 | }, 285 | { 286 | "name": "MASK", 287 | "type": "MASK", 288 | "links": null 289 | } 290 | ], 291 | "properties": { 292 | "cnr_id": "comfy-core", 293 | "ver": "0.3.51", 294 | "Node name for S&R": "LoadImage" 295 | }, 296 | "widgets_values": [ 297 | "pasted/image.png", 298 | "image" 299 | ] 300 | }, 301 | { 302 | "id": 38, 303 | "type": "GeminiEditNode", 304 | "pos": [ 305 | -272.70831298828125, 306 | 1498.960205078125 307 | ], 308 | "size": [ 309 | 400, 310 | 200 311 | ], 312 | "flags": {}, 313 | "order": 15, 314 | "mode": 0, 315 | "inputs": [ 316 | { 317 | "name": "image_input", 318 | "shape": 7, 319 | "type": "IMAGE", 320 | "link": 30 321 | } 322 | ], 323 | "outputs": [ 324 | { 325 | "name": "output", 326 | "type": "IMAGE", 327 | "links": [ 328 | 27 329 | ] 330 | } 331 | ], 332 | "properties": { 333 | "cnr_id": "Mojie-API-Party", 334 | "ver": "9118360ad066d1f9e6ea7db6c2bac0507d22098b", 335 | "Node name for S&R": "GeminiEditNode" 336 | }, 337 | "widgets_values": [ 338 | "这个女孩带着这个耳机,穿着这件衣服", 339 | false, 340 | 1769, 341 | "randomize", 342 | "randomize" 343 | ] 344 | }, 345 | { 346 | "id": 41, 347 | "type": "LoadImage", 348 | "pos": [ 349 | -649.0196533203125, 350 | 2037.23291015625 351 | ], 352 | "size": [ 353 | 363.1700134277344, 354 | 455.08599853515625 355 | ], 356 | "flags": {}, 357 | "order": 4, 358 | "mode": 0, 359 | "inputs": [], 360 | "outputs": [ 361 | { 362 | "name": "IMAGE", 363 | "type": "IMAGE", 364 | "links": [ 365 | 29 366 | ] 367 | }, 368 | { 369 | "name": "MASK", 370 | "type": "MASK", 371 | "links": null 372 | } 373 | ], 374 | "properties": { 375 | "cnr_id": "comfy-core", 376 | "ver": "0.3.51", 377 | "Node name for S&R": "LoadImage" 378 | }, 379 | "widgets_values": [ 380 | "p (1).jpeg", 381 | "image" 382 | ] 383 | }, 384 | { 385 | "id": 34, 386 | "type": "LoadImage", 387 | "pos": [ 388 | -1030.9698486328125, 389 | 2055.444580078125 390 | ], 391 | "size": [ 392 | 350.5255126953125, 393 | 450.8933410644531 394 | ], 395 | "flags": {}, 396 | "order": 5, 397 | "mode": 0, 398 | "inputs": [], 399 | "outputs": [ 400 | { 401 | "name": "IMAGE", 402 | "type": "IMAGE", 403 | "links": [ 404 | 25 405 | ] 406 | }, 407 | { 408 | "name": "MASK", 409 | "type": "MASK", 410 | "links": null 411 | } 412 | ], 413 | "properties": { 414 | "cnr_id": "comfy-core", 415 | "ver": "0.3.51", 416 | "Node name for S&R": "LoadImage" 417 | }, 418 | "widgets_values": [ 419 | "152838377312388750868885_x.jpg", 420 | "image" 421 | ] 422 | }, 423 | { 424 | "id": 37, 425 | "type": "ImageStitch", 426 | "pos": [ 427 | -652.7366943359375, 428 | 1507.744873046875 429 | ], 430 | "size": [ 431 | 270, 432 | 150 433 | ], 434 | "flags": {}, 435 | "order": 9, 436 | "mode": 0, 437 | "inputs": [ 438 | { 439 | "name": "image1", 440 | "type": "IMAGE", 441 | "link": 24 442 | }, 443 | { 444 | "name": "image2", 445 | "shape": 7, 446 | "type": "IMAGE", 447 | "link": 25 448 | } 449 | ], 450 | "outputs": [ 451 | { 452 | "name": "IMAGE", 453 | "type": "IMAGE", 454 | "links": [ 455 | 28 456 | ] 457 | } 458 | ], 459 | "properties": { 460 | "cnr_id": "comfy-core", 461 | "ver": "0.3.51", 462 | "Node name for S&R": "ImageStitch" 463 | }, 464 | "widgets_values": [ 465 | "down", 466 | true, 467 | 0, 468 | "white" 469 | ] 470 | }, 471 | { 472 | "id": 40, 473 | "type": "ImageStitch", 474 | "pos": [ 475 | -611.266845703125, 476 | 1731.5614013671875 477 | ], 478 | "size": [ 479 | 270, 480 | 150 481 | ], 482 | "flags": {}, 483 | "order": 13, 484 | "mode": 0, 485 | "inputs": [ 486 | { 487 | "name": "image1", 488 | "type": "IMAGE", 489 | "link": 28 490 | }, 491 | { 492 | "name": "image2", 493 | "shape": 7, 494 | "type": "IMAGE", 495 | "link": 29 496 | } 497 | ], 498 | "outputs": [ 499 | { 500 | "name": "IMAGE", 501 | "type": "IMAGE", 502 | "links": [ 503 | 30, 504 | 31 505 | ] 506 | } 507 | ], 508 | "properties": { 509 | "cnr_id": "comfy-core", 510 | "ver": "0.3.51", 511 | "Node name for S&R": "ImageStitch" 512 | }, 513 | "widgets_values": [ 514 | "right", 515 | true, 516 | 0, 517 | "white" 518 | ] 519 | }, 520 | { 521 | "id": 39, 522 | "type": "SaveImage", 523 | "pos": [ 524 | 152.65048217773438, 525 | 1494.816650390625 526 | ], 527 | "size": [ 528 | 673.4568481445312, 529 | 625.9436645507812 530 | ], 531 | "flags": {}, 532 | "order": 17, 533 | "mode": 0, 534 | "inputs": [ 535 | { 536 | "name": "images", 537 | "type": "IMAGE", 538 | "link": 27 539 | } 540 | ], 541 | "outputs": [], 542 | "properties": { 543 | "cnr_id": "comfy-core", 544 | "ver": "0.3.51" 545 | }, 546 | "widgets_values": [ 547 | "ComfyUI" 548 | ] 549 | }, 550 | { 551 | "id": 42, 552 | "type": "PreviewImage", 553 | "pos": [ 554 | -271.36492919921875, 555 | 1772.440185546875 556 | ], 557 | "size": [ 558 | 385.9687805175781, 559 | 359.8147888183594 560 | ], 561 | "flags": {}, 562 | "order": 16, 563 | "mode": 0, 564 | "inputs": [ 565 | { 566 | "name": "images", 567 | "type": "IMAGE", 568 | "link": 31 569 | } 570 | ], 571 | "outputs": [], 572 | "properties": { 573 | "cnr_id": "comfy-core", 574 | "ver": "0.3.51", 575 | "Node name for S&R": "PreviewImage" 576 | }, 577 | "widgets_values": [] 578 | }, 579 | { 580 | "id": 43, 581 | "type": "MarkdownNote", 582 | "pos": [ 583 | -1561.463623046875, 584 | -468.43707275390625 585 | ], 586 | "size": [ 587 | 457.3439025878906, 588 | 860.368408203125 589 | ], 590 | "flags": {}, 591 | "order": 6, 592 | "mode": 0, 593 | "inputs": [], 594 | "outputs": [], 595 | "title": "使用说明", 596 | "properties": {}, 597 | "widgets_values": [ 598 | "### NanoBanana 使用说明\n\nNanoBanana又名Gemini 2.5 Flash Image Preview,是google旗下的图片编辑工具。提示词遵循强度很高。基本不需要特别的提示词格式,支持中英文输入,但是不支持中文输出,可输出英文字体。\nis_translation是翻译开关,如果中文输入效果不理想,可以把翻译开关打开,翻译过后再试。\n\n\n- 单图编辑没什么好讲的。\n- 多图编辑据说最高可组合12种元素(还没亲测过)。需要使用image Stitch节点把元素组合起来形成单图。请勿直接发送多图。\n\n以下列了三种使用方式,单图,双图组合,三图组合。更多图组合请自行搭建。\n所有工作流放一起会同时运行,因此你需要将3种工作流自行拆开复制到其他空白工作流上。或者框选后使用ctrl+B,使其暂时忽略。\n\n工作流如果加载不成功请升级comfyui\n\n有问题加微信:mojieaigc" 599 | ], 600 | "color": "#432", 601 | "bgcolor": "#653" 602 | }, 603 | { 604 | "id": 44, 605 | "type": "GeminiEditNode", 606 | "pos": [ 607 | -592.409423828125, 608 | -403.9662170410156 609 | ], 610 | "size": [ 611 | 400, 612 | 200 613 | ], 614 | "flags": {}, 615 | "order": 7, 616 | "mode": 0, 617 | "inputs": [ 618 | { 619 | "name": "image_input", 620 | "shape": 7, 621 | "type": "IMAGE", 622 | "link": 32 623 | } 624 | ], 625 | "outputs": [ 626 | { 627 | "name": "output", 628 | "type": "IMAGE", 629 | "links": [ 630 | 33 631 | ] 632 | } 633 | ], 634 | "properties": { 635 | "cnr_id": "Mojie-API-Party", 636 | "ver": "c70bad3ddedc3e766eff04b7e666661e51a70c01", 637 | "Node name for S&R": "GeminiEditNode" 638 | }, 639 | "widgets_values": [ 640 | "制作一个图中角色的商业化1/7比例手办,风格写实,环境逼真。手办放置在电脑桌上,配有一个圆形透明亚克力底座,底座上没有文字。电脑屏幕上显示着手办的Zbrush建模过程。电脑屏幕旁边是一个万代风格的玩具盒,上面印有原始画作。", 641 | false, 642 | "3:4", 643 | 2048, 644 | "randomize" 645 | ] 646 | }, 647 | { 648 | "id": 45, 649 | "type": "GeminiEditNode", 650 | "pos": [ 651 | -314.78411865234375, 652 | 447.8040466308594 653 | ], 654 | "size": [ 655 | 400, 656 | 200 657 | ], 658 | "flags": {}, 659 | "order": 12, 660 | "mode": 0, 661 | "inputs": [ 662 | { 663 | "name": "image_input", 664 | "shape": 7, 665 | "type": "IMAGE", 666 | "link": 34 667 | } 668 | ], 669 | "outputs": [ 670 | { 671 | "name": "output", 672 | "type": "IMAGE", 673 | "links": [ 674 | 35 675 | ] 676 | } 677 | ], 678 | "properties": { 679 | "cnr_id": "Mojie-API-Party", 680 | "ver": "c70bad3ddedc3e766eff04b7e666661e51a70c01", 681 | "Node name for S&R": "GeminiEditNode" 682 | }, 683 | "widgets_values": [ 684 | "这个女孩带着这个耳机", 685 | false, 686 | "3:4", 687 | 2048, 688 | "randomize" 689 | ] 690 | } 691 | ], 692 | "links": [ 693 | [ 694 | 19, 695 | 28, 696 | 0, 697 | 30, 698 | 0, 699 | "IMAGE" 700 | ], 701 | [ 702 | 20, 703 | 31, 704 | 0, 705 | 30, 706 | 1, 707 | "IMAGE" 708 | ], 709 | [ 710 | 22, 711 | 30, 712 | 0, 713 | 32, 714 | 0, 715 | "IMAGE" 716 | ], 717 | [ 718 | 24, 719 | 35, 720 | 0, 721 | 37, 722 | 0, 723 | "IMAGE" 724 | ], 725 | [ 726 | 25, 727 | 34, 728 | 0, 729 | 37, 730 | 1, 731 | "IMAGE" 732 | ], 733 | [ 734 | 27, 735 | 38, 736 | 0, 737 | 39, 738 | 0, 739 | "IMAGE" 740 | ], 741 | [ 742 | 28, 743 | 37, 744 | 0, 745 | 40, 746 | 0, 747 | "IMAGE" 748 | ], 749 | [ 750 | 29, 751 | 41, 752 | 0, 753 | 40, 754 | 1, 755 | "IMAGE" 756 | ], 757 | [ 758 | 30, 759 | 40, 760 | 0, 761 | 38, 762 | 0, 763 | "IMAGE" 764 | ], 765 | [ 766 | 31, 767 | 40, 768 | 0, 769 | 42, 770 | 0, 771 | "IMAGE" 772 | ], 773 | [ 774 | 32, 775 | 25, 776 | 0, 777 | 44, 778 | 0, 779 | "IMAGE" 780 | ], 781 | [ 782 | 33, 783 | 44, 784 | 0, 785 | 26, 786 | 0, 787 | "IMAGE" 788 | ], 789 | [ 790 | 34, 791 | 30, 792 | 0, 793 | 45, 794 | 0, 795 | "IMAGE" 796 | ], 797 | [ 798 | 35, 799 | 45, 800 | 0, 801 | 29, 802 | 0, 803 | "IMAGE" 804 | ] 805 | ], 806 | "groups": [ 807 | { 808 | "id": 2, 809 | "title": "NanoBanana双图编辑", 810 | "bounding": [ 811 | -1054.3997802734375, 812 | 295.34521484375, 813 | 1769.130615234375, 814 | 1090.9501953125 815 | ], 816 | "color": "#a1309b", 817 | "font_size": 24, 818 | "flags": {} 819 | }, 820 | { 821 | "id": 1, 822 | "title": "NanoBanana单图编辑", 823 | "bounding": [ 824 | -1061.2711181640625, 825 | -502.7919921875, 826 | 1406.0999755859375, 827 | 767.5 828 | ], 829 | "color": "#3f789e", 830 | "font_size": 24, 831 | "flags": {} 832 | }, 833 | { 834 | "id": 3, 835 | "title": "NanoBanana多图编辑", 836 | "bounding": [ 837 | -1056.1812744140625, 838 | 1419.541259765625, 839 | 1900.758544921875, 840 | 1096.796630859375 841 | ], 842 | "color": "#3f789e", 843 | "font_size": 24, 844 | "flags": {} 845 | } 846 | ], 847 | "config": {}, 848 | "extra": { 849 | "ds": { 850 | "scale": 0.7513148009015777, 851 | "offset": [ 852 | 1802.1746020001362, 853 | 594.4376267157138 854 | ] 855 | }, 856 | "frontendVersion": "1.25.9", 857 | "groupNodes": {} 858 | }, 859 | "version": 0.4 860 | } -------------------------------------------------------------------------------- /workflow/Qwen-image.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "822d8cab-28fd-4020-a7ca-2129b92cc0fc", 3 | "revision": 0, 4 | "last_node_id": 22, 5 | "last_link_id": 14, 6 | "nodes": [ 7 | { 8 | "id": 22, 9 | "type": "PreviewImage", 10 | "pos": [ 11 | 953.3901977539062, 12 | 588.851318359375 13 | ], 14 | "size": [ 15 | 564.9520263671875, 16 | 493.5439453125 17 | ], 18 | "flags": {}, 19 | "order": 5, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "images", 24 | "type": "IMAGE", 25 | "link": 14 26 | } 27 | ], 28 | "outputs": [], 29 | "properties": { 30 | "cnr_id": "comfy-core", 31 | "ver": "0.3.50", 32 | "Node name for S&R": "PreviewImage" 33 | }, 34 | "widgets_values": [] 35 | }, 36 | { 37 | "id": 21, 38 | "type": "LoadImage", 39 | "pos": [ 40 | 178.706298828125, 41 | 574.1728515625 42 | ], 43 | "size": [ 44 | 310.1808166503906, 45 | 443.0143737792969 46 | ], 47 | "flags": {}, 48 | "order": 0, 49 | "mode": 0, 50 | "inputs": [], 51 | "outputs": [ 52 | { 53 | "name": "IMAGE", 54 | "type": "IMAGE", 55 | "links": [ 56 | 13 57 | ] 58 | }, 59 | { 60 | "name": "MASK", 61 | "type": "MASK", 62 | "links": null 63 | } 64 | ], 65 | "properties": { 66 | "cnr_id": "comfy-core", 67 | "ver": "0.3.50", 68 | "Node name for S&R": "LoadImage" 69 | }, 70 | "widgets_values": [ 71 | "148b7e274c5a45dc8f607306173346da.jpeg", 72 | "image" 73 | ] 74 | }, 75 | { 76 | "id": 20, 77 | "type": "QwenImageEditNode", 78 | "pos": [ 79 | 509.2024841308594, 80 | 584.165283203125 81 | ], 82 | "size": [ 83 | 400, 84 | 200 85 | ], 86 | "flags": {}, 87 | "order": 3, 88 | "mode": 0, 89 | "inputs": [ 90 | { 91 | "name": "image", 92 | "type": "IMAGE", 93 | "link": 13 94 | } 95 | ], 96 | "outputs": [ 97 | { 98 | "name": "output", 99 | "type": "IMAGE", 100 | "links": [ 101 | 14 102 | ] 103 | } 104 | ], 105 | "properties": { 106 | "cnr_id": "Mojie-API-Party", 107 | "ver": "5c2fff706e89118c32c8847569e46fe0fac3a173", 108 | "Node name for S&R": "QwenImageEditNode" 109 | }, 110 | "widgets_values": [ 111 | "将人物的衣服改成白色裙子", 112 | 1, 113 | 58, 114 | "randomize" 115 | ] 116 | }, 117 | { 118 | "id": 19, 119 | "type": "MarkdownNote", 120 | "pos": [ 121 | -249.8396759033203, 122 | -129.8044891357422 123 | ], 124 | "size": [ 125 | 343.3768310546875, 126 | 511.4752197265625 127 | ], 128 | "flags": {}, 129 | "order": 1, 130 | "mode": 0, 131 | "inputs": [], 132 | "outputs": [], 133 | "properties": {}, 134 | "widgets_values": [ 135 | "#### Qwen-image\n- Qwen-image文生图支持中文输入,中文输出。对一些偏僻或中文概念理解很好,支持全文中文小字。\n- prompt_extend是提示词扩写,默认是开启的。\n\n#### Qwen-image-edit(图片编辑)\n- 一句话的图片编辑工具" 136 | ], 137 | "color": "#432", 138 | "bgcolor": "#653" 139 | }, 140 | { 141 | "id": 15, 142 | "type": "QwenImageNode", 143 | "pos": [ 144 | 187.6018829345703, 145 | -129.96339416503906 146 | ], 147 | "size": [ 148 | 404.3713073730469, 149 | 267.01239013671875 150 | ], 151 | "flags": {}, 152 | "order": 2, 153 | "mode": 0, 154 | "inputs": [], 155 | "outputs": [ 156 | { 157 | "name": "output", 158 | "type": "IMAGE", 159 | "links": [ 160 | 12 161 | ] 162 | } 163 | ], 164 | "properties": { 165 | "cnr_id": "Mojie-API-Party", 166 | "ver": "5c2fff706e89118c32c8847569e46fe0fac3a173", 167 | "Node name for S&R": "QwenImageNode" 168 | }, 169 | "widgets_values": [ 170 | "《长安的荔枝》影视化视觉,海报上用书法写着大字:“长安的荔枝”,画风融合新中式美学,以细腻笔触绘荔枝,色彩温润和谐,红粉渐变显果实饱满。以大面积红色为背景简化干扰,巨大荔枝滚落在赤红山峦,有一个唐朝蓝色朝服官员正在上面策马奔腾,跋涉山路,金粉飞溅,云雾缭绕的山峰做背景。构图简洁,突出主题,既有传统工笔的精致,又融入现代插画的清新感,传递出东方诗意与雅致,借荔枝这一传统意象,展现独特的东方视觉审美 。史诗感的构图,画风柔美,细节丰富,电影海报级叙事感。", 171 | "928*1664", 172 | 1, 173 | true, 174 | 1984, 175 | "randomize" 176 | ] 177 | }, 178 | { 179 | "id": 16, 180 | "type": "PreviewImage", 181 | "pos": [ 182 | 623.0210571289062, 183 | -162.7117156982422 184 | ], 185 | "size": [ 186 | 425.4918518066406, 187 | 560.9678955078125 188 | ], 189 | "flags": {}, 190 | "order": 4, 191 | "mode": 0, 192 | "inputs": [ 193 | { 194 | "name": "images", 195 | "type": "IMAGE", 196 | "link": 12 197 | } 198 | ], 199 | "outputs": [], 200 | "properties": { 201 | "cnr_id": "comfy-core", 202 | "ver": "0.3.50", 203 | "Node name for S&R": "PreviewImage" 204 | }, 205 | "widgets_values": [] 206 | } 207 | ], 208 | "links": [ 209 | [ 210 | 12, 211 | 15, 212 | 0, 213 | 16, 214 | 0, 215 | "IMAGE" 216 | ], 217 | [ 218 | 13, 219 | 21, 220 | 0, 221 | 20, 222 | 0, 223 | "IMAGE" 224 | ], 225 | [ 226 | 14, 227 | 20, 228 | 0, 229 | 22, 230 | 0, 231 | "IMAGE" 232 | ] 233 | ], 234 | "groups": [ 235 | { 236 | "id": 1, 237 | "title": "Qwen文生图", 238 | "bounding": [ 239 | 123.96365356445312, 240 | -236.20985412597656, 241 | 1480.6800537109375, 242 | 667.5759887695312 243 | ], 244 | "color": "#3f789e", 245 | "font_size": 24, 246 | "flags": {} 247 | }, 248 | { 249 | "id": 2, 250 | "title": "Qwen-图片编辑", 251 | "bounding": [ 252 | 124.6403579711914, 253 | 450.195068359375, 254 | 1468.879150390625, 255 | 650.45703125 256 | ], 257 | "color": "#b06634", 258 | "font_size": 24, 259 | "flags": {} 260 | } 261 | ], 262 | "config": {}, 263 | "extra": { 264 | "ds": { 265 | "scale": 0.7513148009015778, 266 | "offset": [ 267 | 476.5498516747296, 268 | 148.3243514178751 269 | ] 270 | }, 271 | "frontendVersion": "1.23.4" 272 | }, 273 | "version": 0.4 274 | } -------------------------------------------------------------------------------- /workflow/Vidu_reference.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c0a62eda-2b6b-41d2-aa23-86b9e179c55c", 3 | "revision": 0, 4 | "last_node_id": 5, 5 | "last_link_id": 5, 6 | "nodes": [ 7 | { 8 | "id": 2, 9 | "type": "LoadImage", 10 | "pos": [ 11 | -1327.947509765625, 12 | -140.50660705566406 13 | ], 14 | "size": [ 15 | 270, 16 | 314 17 | ], 18 | "flags": {}, 19 | "order": 0, 20 | "mode": 0, 21 | "inputs": [], 22 | "outputs": [ 23 | { 24 | "name": "IMAGE", 25 | "type": "IMAGE", 26 | "links": [ 27 | 4 28 | ] 29 | }, 30 | { 31 | "name": "MASK", 32 | "type": "MASK", 33 | "links": null 34 | } 35 | ], 36 | "properties": { 37 | "cnr_id": "comfy-core", 38 | "ver": "0.3.51", 39 | "Node name for S&R": "LoadImage" 40 | }, 41 | "widgets_values": [ 42 | "pasted/image (2).png", 43 | "image" 44 | ] 45 | }, 46 | { 47 | "id": 5, 48 | "type": "ImageBatch", 49 | "pos": [ 50 | -1021.850341796875, 51 | -464.0459289550781 52 | ], 53 | "size": [ 54 | 140, 55 | 46 56 | ], 57 | "flags": {}, 58 | "order": 2, 59 | "mode": 0, 60 | "inputs": [ 61 | { 62 | "name": "image1", 63 | "type": "IMAGE", 64 | "link": 3 65 | }, 66 | { 67 | "name": "image2", 68 | "type": "IMAGE", 69 | "link": 4 70 | } 71 | ], 72 | "outputs": [ 73 | { 74 | "name": "IMAGE", 75 | "type": "IMAGE", 76 | "links": [ 77 | 5 78 | ] 79 | } 80 | ], 81 | "properties": { 82 | "cnr_id": "comfy-core", 83 | "ver": "0.3.51", 84 | "Node name for S&R": "ImageBatch" 85 | }, 86 | "widgets_values": [] 87 | }, 88 | { 89 | "id": 1, 90 | "type": "ViduNode", 91 | "pos": [ 92 | -846.1627807617188, 93 | -456.4686584472656 94 | ], 95 | "size": [ 96 | 400, 97 | 200 98 | ], 99 | "flags": {}, 100 | "order": 3, 101 | "mode": 0, 102 | "inputs": [ 103 | { 104 | "name": "images", 105 | "type": "IMAGE", 106 | "link": 5 107 | } 108 | ], 109 | "outputs": [ 110 | { 111 | "name": "video", 112 | "type": "VIDEO", 113 | "links": [ 114 | 2 115 | ] 116 | } 117 | ], 118 | "properties": { 119 | "cnr_id": "Mojie-API-Party", 120 | "ver": "5d0a8a5f0c0e000f8a9b17ed06e8d4636f27ac4c", 121 | "Node name for S&R": "ViduNode" 122 | }, 123 | "widgets_values": [ 124 | "这个女孩戴上这个耳机,闭着眼睛,沉浸在音乐中,在房间里坐在沙发上。", 125 | "viduq1", 126 | "9:16", 127 | 587, 128 | "randomize" 129 | ] 130 | }, 131 | { 132 | "id": 4, 133 | "type": "LoadImage", 134 | "pos": [ 135 | -1333.2869873046875, 136 | -508.5839538574219 137 | ], 138 | "size": [ 139 | 270, 140 | 314 141 | ], 142 | "flags": {}, 143 | "order": 1, 144 | "mode": 0, 145 | "inputs": [], 146 | "outputs": [ 147 | { 148 | "name": "IMAGE", 149 | "type": "IMAGE", 150 | "links": [ 151 | 3 152 | ] 153 | }, 154 | { 155 | "name": "MASK", 156 | "type": "MASK", 157 | "links": null 158 | } 159 | ], 160 | "properties": { 161 | "cnr_id": "comfy-core", 162 | "ver": "0.3.51", 163 | "Node name for S&R": "LoadImage" 164 | }, 165 | "widgets_values": [ 166 | "152838377312388750868885_x.jpg", 167 | "image" 168 | ] 169 | }, 170 | { 171 | "id": 3, 172 | "type": "SaveVideo", 173 | "pos": [ 174 | -402.5278625488281, 175 | -513.2578735351562 176 | ], 177 | "size": [ 178 | 467.9143371582031, 179 | 929.8477172851562 180 | ], 181 | "flags": {}, 182 | "order": 4, 183 | "mode": 0, 184 | "inputs": [ 185 | { 186 | "name": "video", 187 | "type": "VIDEO", 188 | "link": 2 189 | } 190 | ], 191 | "outputs": [], 192 | "properties": { 193 | "cnr_id": "comfy-core", 194 | "ver": "0.3.51", 195 | "Node name for S&R": "SaveVideo" 196 | }, 197 | "widgets_values": [ 198 | "video/ComfyUI", 199 | "auto", 200 | "auto" 201 | ] 202 | } 203 | ], 204 | "links": [ 205 | [ 206 | 2, 207 | 1, 208 | 0, 209 | 3, 210 | 0, 211 | "VIDEO" 212 | ], 213 | [ 214 | 3, 215 | 4, 216 | 0, 217 | 5, 218 | 0, 219 | "IMAGE" 220 | ], 221 | [ 222 | 4, 223 | 2, 224 | 0, 225 | 5, 226 | 1, 227 | "IMAGE" 228 | ], 229 | [ 230 | 5, 231 | 5, 232 | 0, 233 | 1, 234 | 0, 235 | "IMAGE" 236 | ] 237 | ], 238 | "groups": [ 239 | { 240 | "id": 1, 241 | "title": "VIdu参考生视频", 242 | "bounding": [ 243 | -1399.397216796875, 244 | -596.628173828125, 245 | 1505.6217041015625, 246 | 1037.406494140625 247 | ], 248 | "color": "#3f789e", 249 | "font_size": 24, 250 | "flags": {} 251 | } 252 | ], 253 | "config": {}, 254 | "extra": { 255 | "ds": { 256 | "scale": 0.7513148009015777, 257 | "offset": [ 258 | 1671.0346116145324, 259 | 630.6342062520574 260 | ] 261 | }, 262 | "frontendVersion": "1.25.9" 263 | }, 264 | "version": 0.4 265 | } -------------------------------------------------------------------------------- /workflow/redux万物迁移.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c1aeb4e3-6d51-429d-9b7c-b1ec2c7ccdea", 3 | "revision": 0, 4 | "last_node_id": 9, 5 | "last_link_id": 10, 6 | "nodes": [ 7 | { 8 | "id": 4, 9 | "type": "PreviewImage", 10 | "pos": [ 11 | 4470, 12 | 70 13 | ], 14 | "size": [ 15 | 448.9315490722656, 16 | 524.64453125 17 | ], 18 | "flags": {}, 19 | "order": 4, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "images", 24 | "type": "IMAGE", 25 | "link": 5 26 | } 27 | ], 28 | "outputs": [], 29 | "properties": { 30 | "cnr_id": "comfy-core", 31 | "ver": "0.3.50", 32 | "Node name for S&R": "PreviewImage" 33 | }, 34 | "widgets_values": [] 35 | }, 36 | { 37 | "id": 1, 38 | "type": "ReplaceNode", 39 | "pos": [ 40 | 4020, 41 | 80 42 | ], 43 | "size": [ 44 | 400, 45 | 220 46 | ], 47 | "flags": {}, 48 | "order": 3, 49 | "mode": 0, 50 | "inputs": [ 51 | { 52 | "name": "migrate_image", 53 | "type": "IMAGE", 54 | "link": 3 55 | }, 56 | { 57 | "name": "migrate_mask", 58 | "type": "MASK", 59 | "link": 4 60 | }, 61 | { 62 | "name": "Product_image", 63 | "type": "IMAGE", 64 | "link": 1 65 | }, 66 | { 67 | "name": "Product_mask", 68 | "shape": 7, 69 | "type": "MASK", 70 | "link": 10 71 | } 72 | ], 73 | "outputs": [ 74 | { 75 | "name": "output", 76 | "type": "IMAGE", 77 | "links": [ 78 | 5 79 | ] 80 | } 81 | ], 82 | "properties": { 83 | "cnr_id": "Mojie-API-Party", 84 | "ver": "5c2fff706e89118c32c8847569e46fe0fac3a173", 85 | "Node name for S&R": "ReplaceNode" 86 | }, 87 | "widgets_values": [ 88 | "this a headset", 89 | 0.6, 90 | 2004, 91 | "randomize" 92 | ] 93 | }, 94 | { 95 | "id": 3, 96 | "type": "LoadImage", 97 | "pos": [ 98 | 3492.45703125, 99 | 56.578956604003906 100 | ], 101 | "size": [ 102 | 445.9106140136719, 103 | 528.3062133789062 104 | ], 105 | "flags": {}, 106 | "order": 0, 107 | "mode": 0, 108 | "inputs": [], 109 | "outputs": [ 110 | { 111 | "name": "IMAGE", 112 | "type": "IMAGE", 113 | "links": [ 114 | 3 115 | ] 116 | }, 117 | { 118 | "name": "MASK", 119 | "type": "MASK", 120 | "links": [ 121 | 4 122 | ] 123 | } 124 | ], 125 | "properties": { 126 | "cnr_id": "comfy-core", 127 | "ver": "0.3.50", 128 | "Node name for S&R": "LoadImage" 129 | }, 130 | "widgets_values": [ 131 | "clipspace/clipspace-mask-664798.3000000007.png [input]", 132 | "image" 133 | ] 134 | }, 135 | { 136 | "id": 2, 137 | "type": "LoadImage", 138 | "pos": [ 139 | 3562.4326171875, 140 | 718.2939453125 141 | ], 142 | "size": [ 143 | 305.8754577636719, 144 | 362.29388427734375 145 | ], 146 | "flags": {}, 147 | "order": 1, 148 | "mode": 0, 149 | "inputs": [], 150 | "outputs": [ 151 | { 152 | "name": "IMAGE", 153 | "type": "IMAGE", 154 | "links": [ 155 | 1 156 | ] 157 | }, 158 | { 159 | "name": "MASK", 160 | "type": "MASK", 161 | "links": [ 162 | 10 163 | ] 164 | } 165 | ], 166 | "properties": { 167 | "cnr_id": "comfy-core", 168 | "ver": "0.3.50", 169 | "Node name for S&R": "LoadImage" 170 | }, 171 | "widgets_values": [ 172 | "clipspace/clipspace-mask-824608.4000000004.png [input]", 173 | "image" 174 | ] 175 | }, 176 | { 177 | "id": 9, 178 | "type": "MarkdownNote", 179 | "pos": [ 180 | 3010.423095703125, 181 | 13.214137077331543 182 | ], 183 | "size": [ 184 | 415.0225830078125, 185 | 251.47604370117188 186 | ], 187 | "flags": {}, 188 | "order": 2, 189 | "mode": 0, 190 | "inputs": [], 191 | "outputs": [], 192 | "properties": {}, 193 | "widgets_values": [ 194 | "##### Redux万物迁移\n- migrate_image和migrate_mask是必选项上传需要被迁移的图片和迁移区域的遮罩。\n\n- Product_image和Product_mask是上传迁移产品图,遮罩不是必须的。\n\n- 但是可以给Product_mask细节处添加遮罩,可以让细节还原更加准确。\n\n- 提示词可以不填,有默认提示词。或者简单形容一下这个是什么物品。\n\n- 强度在0.6-0.9即可\n" 195 | ], 196 | "color": "#432", 197 | "bgcolor": "#653" 198 | } 199 | ], 200 | "links": [ 201 | [ 202 | 1, 203 | 2, 204 | 0, 205 | 1, 206 | 2, 207 | "IMAGE" 208 | ], 209 | [ 210 | 3, 211 | 3, 212 | 0, 213 | 1, 214 | 0, 215 | "IMAGE" 216 | ], 217 | [ 218 | 4, 219 | 3, 220 | 1, 221 | 1, 222 | 1, 223 | "MASK" 224 | ], 225 | [ 226 | 5, 227 | 1, 228 | 0, 229 | 4, 230 | 0, 231 | "IMAGE" 232 | ], 233 | [ 234 | 10, 235 | 2, 236 | 1, 237 | 1, 238 | 3, 239 | "MASK" 240 | ] 241 | ], 242 | "groups": [ 243 | { 244 | "id": 1, 245 | "title": "Group", 246 | "bounding": [ 247 | 3975.079345703125, 248 | -19.518848419189453, 249 | 959.3125610351562, 250 | 697.1681518554688 251 | ], 252 | "color": "#3f789e", 253 | "font_size": 24, 254 | "flags": {} 255 | }, 256 | { 257 | "id": 2, 258 | "title": "迁移图片", 259 | "bounding": [ 260 | 3482.45703125, 261 | -17.021055221557617, 262 | 465.91064453125, 263 | 611.9061889648438 264 | ], 265 | "color": "#8A8", 266 | "font_size": 24, 267 | "flags": {} 268 | }, 269 | { 270 | "id": 3, 271 | "title": "产品图片", 272 | "bounding": [ 273 | 3485.08349609375, 274 | 614.8181762695312, 275 | 464.2589111328125, 276 | 514.6448974609375 277 | ], 278 | "color": "#a1309b", 279 | "font_size": 24, 280 | "flags": {} 281 | } 282 | ], 283 | "config": {}, 284 | "extra": { 285 | "ds": { 286 | "scale": 0.7247295000000094, 287 | "offset": [ 288 | -2958.0481791875213, 289 | 178.87438348398422 290 | ] 291 | }, 292 | "groupNodes": {}, 293 | "frontendVersion": "1.23.4" 294 | }, 295 | "version": 0.4 296 | } -------------------------------------------------------------------------------- /workflow/seedance.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "0da707c8-8042-48af-8b05-9aa1e5904a27", 3 | "revision": 0, 4 | "last_node_id": 16, 5 | "last_link_id": 11, 6 | "nodes": [ 7 | { 8 | "id": 7, 9 | "type": "PrimitiveStringMultiline", 10 | "pos": [ 11 | -56.63548278808594, 12 | 282.9696350097656 13 | ], 14 | "size": [ 15 | 326.8748779296875, 16 | 256.6977844238281 17 | ], 18 | "flags": {}, 19 | "order": 0, 20 | "mode": 0, 21 | "inputs": [], 22 | "outputs": [ 23 | { 24 | "name": "STRING", 25 | "type": "STRING", 26 | "links": [ 27 | 5 28 | ] 29 | } 30 | ], 31 | "properties": { 32 | "cnr_id": "comfy-core", 33 | "ver": "0.3.51", 34 | "Node name for S&R": "PrimitiveStringMultiline" 35 | }, 36 | "widgets_values": [ 37 | "细雨如丝的江南小巷,一位身着浅绿色 旗袍我江南女子,撑着一把油纸伞缓缓走来。上绣着淡雅的兰花,用淡蓝色丝线勾勒出花瓣的轮廓,裙摆上的雨渍晕染开来,仿佛一幅水墨画。佳人的秀发盘起,插着一支兰花形状的玉簪,眉眼间透着淡淡的忧愁。雨滴打在伞面上,溅起晶莹的水花,与她身上散发的幽兰气质相得益彰。" 38 | ] 39 | }, 40 | { 41 | "id": 2, 42 | "type": "LoadImage", 43 | "pos": [ 44 | 298.6058654785156, 45 | 289.0398254394531 46 | ], 47 | "size": [ 48 | 266, 49 | 497.0000305175781 50 | ], 51 | "flags": {}, 52 | "order": 1, 53 | "mode": 0, 54 | "inputs": [], 55 | "outputs": [ 56 | { 57 | "name": "IMAGE", 58 | "type": "IMAGE", 59 | "links": [ 60 | 1 61 | ] 62 | }, 63 | { 64 | "name": "MASK", 65 | "type": "MASK", 66 | "links": null 67 | } 68 | ], 69 | "properties": { 70 | "cnr_id": "comfy-core", 71 | "ver": "0.3.51", 72 | "Node name for S&R": "LoadImage" 73 | }, 74 | "widgets_values": [ 75 | "ComfyUI_00023_.png", 76 | "image" 77 | ] 78 | }, 79 | { 80 | "id": 5, 81 | "type": "SaveVideo", 82 | "pos": [ 83 | 840, 84 | -260 85 | ], 86 | "size": [ 87 | 494.8576354980469, 88 | 396.8342590332031 89 | ], 90 | "flags": {}, 91 | "order": 11, 92 | "mode": 0, 93 | "inputs": [ 94 | { 95 | "name": "video", 96 | "type": "VIDEO", 97 | "link": 3 98 | } 99 | ], 100 | "outputs": [], 101 | "properties": { 102 | "cnr_id": "comfy-core", 103 | "ver": "0.3.51", 104 | "Node name for S&R": "SaveVideo" 105 | }, 106 | "widgets_values": [ 107 | "video/ComfyUI", 108 | "auto", 109 | "auto" 110 | ] 111 | }, 112 | { 113 | "id": 4, 114 | "type": "PrimitiveStringMultiline", 115 | "pos": [ 116 | 20, 117 | -260 118 | ], 119 | "size": [ 120 | 326.8748779296875, 121 | 256.6977844238281 122 | ], 123 | "flags": {}, 124 | "order": 2, 125 | "mode": 0, 126 | "inputs": [], 127 | "outputs": [ 128 | { 129 | "name": "STRING", 130 | "type": "STRING", 131 | "links": [ 132 | 4 133 | ] 134 | } 135 | ], 136 | "properties": { 137 | "cnr_id": "comfy-core", 138 | "ver": "0.3.51", 139 | "Node name for S&R": "PrimitiveStringMultiline" 140 | }, 141 | "widgets_values": [ 142 | "细雨如丝的江南小巷,一位身着浅绿色 旗袍我江南女子,撑着一把油纸伞缓缓走来。上绣着淡雅的兰花,用淡蓝色丝线勾勒出花瓣的轮廓,裙摆上的雨渍晕染开来,仿佛一幅水墨画。佳人的秀发盘起,插着一支兰花形状的玉簪,眉眼间透着淡淡的忧愁。雨滴打在伞面上,溅起晶莹的水花,与她身上散发的幽兰气质相得益彰。" 143 | ] 144 | }, 145 | { 146 | "id": 13, 147 | "type": "LoadImage", 148 | "pos": [ 149 | 320.9571228027344, 150 | 1127.0596923828125 151 | ], 152 | "size": [ 153 | 291.4545593261719, 154 | 326 155 | ], 156 | "flags": {}, 157 | "order": 3, 158 | "mode": 0, 159 | "inputs": [], 160 | "outputs": [ 161 | { 162 | "name": "IMAGE", 163 | "type": "IMAGE", 164 | "links": [ 165 | 9 166 | ] 167 | }, 168 | { 169 | "name": "MASK", 170 | "type": "MASK", 171 | "links": null 172 | } 173 | ], 174 | "properties": { 175 | "cnr_id": "comfy-core", 176 | "ver": "0.3.51", 177 | "Node name for S&R": "LoadImage" 178 | }, 179 | "widgets_values": [ 180 | "ComfyUI_00023_.png", 181 | "image" 182 | ] 183 | }, 184 | { 185 | "id": 1, 186 | "type": "DreaminaI2VNode", 187 | "pos": [ 188 | 592.4619140625, 189 | 283.6224060058594 190 | ], 191 | "size": [ 192 | 400, 193 | 252 194 | ], 195 | "flags": {}, 196 | "order": 7, 197 | "mode": 0, 198 | "inputs": [ 199 | { 200 | "name": "first_image", 201 | "type": "IMAGE", 202 | "link": 1 203 | }, 204 | { 205 | "name": "last_image", 206 | "shape": 7, 207 | "type": "IMAGE", 208 | "link": null 209 | }, 210 | { 211 | "name": "prompt", 212 | "type": "STRING", 213 | "widget": { 214 | "name": "prompt" 215 | }, 216 | "link": 5 217 | } 218 | ], 219 | "outputs": [ 220 | { 221 | "name": "video", 222 | "type": "VIDEO", 223 | "links": [ 224 | 2 225 | ] 226 | } 227 | ], 228 | "properties": { 229 | "cnr_id": "Mojie-API-Party", 230 | "ver": "bcdc3885580de8d9b4734915fb7b6070aed68253", 231 | "Node name for S&R": "DreaminaI2VNode" 232 | }, 233 | "widgets_values": [ 234 | "", 235 | "1080p", 236 | "9:16", 237 | 10, 238 | false, 239 | 840, 240 | "randomize" 241 | ] 242 | }, 243 | { 244 | "id": 3, 245 | "type": "SaveVideo", 246 | "pos": [ 247 | 1022.8729858398438, 248 | 268.5070495605469 249 | ], 250 | "size": [ 251 | 374, 252 | 758 253 | ], 254 | "flags": {}, 255 | "order": 10, 256 | "mode": 0, 257 | "inputs": [ 258 | { 259 | "name": "video", 260 | "type": "VIDEO", 261 | "link": 2 262 | } 263 | ], 264 | "outputs": [], 265 | "properties": { 266 | "cnr_id": "comfy-core", 267 | "ver": "0.3.51", 268 | "Node name for S&R": "SaveVideo" 269 | }, 270 | "widgets_values": [ 271 | "video/ComfyUI", 272 | "auto", 273 | "auto" 274 | ] 275 | }, 276 | { 277 | "id": 14, 278 | "type": "DreaminaI2VNode", 279 | "pos": [ 280 | 687.3207397460938, 281 | 1132.513916015625 282 | ], 283 | "size": [ 284 | 400, 285 | 252 286 | ], 287 | "flags": {}, 288 | "order": 9, 289 | "mode": 0, 290 | "inputs": [ 291 | { 292 | "name": "first_image", 293 | "type": "IMAGE", 294 | "link": 9 295 | }, 296 | { 297 | "name": "last_image", 298 | "shape": 7, 299 | "type": "IMAGE", 300 | "link": 11 301 | }, 302 | { 303 | "name": "prompt", 304 | "type": "STRING", 305 | "widget": { 306 | "name": "prompt" 307 | }, 308 | "link": 10 309 | } 310 | ], 311 | "outputs": [ 312 | { 313 | "name": "video", 314 | "type": "VIDEO", 315 | "links": [ 316 | 8 317 | ] 318 | } 319 | ], 320 | "properties": { 321 | "cnr_id": "Mojie-API-Party", 322 | "ver": "bcdc3885580de8d9b4734915fb7b6070aed68253", 323 | "Node name for S&R": "DreaminaI2VNode" 324 | }, 325 | "widgets_values": [ 326 | "", 327 | "1080p", 328 | "9:16", 329 | 10, 330 | false, 331 | 886, 332 | "randomize" 333 | ] 334 | }, 335 | { 336 | "id": 11, 337 | "type": "SaveVideo", 338 | "pos": [ 339 | 1135.7623291015625, 340 | 1119.786865234375 341 | ], 342 | "size": [ 343 | 270, 344 | 574.4705810546875 345 | ], 346 | "flags": {}, 347 | "order": 12, 348 | "mode": 0, 349 | "inputs": [ 350 | { 351 | "name": "video", 352 | "type": "VIDEO", 353 | "link": 8 354 | } 355 | ], 356 | "outputs": [], 357 | "properties": { 358 | "cnr_id": "comfy-core", 359 | "ver": "0.3.51", 360 | "Node name for S&R": "SaveVideo" 361 | }, 362 | "widgets_values": [ 363 | "video/ComfyUI", 364 | "auto", 365 | "auto" 366 | ] 367 | }, 368 | { 369 | "id": 15, 370 | "type": "LoadImage", 371 | "pos": [ 372 | 322.9444580078125, 373 | 1501.0069580078125 374 | ], 375 | "size": [ 376 | 284.5454406738281, 377 | 379.4546203613281 378 | ], 379 | "flags": {}, 380 | "order": 4, 381 | "mode": 0, 382 | "inputs": [], 383 | "outputs": [ 384 | { 385 | "name": "IMAGE", 386 | "type": "IMAGE", 387 | "links": [ 388 | 11 389 | ] 390 | }, 391 | { 392 | "name": "MASK", 393 | "type": "MASK", 394 | "links": null 395 | } 396 | ], 397 | "properties": { 398 | "cnr_id": "comfy-core", 399 | "ver": "0.3.51", 400 | "Node name for S&R": "LoadImage" 401 | }, 402 | "widgets_values": [ 403 | "ComfyUI_temp_clzmo_00003_.png", 404 | "image" 405 | ] 406 | }, 407 | { 408 | "id": 6, 409 | "type": "DreaminaT2VNode", 410 | "pos": [ 411 | 400, 412 | -260 413 | ], 414 | "size": [ 415 | 400, 416 | 232 417 | ], 418 | "flags": {}, 419 | "order": 8, 420 | "mode": 0, 421 | "inputs": [ 422 | { 423 | "name": "prompt", 424 | "type": "STRING", 425 | "widget": { 426 | "name": "prompt" 427 | }, 428 | "link": 4 429 | } 430 | ], 431 | "outputs": [ 432 | { 433 | "name": "video", 434 | "type": "VIDEO", 435 | "links": [ 436 | 3 437 | ] 438 | } 439 | ], 440 | "properties": { 441 | "cnr_id": "Mojie-API-Party", 442 | "ver": "bcdc3885580de8d9b4734915fb7b6070aed68253", 443 | "Node name for S&R": "DreaminaT2VNode" 444 | }, 445 | "widgets_values": [ 446 | "", 447 | "1080p", 448 | "16:9", 449 | 10, 450 | false, 451 | 362, 452 | "randomize" 453 | ] 454 | }, 455 | { 456 | "id": 12, 457 | "type": "PrimitiveStringMultiline", 458 | "pos": [ 459 | -39.44120407104492, 460 | 1133.533203125 461 | ], 462 | "size": [ 463 | 326.8748779296875, 464 | 256.6977844238281 465 | ], 466 | "flags": {}, 467 | "order": 5, 468 | "mode": 0, 469 | "inputs": [], 470 | "outputs": [ 471 | { 472 | "name": "STRING", 473 | "type": "STRING", 474 | "links": [ 475 | 10 476 | ] 477 | } 478 | ], 479 | "properties": { 480 | "cnr_id": "comfy-core", 481 | "ver": "0.3.51", 482 | "Node name for S&R": "PrimitiveStringMultiline" 483 | }, 484 | "widgets_values": [ 485 | "细雨如丝的江南小巷,一位身着浅绿色旗袍江南女子,撑着一把油纸伞缓缓走来。她停下脚步,镜头逐渐给到她的脸部特写,她忧郁的看向镜头。" 486 | ] 487 | }, 488 | { 489 | "id": 16, 490 | "type": "MarkdownNote", 491 | "pos": [ 492 | -477.6809387207031, 493 | -292.83740234375 494 | ], 495 | "size": [ 496 | 377.1842041015625, 497 | 566.57861328125 498 | ], 499 | "flags": {}, 500 | "order": 6, 501 | "mode": 0, 502 | "inputs": [], 503 | "outputs": [], 504 | "properties": {}, 505 | "widgets_values": [ 506 | "### seedance\n\nseedance视频生成工作流,\n\n该模型语义理解与指令遵循能力强。运镜专业。支持多种视频风格,可以丝滑兼容各种风格的首图。分辨率支持480P、720P、1080P,时长支持3-10s,帧率24fps\n\ncamerafixed是固定镜头开关,开启后将忽略镜头运镜提示词。\n\nduration是生成时长选项\n\nlast_image不是必须的,接入了之后就是首尾帧,没有接入就是图生视频。" 507 | ], 508 | "color": "#432", 509 | "bgcolor": "#653" 510 | } 511 | ], 512 | "links": [ 513 | [ 514 | 1, 515 | 2, 516 | 0, 517 | 1, 518 | 0, 519 | "IMAGE" 520 | ], 521 | [ 522 | 2, 523 | 1, 524 | 0, 525 | 3, 526 | 0, 527 | "VIDEO" 528 | ], 529 | [ 530 | 3, 531 | 6, 532 | 0, 533 | 5, 534 | 0, 535 | "VIDEO" 536 | ], 537 | [ 538 | 4, 539 | 4, 540 | 0, 541 | 6, 542 | 0, 543 | "STRING" 544 | ], 545 | [ 546 | 5, 547 | 7, 548 | 0, 549 | 1, 550 | 2, 551 | "STRING" 552 | ], 553 | [ 554 | 8, 555 | 14, 556 | 0, 557 | 11, 558 | 0, 559 | "VIDEO" 560 | ], 561 | [ 562 | 9, 563 | 13, 564 | 0, 565 | 14, 566 | 0, 567 | "IMAGE" 568 | ], 569 | [ 570 | 10, 571 | 12, 572 | 0, 573 | 14, 574 | 2, 575 | "STRING" 576 | ], 577 | [ 578 | 11, 579 | 15, 580 | 0, 581 | 14, 582 | 1, 583 | "IMAGE" 584 | ] 585 | ], 586 | "groups": [ 587 | { 588 | "id": 1, 589 | "title": "seedance图生视频", 590 | "bounding": [ 591 | -66.63548278808594, 592 | 209.3695526123047, 593 | 1528.8248291015625, 594 | 818.9716796875 595 | ], 596 | "color": "#88A", 597 | "font_size": 24, 598 | "flags": {} 599 | }, 600 | { 601 | "id": 2, 602 | "title": "seedance文生视频", 603 | "bounding": [ 604 | -68.0436782836914, 605 | -358.6665954589844, 606 | 1525.05517578125, 607 | 553.6654663085938 608 | ], 609 | "color": "#3f789e", 610 | "font_size": 24, 611 | "flags": {} 612 | }, 613 | { 614 | "id": 3, 615 | "title": "seedance首尾帧视频", 616 | "bounding": [ 617 | -64.0103759765625, 618 | 1046.1881103515625, 619 | 1526.9664306640625, 620 | 856.8729858398438 621 | ], 622 | "color": "#a1309b", 623 | "font_size": 24, 624 | "flags": {} 625 | } 626 | ], 627 | "config": {}, 628 | "extra": { 629 | "ds": { 630 | "scale": 0.4665073802097334, 631 | "offset": [ 632 | 1045.3545566660782, 633 | 408.12891673267626 634 | ] 635 | }, 636 | "frontendVersion": "1.25.9" 637 | }, 638 | "version": 0.4 639 | } -------------------------------------------------------------------------------- /workflow/seededit.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "1ad92464-c142-4325-9775-91b34bc10428", 3 | "revision": 0, 4 | "last_node_id": 23, 5 | "last_link_id": 21, 6 | "nodes": [ 7 | { 8 | "id": 10, 9 | "type": "SeedEdit3", 10 | "pos": [ 11 | 4613.47509765625, 12 | -186.01011657714844 13 | ], 14 | "size": [ 15 | 431.1004943847656, 16 | 223.8437042236328 17 | ], 18 | "flags": {}, 19 | "order": 2, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "image", 24 | "type": "IMAGE", 25 | "link": 12 26 | } 27 | ], 28 | "outputs": [ 29 | { 30 | "name": "output", 31 | "type": "IMAGE", 32 | "slot_index": 0, 33 | "links": [ 34 | 11 35 | ] 36 | } 37 | ], 38 | "properties": { 39 | "cnr_id": "Mojie-API-Party", 40 | "ver": "923949e455be67f63c0ee4d40550ec93adea27db", 41 | "Node name for S&R": "SeedEdit3" 42 | }, 43 | "widgets_values": [ 44 | "更换图中的背景为海边", 45 | 0.5, 46 | 568, 47 | "randomize", 48 | 1 49 | ] 50 | }, 51 | { 52 | "id": 12, 53 | "type": "PreviewImage", 54 | "pos": [ 55 | 5072.2421875, 56 | -187.3025665283203 57 | ], 58 | "size": [ 59 | 418.6126708984375, 60 | 553.7525634765625 61 | ], 62 | "flags": {}, 63 | "order": 3, 64 | "mode": 0, 65 | "inputs": [ 66 | { 67 | "name": "images", 68 | "type": "IMAGE", 69 | "link": 11 70 | } 71 | ], 72 | "outputs": [], 73 | "properties": { 74 | "cnr_id": "comfy-core", 75 | "ver": "0.3.51", 76 | "Node name for S&R": "PreviewImage" 77 | }, 78 | "widgets_values": [] 79 | }, 80 | { 81 | "id": 14, 82 | "type": "LoadImage", 83 | "pos": [ 84 | 4269.72265625, 85 | -195.3722381591797 86 | ], 87 | "size": [ 88 | 319.7607727050781, 89 | 548.2903442382812 90 | ], 91 | "flags": {}, 92 | "order": 0, 93 | "mode": 0, 94 | "inputs": [], 95 | "outputs": [ 96 | { 97 | "name": "IMAGE", 98 | "type": "IMAGE", 99 | "links": [ 100 | 12 101 | ] 102 | }, 103 | { 104 | "name": "MASK", 105 | "type": "MASK", 106 | "links": null 107 | } 108 | ], 109 | "properties": { 110 | "cnr_id": "comfy-core", 111 | "ver": "0.3.51", 112 | "Node name for S&R": "LoadImage" 113 | }, 114 | "widgets_values": [ 115 | "volcengine_20250523225721.png", 116 | "image" 117 | ] 118 | }, 119 | { 120 | "id": 15, 121 | "type": "MarkdownNote", 122 | "pos": [ 123 | 3783.03076171875, 124 | -250.33775329589844 125 | ], 126 | "size": [ 127 | 446.0703125, 128 | 655.8336181640625 129 | ], 130 | "flags": {}, 131 | "order": 1, 132 | "mode": 0, 133 | "inputs": [], 134 | "outputs": [], 135 | "properties": {}, 136 | "widgets_values": [ 137 | "### seededit3.0 使用说明\n\nSeedEdit 3.0 是字节跳动开发的图片编辑工具,能通过文字描述修改图片。比如你说 “把背景换成海边”。支持使用中文提示词,支持输出中文。\n\n用于编辑图像的提示词 。建议:\n- 建议长度 <= 120字符,prompt过长有概率出图异常或不生效\n\n- 编辑指令使用自然语言即可\n- 每次编辑使用单指令会更好\n- 局部编辑时指令描述尽量精准,尤其是画面有多个实体的时候,描述清楚对谁做什么,能获取更精准的编辑效果\n\n- 发现编辑效果不明显的时候,可以调整一下编辑强度cfg_scale,数值越大越贴近指令执行\n尽量使用清晰的,分辨率高的底片.\n\n### 参考示例:\n- 添加/删除实体:添加/删除xxx(删除图上的女孩/添加一道彩虹)\n- 修改实体:把xxx改成xxx(把手里的鸡腿变成汉堡)\n- 修改风格:改成xxx风格(改成漫画风格)\n- 修改色彩:把xxx改成xx颜色(把衣服改成粉色的)\n- 修改动作:修改表情动作(让他哭/笑/生气)\n- 修改环境背景:背景换成xxx,在xxx(背景换成海边/在星空下)" 138 | ], 139 | "color": "#432", 140 | "bgcolor": "#653" 141 | } 142 | ], 143 | "links": [ 144 | [ 145 | 11, 146 | 10, 147 | 0, 148 | 12, 149 | 0, 150 | "IMAGE" 151 | ], 152 | [ 153 | 12, 154 | 14, 155 | 0, 156 | 10, 157 | 0, 158 | "IMAGE" 159 | ] 160 | ], 161 | "groups": [ 162 | { 163 | "id": 1, 164 | "title": "seed单图编辑", 165 | "bounding": [ 166 | 4252.01220703125, 167 | -269.0345153808594, 168 | 1271.11962890625, 169 | 645.4844970703125 170 | ], 171 | "color": "#3f789e", 172 | "font_size": 24, 173 | "flags": {} 174 | } 175 | ], 176 | "config": {}, 177 | "extra": { 178 | "ds": { 179 | "scale": 0.7972024500000091, 180 | "offset": [ 181 | -3301.0756034673323, 182 | 389.2634024596974 183 | ] 184 | }, 185 | "frontendVersion": "1.25.9" 186 | }, 187 | "version": 0.4 188 | } -------------------------------------------------------------------------------- /workflow/seedream_v4.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "bf0ea790-aba4-413e-80ca-68a5bbb521bb", 3 | "revision": 0, 4 | "last_node_id": 38, 5 | "last_link_id": 39, 6 | "nodes": [ 7 | { 8 | "id": 35, 9 | "type": "ImageBatch", 10 | "pos": [ 11 | -4878.46923828125, 12 | -388.9235534667969 13 | ], 14 | "size": [ 15 | 140, 16 | 46 17 | ], 18 | "flags": {}, 19 | "order": 5, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "image1", 24 | "type": "IMAGE", 25 | "link": 35 26 | }, 27 | { 28 | "name": "image2", 29 | "type": "IMAGE", 30 | "link": 36 31 | } 32 | ], 33 | "outputs": [ 34 | { 35 | "name": "IMAGE", 36 | "type": "IMAGE", 37 | "links": [ 38 | 37 39 | ] 40 | } 41 | ], 42 | "properties": { 43 | "cnr_id": "comfy-core", 44 | "ver": "0.3.51", 45 | "Node name for S&R": "ImageBatch" 46 | } 47 | }, 48 | { 49 | "id": 29, 50 | "type": "LoadImage", 51 | "pos": [ 52 | -5250, 53 | -1150 54 | ], 55 | "size": [ 56 | 250.01931762695312, 57 | 413.90338134765625 58 | ], 59 | "flags": {}, 60 | "order": 0, 61 | "mode": 0, 62 | "inputs": [], 63 | "outputs": [ 64 | { 65 | "name": "IMAGE", 66 | "type": "IMAGE", 67 | "links": [ 68 | 34 69 | ] 70 | }, 71 | { 72 | "name": "MASK", 73 | "type": "MASK", 74 | "links": null 75 | } 76 | ], 77 | "properties": { 78 | "cnr_id": "comfy-core", 79 | "ver": "0.3.51", 80 | "Node name for S&R": "LoadImage" 81 | }, 82 | "widgets_values": [ 83 | "volcengine_20250529170517.png", 84 | "image" 85 | ] 86 | }, 87 | { 88 | "id": 31, 89 | "type": "DoubaoSeedreamNode", 90 | "pos": [ 91 | -4960, 92 | -1150 93 | ], 94 | "size": [ 95 | 400, 96 | 232 97 | ], 98 | "flags": {}, 99 | "order": 4, 100 | "mode": 0, 101 | "inputs": [ 102 | { 103 | "name": "image_input", 104 | "shape": 7, 105 | "type": "IMAGE", 106 | "link": 34 107 | } 108 | ], 109 | "outputs": [ 110 | { 111 | "name": "output", 112 | "type": "IMAGE", 113 | "links": [ 114 | 39 115 | ] 116 | } 117 | ], 118 | "properties": { 119 | "cnr_id": "Mojie-API-Party", 120 | "ver": "eb9562ca0e1e81de255034ad1bfe0b06aa40d385", 121 | "Node name for S&R": "DoubaoSeedreamNode" 122 | }, 123 | "widgets_values": [ 124 | "把端午安康改成中秋快乐", 125 | 623, 126 | "randomize", 127 | true, 128 | "2048x2048", 129 | 1024, 130 | 1024 131 | ] 132 | }, 133 | { 134 | "id": 32, 135 | "type": "MarkdownNote", 136 | "pos": [ 137 | -5670.4453125, 138 | -1168.5592041015625 139 | ], 140 | "size": [ 141 | 340.12933349609375, 142 | 401.5765686035156 143 | ], 144 | "flags": {}, 145 | "order": 1, 146 | "mode": 0, 147 | "inputs": [], 148 | "outputs": [], 149 | "properties": {}, 150 | "widgets_values": [ 151 | "### seedream_v4即梦4.0同款\n\nSeedream 4.0 原生支持文本、单图和多图输入,实现基于主体一致性的多图融合创作、图像编辑、组图生成等多样玩法,实现包括组图生成、多参考图生图等图片生成能力。支持中文输入输出,支持多照片组合输入。\n\nseedream_v4支持4k高清输出,节点中配置了预设尺寸。\n也可以通过自定义宽高来控制输出尺寸。custom_size是自定义尺寸的开关。\n\n多图组合和Nano的不一样,无需拼接,可直接组合批次输入,seedream会自动拼接。最多可支持10张图片进行组合。" 152 | ], 153 | "color": "#432", 154 | "bgcolor": "#653" 155 | }, 156 | { 157 | "id": 36, 158 | "type": "LoadImage", 159 | "pos": [ 160 | -5253.26318359375, 161 | 29.419052124023438 162 | ], 163 | "size": [ 164 | 284.58203125, 165 | 366.2306823730469 166 | ], 167 | "flags": {}, 168 | "order": 2, 169 | "mode": 0, 170 | "inputs": [], 171 | "outputs": [ 172 | { 173 | "name": "IMAGE", 174 | "type": "IMAGE", 175 | "links": [ 176 | 36 177 | ] 178 | }, 179 | { 180 | "name": "MASK", 181 | "type": "MASK", 182 | "links": null 183 | } 184 | ], 185 | "properties": { 186 | "cnr_id": "comfy-core", 187 | "ver": "0.3.51", 188 | "Node name for S&R": "LoadImage" 189 | }, 190 | "widgets_values": [ 191 | "src=http___cbu01.alicdn.com_img_ibank_O1CN01xrkCnz1TYUtUapOQ8_!!2211000902394-0-cib.jpg&refer=http___cbu01.alicdn.jpg", 192 | "image" 193 | ] 194 | }, 195 | { 196 | "id": 34, 197 | "type": "LoadImage", 198 | "pos": [ 199 | -5250.05419921875, 200 | -443.3621520996094 201 | ], 202 | "size": [ 203 | 288.49237060546875, 204 | 427.131591796875 205 | ], 206 | "flags": {}, 207 | "order": 3, 208 | "mode": 0, 209 | "inputs": [], 210 | "outputs": [ 211 | { 212 | "name": "IMAGE", 213 | "type": "IMAGE", 214 | "links": [ 215 | 35 216 | ] 217 | }, 218 | { 219 | "name": "MASK", 220 | "type": "MASK", 221 | "links": null 222 | } 223 | ], 224 | "properties": { 225 | "cnr_id": "comfy-core", 226 | "ver": "0.3.51", 227 | "Node name for S&R": "LoadImage" 228 | }, 229 | "widgets_values": [ 230 | "my (1).png", 231 | "image" 232 | ] 233 | }, 234 | { 235 | "id": 38, 236 | "type": "SaveImage", 237 | "pos": [ 238 | -4518.818359375, 239 | -1160.507568359375 240 | ], 241 | "size": [ 242 | 403.2499694824219, 243 | 586.240966796875 244 | ], 245 | "flags": {}, 246 | "order": 6, 247 | "mode": 0, 248 | "inputs": [ 249 | { 250 | "name": "images", 251 | "type": "IMAGE", 252 | "link": 39 253 | } 254 | ], 255 | "outputs": [], 256 | "properties": { 257 | "cnr_id": "comfy-core", 258 | "ver": "0.3.51" 259 | }, 260 | "widgets_values": [ 261 | "ComfyUI" 262 | ] 263 | }, 264 | { 265 | "id": 33, 266 | "type": "DoubaoSeedreamNode", 267 | "pos": [ 268 | -4695.333984375, 269 | -396.2373046875 270 | ], 271 | "size": [ 272 | 400, 273 | 232 274 | ], 275 | "flags": {}, 276 | "order": 7, 277 | "mode": 0, 278 | "inputs": [ 279 | { 280 | "name": "image_input", 281 | "shape": 7, 282 | "type": "IMAGE", 283 | "link": 37 284 | } 285 | ], 286 | "outputs": [ 287 | { 288 | "name": "output", 289 | "type": "IMAGE", 290 | "links": [ 291 | 38 292 | ] 293 | } 294 | ], 295 | "properties": { 296 | "cnr_id": "Mojie-API-Party", 297 | "ver": "eb9562ca0e1e81de255034ad1bfe0b06aa40d385", 298 | "Node name for S&R": "DoubaoSeedreamNode" 299 | }, 300 | "widgets_values": [ 301 | "图1的女士坐在图2的椅子上.", 302 | 1406, 303 | "randomize", 304 | true, 305 | "1664x2496", 306 | 1024, 307 | 1024 308 | ] 309 | }, 310 | { 311 | "id": 37, 312 | "type": "SaveImage", 313 | "pos": [ 314 | -4238.7958984375, 315 | -422.50244140625 316 | ], 317 | "size": [ 318 | 732.0910034179688, 319 | 802.4579467773438 320 | ], 321 | "flags": {}, 322 | "order": 8, 323 | "mode": 0, 324 | "inputs": [ 325 | { 326 | "name": "images", 327 | "type": "IMAGE", 328 | "link": 38 329 | } 330 | ], 331 | "outputs": [], 332 | "properties": { 333 | "cnr_id": "comfy-core", 334 | "ver": "0.3.51" 335 | }, 336 | "widgets_values": [ 337 | "ComfyUI" 338 | ] 339 | } 340 | ], 341 | "links": [ 342 | [ 343 | 34, 344 | 29, 345 | 0, 346 | 31, 347 | 0, 348 | "IMAGE" 349 | ], 350 | [ 351 | 35, 352 | 34, 353 | 0, 354 | 35, 355 | 0, 356 | "IMAGE" 357 | ], 358 | [ 359 | 36, 360 | 36, 361 | 0, 362 | 35, 363 | 1, 364 | "IMAGE" 365 | ], 366 | [ 367 | 37, 368 | 35, 369 | 0, 370 | 33, 371 | 0, 372 | "IMAGE" 373 | ], 374 | [ 375 | 38, 376 | 33, 377 | 0, 378 | 37, 379 | 0, 380 | "IMAGE" 381 | ], 382 | [ 383 | 39, 384 | 31, 385 | 0, 386 | 38, 387 | 0, 388 | "IMAGE" 389 | ] 390 | ], 391 | "groups": [ 392 | { 393 | "id": 1, 394 | "title": "单图输入", 395 | "bounding": [ 396 | -5266.33935546875, 397 | -1242.972412109375, 398 | 1181.684814453125, 399 | 708.481201171875 400 | ], 401 | "color": "#3f789e", 402 | "font_size": 24, 403 | "flags": {} 404 | }, 405 | { 406 | "id": 2, 407 | "title": "多图组合输入", 408 | "bounding": [ 409 | -5263.26318359375, 410 | -516.9620361328125, 411 | 1780.517822265625, 412 | 922.61181640625 413 | ], 414 | "color": "#a1309b", 415 | "font_size": 24, 416 | "flags": {} 417 | } 418 | ], 419 | "config": {}, 420 | "extra": { 421 | "ds": { 422 | "scale": 0.6303940863128816, 423 | "offset": [ 424 | 5837.721776744542, 425 | 1230.9888460166862 426 | ] 427 | }, 428 | "frontendVersion": "1.25.9" 429 | }, 430 | "version": 0.4 431 | } -------------------------------------------------------------------------------- /workflow/图片翻译.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ae9ebba6-18df-4409-b3f0-f6ed03037d9c", 3 | "revision": 0, 4 | "last_node_id": 28, 5 | "last_link_id": 19, 6 | "nodes": [ 7 | { 8 | "id": 26, 9 | "type": "ImageTranslateNode", 10 | "pos": [ 11 | 386.8037414550781, 12 | 569.7688598632812 13 | ], 14 | "size": [ 15 | 270, 16 | 154 17 | ], 18 | "flags": {}, 19 | "order": 2, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "image_input", 24 | "type": "IMAGE", 25 | "link": 19 26 | } 27 | ], 28 | "outputs": [ 29 | { 30 | "name": "output", 31 | "type": "IMAGE", 32 | "links": [ 33 | 18 34 | ] 35 | } 36 | ], 37 | "properties": { 38 | "cnr_id": "Mojie-API-Party", 39 | "ver": "777aab1921a675b8bcdcfc0dcee15ddb86b71491", 40 | "Node name for S&R": "ImageTranslateNode" 41 | }, 42 | "widgets_values": [ 43 | "default", 44 | "自动", 45 | "英语", 46 | 1833, 47 | "randomize" 48 | ] 49 | }, 50 | { 51 | "id": 23, 52 | "type": "LoadImage", 53 | "pos": [ 54 | 94.14804077148438, 55 | 564.169921875 56 | ], 57 | "size": [ 58 | 270, 59 | 314.0000305175781 60 | ], 61 | "flags": {}, 62 | "order": 0, 63 | "mode": 0, 64 | "inputs": [], 65 | "outputs": [ 66 | { 67 | "name": "IMAGE", 68 | "type": "IMAGE", 69 | "links": [ 70 | 19 71 | ] 72 | }, 73 | { 74 | "name": "MASK", 75 | "type": "MASK", 76 | "links": null 77 | } 78 | ], 79 | "properties": { 80 | "cnr_id": "comfy-core", 81 | "ver": "0.3.51", 82 | "Node name for S&R": "LoadImage" 83 | }, 84 | "widgets_values": [ 85 | "f3d9b086-c746-4160-8d0c-775f767b1f72.png", 86 | "image" 87 | ] 88 | }, 89 | { 90 | "id": 27, 91 | "type": "PreviewImage", 92 | "pos": [ 93 | 675.8037719726562, 94 | 567.7688598632812 95 | ], 96 | "size": [ 97 | 444, 98 | 338 99 | ], 100 | "flags": {}, 101 | "order": 3, 102 | "mode": 0, 103 | "inputs": [ 104 | { 105 | "name": "images", 106 | "type": "IMAGE", 107 | "link": 18 108 | } 109 | ], 110 | "outputs": [], 111 | "properties": { 112 | "cnr_id": "comfy-core", 113 | "ver": "0.3.51", 114 | "Node name for S&R": "PreviewImage" 115 | }, 116 | "widgets_values": [] 117 | }, 118 | { 119 | "id": 28, 120 | "type": "MarkdownNote", 121 | "pos": [ 122 | -287.3780822753906, 123 | 551.0415649414062 124 | ], 125 | "size": [ 126 | 317.2727355957031, 127 | 394.5454406738281 128 | ], 129 | "flags": {}, 130 | "order": 1, 131 | "mode": 0, 132 | "inputs": [], 133 | "outputs": [], 134 | "properties": {}, 135 | "widgets_values": [ 136 | "### 图片翻译使用说明\nsourcelang 是源语言,就是你上传的图片本身的语言。\n\nTargetlang 是目标语言,就是将图片需要翻译的语言。\n\nmodelid 一般选择默认,是覆盖模式,会将源语言擦除掉之后将翻译过后的新文字印在上面,效果更好。" 137 | ], 138 | "color": "#432", 139 | "bgcolor": "#653" 140 | } 141 | ], 142 | "links": [ 143 | [ 144 | 18, 145 | 26, 146 | 0, 147 | 27, 148 | 0, 149 | "IMAGE" 150 | ], 151 | [ 152 | 19, 153 | 23, 154 | 0, 155 | 26, 156 | 0, 157 | "IMAGE" 158 | ] 159 | ], 160 | "groups": [], 161 | "config": {}, 162 | "extra": { 163 | "ds": { 164 | "scale": 1.1, 165 | "offset": [ 166 | 387.3780651400036, 167 | -333.7688669019324 168 | ] 169 | }, 170 | "frontendVersion": "1.25.9" 171 | }, 172 | "version": 0.4 173 | } -------------------------------------------------------------------------------- /workflow/图片高清放大.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f607b0cd-2397-48b1-8b80-3bb3024aacfa", 3 | "revision": 0, 4 | "last_node_id": 4, 5 | "last_link_id": 2, 6 | "nodes": [ 7 | { 8 | "id": 2, 9 | "type": "LoadImage", 10 | "pos": [ 11 | -78.10535430908203, 12 | 597.4962768554688 13 | ], 14 | "size": [ 15 | 270, 16 | 314 17 | ], 18 | "flags": {}, 19 | "order": 0, 20 | "mode": 0, 21 | "inputs": [], 22 | "outputs": [ 23 | { 24 | "name": "IMAGE", 25 | "type": "IMAGE", 26 | "links": [ 27 | 1 28 | ] 29 | }, 30 | { 31 | "name": "MASK", 32 | "type": "MASK", 33 | "links": null 34 | } 35 | ], 36 | "properties": { 37 | "cnr_id": "comfy-core", 38 | "ver": "0.3.51", 39 | "Node name for S&R": "LoadImage" 40 | }, 41 | "widgets_values": [ 42 | "MojieAPI_00098_.png", 43 | "image" 44 | ] 45 | }, 46 | { 47 | "id": 4, 48 | "type": "MarkdownNote", 49 | "pos": [ 50 | -368.3532409667969, 51 | 602.1238403320312 52 | ], 53 | "size": [ 54 | 249.25621032714844, 55 | 441.23968505859375 56 | ], 57 | "flags": {}, 58 | "order": 1, 59 | "mode": 0, 60 | "inputs": [], 61 | "outputs": [], 62 | "properties": {}, 63 | "widgets_values": [ 64 | "### 高清放大节点使用说明\n最高可以将图片放大6倍,并且细节保留非常好,图片不失真。速度很快。\n\nmulitple 是放大倍数。\n\n输入图片最大请不要超过2048px。\n输出图片最大不会超过10240px。" 65 | ], 66 | "color": "#432", 67 | "bgcolor": "#653" 68 | }, 69 | { 70 | "id": 1, 71 | "type": "ImageUpscaleNode", 72 | "pos": [ 73 | 214.70455932617188, 74 | 602.3723754882812 75 | ], 76 | "size": [ 77 | 270, 78 | 106 79 | ], 80 | "flags": {}, 81 | "order": 2, 82 | "mode": 0, 83 | "inputs": [ 84 | { 85 | "name": "image_input", 86 | "type": "IMAGE", 87 | "link": 1 88 | } 89 | ], 90 | "outputs": [ 91 | { 92 | "name": "output", 93 | "type": "IMAGE", 94 | "links": [ 95 | 2 96 | ] 97 | } 98 | ], 99 | "properties": { 100 | "cnr_id": "Mojie-API-Party", 101 | "ver": "777aab1921a675b8bcdcfc0dcee15ddb86b71491", 102 | "Node name for S&R": "ImageUpscaleNode" 103 | }, 104 | "widgets_values": [ 105 | 1243, 106 | "randomize", 107 | "x4" 108 | ] 109 | }, 110 | { 111 | "id": 3, 112 | "type": "SaveImage", 113 | "pos": [ 114 | 510.07635498046875, 115 | 605.3471069335938 116 | ], 117 | "size": [ 118 | 503.6363525390625, 119 | 662.727294921875 120 | ], 121 | "flags": {}, 122 | "order": 3, 123 | "mode": 0, 124 | "inputs": [ 125 | { 126 | "name": "images", 127 | "type": "IMAGE", 128 | "link": 2 129 | } 130 | ], 131 | "outputs": [], 132 | "properties": { 133 | "cnr_id": "comfy-core", 134 | "ver": "0.3.51" 135 | }, 136 | "widgets_values": [ 137 | "ComfyUI" 138 | ] 139 | } 140 | ], 141 | "links": [ 142 | [ 143 | 1, 144 | 2, 145 | 0, 146 | 1, 147 | 0, 148 | "IMAGE" 149 | ], 150 | [ 151 | 2, 152 | 1, 153 | 0, 154 | 3, 155 | 0, 156 | "IMAGE" 157 | ] 158 | ], 159 | "groups": [], 160 | "config": {}, 161 | "extra": { 162 | "ds": { 163 | "scale": 1, 164 | "offset": [ 165 | 450.1909283889162, 166 | -487.1714275571551 167 | ] 168 | }, 169 | "frontendVersion": "1.25.9" 170 | }, 171 | "version": 0.4 172 | } -------------------------------------------------------------------------------- /workflow/服装模特生成(合集).json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "0a3b477c-f646-4993-b4fe-3370d260bbe9", 3 | "revision": 0, 4 | "last_node_id": 25, 5 | "last_link_id": 13, 6 | "nodes": [ 7 | { 8 | "id": 6, 9 | "type": "SaveImage", 10 | "pos": [ 11 | 821.43115234375, 12 | 222.91390991210938 13 | ], 14 | "size": [ 15 | 504.6189880371094, 16 | 811.2249755859375 17 | ], 18 | "flags": {}, 19 | "order": 14, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "images", 24 | "type": "IMAGE", 25 | "link": 4 26 | } 27 | ], 28 | "outputs": [], 29 | "properties": { 30 | "cnr_id": "comfy-core", 31 | "ver": "0.3.51" 32 | }, 33 | "widgets_values": [ 34 | "mojie-API" 35 | ] 36 | }, 37 | { 38 | "id": 4, 39 | "type": "LoadImage", 40 | "pos": [ 41 | 234.03355407714844, 42 | 704.7265625 43 | ], 44 | "size": [ 45 | 258, 46 | 326 47 | ], 48 | "flags": {}, 49 | "order": 0, 50 | "mode": 0, 51 | "inputs": [], 52 | "outputs": [ 53 | { 54 | "name": "IMAGE", 55 | "type": "IMAGE", 56 | "links": [ 57 | 2 58 | ] 59 | }, 60 | { 61 | "name": "MASK", 62 | "type": "MASK", 63 | "links": null 64 | } 65 | ], 66 | "properties": { 67 | "cnr_id": "comfy-core", 68 | "ver": "0.3.51", 69 | "Node name for S&R": "LoadImage" 70 | }, 71 | "widgets_values": [ 72 | "Asian (10).png", 73 | "image" 74 | ] 75 | }, 76 | { 77 | "id": 3, 78 | "type": "LoadImage", 79 | "pos": [ 80 | 229.8437042236328, 81 | 224.69346618652344 82 | ], 83 | "size": [ 84 | 270, 85 | 393.0909118652344 86 | ], 87 | "flags": {}, 88 | "order": 1, 89 | "mode": 0, 90 | "inputs": [], 91 | "outputs": [ 92 | { 93 | "name": "IMAGE", 94 | "type": "IMAGE", 95 | "links": [ 96 | 1 97 | ] 98 | }, 99 | { 100 | "name": "MASK", 101 | "type": "MASK", 102 | "links": null 103 | } 104 | ], 105 | "properties": { 106 | "cnr_id": "comfy-core", 107 | "ver": "0.3.51", 108 | "Node name for S&R": "LoadImage" 109 | }, 110 | "widgets_values": [ 111 | "O1CN01hPNJMY2DxfIZHPDEX_!!731648676 (1).jpg", 112 | "image" 113 | ] 114 | }, 115 | { 116 | "id": 10, 117 | "type": "SaveImage", 118 | "pos": [ 119 | 850.7461547851562, 120 | 1244.6373291015625 121 | ], 122 | "size": [ 123 | 431.051025390625, 124 | 547.8079833984375 125 | ], 126 | "flags": {}, 127 | "order": 15, 128 | "mode": 0, 129 | "inputs": [ 130 | { 131 | "name": "images", 132 | "type": "IMAGE", 133 | "link": 6 134 | } 135 | ], 136 | "outputs": [], 137 | "properties": { 138 | "cnr_id": "comfy-core", 139 | "ver": "0.3.51" 140 | }, 141 | "widgets_values": [ 142 | "ComfyUI" 143 | ] 144 | }, 145 | { 146 | "id": 9, 147 | "type": "LoadImage", 148 | "pos": [ 149 | 264.82855224609375, 150 | 1256.8677978515625 151 | ], 152 | "size": [ 153 | 270, 154 | 314 155 | ], 156 | "flags": {}, 157 | "order": 2, 158 | "mode": 0, 159 | "inputs": [], 160 | "outputs": [ 161 | { 162 | "name": "IMAGE", 163 | "type": "IMAGE", 164 | "links": [ 165 | 5 166 | ] 167 | }, 168 | { 169 | "name": "MASK", 170 | "type": "MASK", 171 | "links": null 172 | } 173 | ], 174 | "properties": { 175 | "cnr_id": "comfy-core", 176 | "ver": "0.3.51", 177 | "Node name for S&R": "LoadImage" 178 | }, 179 | "widgets_values": [ 180 | "mt (97).png", 181 | "image" 182 | ] 183 | }, 184 | { 185 | "id": 8, 186 | "type": "GetDressing", 187 | "pos": [ 188 | 559.4490356445312, 189 | 1253.061767578125 190 | ], 191 | "size": [ 192 | 270, 193 | 130 194 | ], 195 | "flags": {}, 196 | "order": 11, 197 | "mode": 0, 198 | "inputs": [ 199 | { 200 | "name": "image", 201 | "type": "IMAGE", 202 | "link": 5 203 | } 204 | ], 205 | "outputs": [ 206 | { 207 | "name": "output", 208 | "type": "IMAGE", 209 | "links": [ 210 | 6 211 | ] 212 | } 213 | ], 214 | "properties": { 215 | "cnr_id": "Mojie-API-Party", 216 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 217 | "Node name for S&R": "GetDressing" 218 | }, 219 | "widgets_values": [ 220 | "全身", 221 | "3:4", 222 | 516, 223 | "randomize" 224 | ] 225 | }, 226 | { 227 | "id": 13, 228 | "type": "MarkdownNote", 229 | "pos": [ 230 | -105.657958984375, 231 | 186.6623992919922 232 | ], 233 | "size": [ 234 | 276.3636474609375, 235 | 421.98345947265625 236 | ], 237 | "flags": {}, 238 | "order": 3, 239 | "mode": 0, 240 | "inputs": [], 241 | "outputs": [], 242 | "properties": {}, 243 | "widgets_values": [ 244 | "##### 服装模特生成说明\n- 左侧上传服装和上传人脸,在中间选择风格。即可生成该人物穿着这件服装的效果。当有人脸的时候,人种和性别不起作用。\n- 当需要随机脸的时候,把人脸框去掉,此时选择人种和性别还有服装即可生成。\n\n" 245 | ], 246 | "color": "#432", 247 | "bgcolor": "#653" 248 | }, 249 | { 250 | "id": 12, 251 | "type": "MarkdownNote", 252 | "pos": [ 253 | -99.88379669189453, 254 | 1196.800048828125 255 | ], 256 | "size": [ 257 | 276.3636474609375, 258 | 421.98345947265625 259 | ], 260 | "flags": {}, 261 | "order": 4, 262 | "mode": 0, 263 | "inputs": [], 264 | "outputs": [], 265 | "properties": {}, 266 | "widgets_values": [ 267 | "##### AI服装提取说明\n- 可以把任意人身上的,或者在人台模特上的服装提取成白底图。\n- extend_prompt选择提取区域,size选择提取的尺寸大小\n\n" 268 | ], 269 | "color": "#432", 270 | "bgcolor": "#653" 271 | }, 272 | { 273 | "id": 16, 274 | "type": "LoadImage", 275 | "pos": [ 276 | 1838.927734375, 277 | 1264.4677734375 278 | ], 279 | "size": [ 280 | 314, 281 | 513 282 | ], 283 | "flags": {}, 284 | "order": 5, 285 | "mode": 0, 286 | "inputs": [], 287 | "outputs": [ 288 | { 289 | "name": "IMAGE", 290 | "type": "IMAGE", 291 | "links": [ 292 | 7 293 | ] 294 | }, 295 | { 296 | "name": "MASK", 297 | "type": "MASK", 298 | "links": null 299 | } 300 | ], 301 | "properties": { 302 | "cnr_id": "comfy-core", 303 | "ver": "0.3.51", 304 | "Node name for S&R": "LoadImage" 305 | }, 306 | "widgets_values": [ 307 | "mojie-API_00001_.png", 308 | "image" 309 | ] 310 | }, 311 | { 312 | "id": 15, 313 | "type": "MoterPoseNode", 314 | "pos": [ 315 | 2185.5830078125, 316 | 1264.284912109375 317 | ], 318 | "size": [ 319 | 270, 320 | 130 321 | ], 322 | "flags": {}, 323 | "order": 12, 324 | "mode": 0, 325 | "inputs": [ 326 | { 327 | "name": "image_input", 328 | "type": "IMAGE", 329 | "link": 7 330 | } 331 | ], 332 | "outputs": [ 333 | { 334 | "name": "output", 335 | "type": "IMAGE", 336 | "links": [ 337 | 8 338 | ] 339 | } 340 | ], 341 | "properties": { 342 | "cnr_id": "Mojie-API-Party", 343 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 344 | "Node name for S&R": "MoterPoseNode" 345 | }, 346 | "widgets_values": [ 347 | true, 348 | 1, 349 | 487, 350 | "randomize" 351 | ] 352 | }, 353 | { 354 | "id": 17, 355 | "type": "PreviewImage", 356 | "pos": [ 357 | 2482.0185546875, 358 | 1269.6495361328125 359 | ], 360 | "size": [ 361 | 368, 362 | 495 363 | ], 364 | "flags": {}, 365 | "order": 16, 366 | "mode": 0, 367 | "inputs": [ 368 | { 369 | "name": "images", 370 | "type": "IMAGE", 371 | "link": 8 372 | } 373 | ], 374 | "outputs": [], 375 | "properties": { 376 | "cnr_id": "comfy-core", 377 | "ver": "0.3.51", 378 | "Node name for S&R": "PreviewImage" 379 | }, 380 | "widgets_values": [] 381 | }, 382 | { 383 | "id": 24, 384 | "type": "SaveImage", 385 | "pos": [ 386 | 2442.644775390625, 387 | 272.31024169921875 388 | ], 389 | "size": [ 390 | 481.8710021972656, 391 | 760.2839965820312 392 | ], 393 | "flags": {}, 394 | "order": 17, 395 | "mode": 0, 396 | "inputs": [ 397 | { 398 | "name": "images", 399 | "type": "IMAGE", 400 | "link": 13 401 | } 402 | ], 403 | "outputs": [], 404 | "properties": { 405 | "cnr_id": "comfy-core", 406 | "ver": "0.3.51" 407 | }, 408 | "widgets_values": [ 409 | "ComfyUI" 410 | ] 411 | }, 412 | { 413 | "id": 19, 414 | "type": "LoadImage", 415 | "pos": [ 416 | 1832.5687255859375, 417 | 255.1504669189453 418 | ], 419 | "size": [ 420 | 287.3030090332031, 421 | 340.6199951171875 422 | ], 423 | "flags": {}, 424 | "order": 6, 425 | "mode": 0, 426 | "inputs": [], 427 | "outputs": [ 428 | { 429 | "name": "IMAGE", 430 | "type": "IMAGE", 431 | "links": [ 432 | 9 433 | ] 434 | }, 435 | { 436 | "name": "MASK", 437 | "type": "MASK", 438 | "links": null 439 | } 440 | ], 441 | "properties": { 442 | "cnr_id": "comfy-core", 443 | "ver": "0.3.51", 444 | "Node name for S&R": "LoadImage" 445 | }, 446 | "widgets_values": [ 447 | "fz (113).png", 448 | "image" 449 | ] 450 | }, 451 | { 452 | "id": 20, 453 | "type": "LoadImage", 454 | "pos": [ 455 | 1837.27978515625, 456 | 641.9788208007812 457 | ], 458 | "size": [ 459 | 289.9649963378906, 460 | 427.135009765625 461 | ], 462 | "flags": {}, 463 | "order": 7, 464 | "mode": 0, 465 | "inputs": [], 466 | "outputs": [ 467 | { 468 | "name": "IMAGE", 469 | "type": "IMAGE", 470 | "links": [ 471 | 10 472 | ] 473 | }, 474 | { 475 | "name": "MASK", 476 | "type": "MASK", 477 | "links": null 478 | } 479 | ], 480 | "properties": { 481 | "cnr_id": "comfy-core", 482 | "ver": "0.3.51", 483 | "Node name for S&R": "LoadImage" 484 | }, 485 | "widgets_values": [ 486 | "mt (300).png", 487 | "image" 488 | ] 489 | }, 490 | { 491 | "id": 14, 492 | "type": "MarkdownNote", 493 | "pos": [ 494 | 1497.03271484375, 495 | 1216.5877685546875 496 | ], 497 | "size": [ 498 | 276.3636474609375, 499 | 421.98345947265625 500 | ], 501 | "flags": {}, 502 | "order": 8, 503 | "mode": 0, 504 | "inputs": [], 505 | "outputs": [], 506 | "properties": {}, 507 | "widgets_values": [ 508 | "##### 模特姿势更改\n- 更改任意服装模特的姿势,动作。\n- 姿势动作是经过AI重新评估的,随机生成,避免重复。\n\n" 509 | ], 510 | "color": "#432", 511 | "bgcolor": "#653" 512 | }, 513 | { 514 | "id": 22, 515 | "type": "MarkdownNote", 516 | "pos": [ 517 | 1504.9609375, 518 | 206.96632385253906 519 | ], 520 | "size": [ 521 | 276.3636474609375, 522 | 421.98345947265625 523 | ], 524 | "flags": {}, 525 | "order": 9, 526 | "mode": 0, 527 | "inputs": [], 528 | "outputs": [], 529 | "properties": {}, 530 | "widgets_values": [ 531 | "##### 同款服装替换说明\n- 将任意衣服替换到任意模特上\n- 推荐只替换大致相同的同款式服装,款式差别太大容易替换失败。" 532 | ], 533 | "color": "#432", 534 | "bgcolor": "#653" 535 | }, 536 | { 537 | "id": 2, 538 | "type": "ModelGenNode", 539 | "pos": [ 540 | 536.0947265625, 541 | 231.709228515625 542 | ], 543 | "size": [ 544 | 270, 545 | 174 546 | ], 547 | "flags": {}, 548 | "order": 10, 549 | "mode": 0, 550 | "inputs": [ 551 | { 552 | "name": "cloths_image", 553 | "type": "IMAGE", 554 | "link": 1 555 | }, 556 | { 557 | "name": "face_image", 558 | "shape": 7, 559 | "type": "IMAGE", 560 | "link": 2 561 | } 562 | ], 563 | "outputs": [ 564 | { 565 | "name": "output", 566 | "type": "IMAGE", 567 | "links": [ 568 | 4 569 | ] 570 | } 571 | ], 572 | "properties": { 573 | "cnr_id": "Mojie-API-Party", 574 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 575 | "Node name for S&R": "ModelGenNode" 576 | }, 577 | "widgets_values": [ 578 | "亚裔", 579 | "woman", 580 | "通用-INS自拍", 581 | 396, 582 | "randomize" 583 | ] 584 | }, 585 | { 586 | "id": 18, 587 | "type": "ReplaceClothesNode", 588 | "pos": [ 589 | 2152.884521484375, 590 | 260.51910400390625 591 | ], 592 | "size": [ 593 | 270, 594 | 102 595 | ], 596 | "flags": {}, 597 | "order": 13, 598 | "mode": 0, 599 | "inputs": [ 600 | { 601 | "name": "cloths_image", 602 | "type": "IMAGE", 603 | "link": 9 604 | }, 605 | { 606 | "name": "model_image", 607 | "type": "IMAGE", 608 | "link": 10 609 | } 610 | ], 611 | "outputs": [ 612 | { 613 | "name": "output", 614 | "type": "IMAGE", 615 | "links": [ 616 | 13 617 | ] 618 | } 619 | ], 620 | "properties": { 621 | "cnr_id": "Mojie-API-Party", 622 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 623 | "Node name for S&R": "ReplaceClothesNode" 624 | }, 625 | "widgets_values": [ 626 | 379, 627 | "randomize" 628 | ] 629 | } 630 | ], 631 | "links": [ 632 | [ 633 | 1, 634 | 3, 635 | 0, 636 | 2, 637 | 0, 638 | "IMAGE" 639 | ], 640 | [ 641 | 2, 642 | 4, 643 | 0, 644 | 2, 645 | 1, 646 | "IMAGE" 647 | ], 648 | [ 649 | 4, 650 | 2, 651 | 0, 652 | 6, 653 | 0, 654 | "IMAGE" 655 | ], 656 | [ 657 | 5, 658 | 9, 659 | 0, 660 | 8, 661 | 0, 662 | "IMAGE" 663 | ], 664 | [ 665 | 6, 666 | 8, 667 | 0, 668 | 10, 669 | 0, 670 | "IMAGE" 671 | ], 672 | [ 673 | 7, 674 | 16, 675 | 0, 676 | 15, 677 | 0, 678 | "IMAGE" 679 | ], 680 | [ 681 | 8, 682 | 15, 683 | 0, 684 | 17, 685 | 0, 686 | "IMAGE" 687 | ], 688 | [ 689 | 9, 690 | 19, 691 | 0, 692 | 18, 693 | 0, 694 | "IMAGE" 695 | ], 696 | [ 697 | 10, 698 | 20, 699 | 0, 700 | 18, 701 | 1, 702 | "IMAGE" 703 | ], 704 | [ 705 | 13, 706 | 18, 707 | 0, 708 | 24, 709 | 0, 710 | "IMAGE" 711 | ] 712 | ], 713 | "groups": [ 714 | { 715 | "id": 1, 716 | "title": "上传人脸", 717 | "bounding": [ 718 | 220.0405731201172, 719 | 628.464599609375, 720 | 289.97900390625, 721 | 420.2480773925781 722 | ], 723 | "color": "#a1309b", 724 | "font_size": 24, 725 | "flags": { 726 | "pinned": true 727 | } 728 | }, 729 | { 730 | "id": 2, 731 | "title": "上传服装", 732 | "bounding": [ 733 | 219.8437042236328, 734 | 151.0934600830078, 735 | 286.3636474609375, 736 | 471.2363586425781 737 | ], 738 | "color": "#8A8", 739 | "font_size": 24, 740 | "flags": { 741 | "pinned": true 742 | } 743 | }, 744 | { 745 | "id": 3, 746 | "title": "服装模特生成", 747 | "bounding": [ 748 | 515.7608642578125, 749 | 151.0319366455078, 750 | 817.72998046875, 751 | 904.780029296875 752 | ], 753 | "color": "#3f789e", 754 | "font_size": 24, 755 | "flags": { 756 | "pinned": true 757 | } 758 | }, 759 | { 760 | "id": 4, 761 | "title": "服装提取", 762 | "bounding": [ 763 | 224.49420166015625, 764 | 1167.1300048828125, 765 | 1105.5799560546875, 766 | 637.8099975585938 767 | ], 768 | "color": "#3f789e", 769 | "font_size": 24, 770 | "flags": {} 771 | }, 772 | { 773 | "id": 5, 774 | "title": "模特姿势更改", 775 | "bounding": [ 776 | 1808.1695556640625, 777 | 1181.0601806640625, 778 | 1062.593017578125, 779 | 632.7169799804688 780 | ], 781 | "color": "#3f789e", 782 | "font_size": 24, 783 | "flags": {} 784 | }, 785 | { 786 | "id": 6, 787 | "title": "同款服装替换", 788 | "bounding": [ 789 | 1804.6436767578125, 790 | 173.20899963378906, 791 | 1135.5400390625, 792 | 920.1331176757812 793 | ], 794 | "color": "#3f789e", 795 | "font_size": 24, 796 | "flags": {} 797 | } 798 | ], 799 | "config": {}, 800 | "extra": { 801 | "ds": { 802 | "scale": 1.1, 803 | "offset": [ 804 | 194.49309691832187, 805 | -132.32053702967104 806 | ] 807 | }, 808 | "frontendVersion": "1.25.9" 809 | }, 810 | "version": 0.4 811 | } -------------------------------------------------------------------------------- /workflow/服装模特生成(生成组图).json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "7e183e28-641d-4c45-b141-ac68b51e2ae0", 3 | "revision": 0, 4 | "last_node_id": 31, 5 | "last_link_id": 22, 6 | "nodes": [ 7 | { 8 | "id": 3, 9 | "type": "LoadImage", 10 | "pos": [ 11 | 229.8437042236328, 12 | 224.69346618652344 13 | ], 14 | "size": [ 15 | 270, 16 | 393.0909118652344 17 | ], 18 | "flags": {}, 19 | "order": 0, 20 | "mode": 0, 21 | "inputs": [], 22 | "outputs": [ 23 | { 24 | "name": "IMAGE", 25 | "type": "IMAGE", 26 | "links": [ 27 | 1 28 | ] 29 | }, 30 | { 31 | "name": "MASK", 32 | "type": "MASK", 33 | "links": null 34 | } 35 | ], 36 | "properties": { 37 | "cnr_id": "comfy-core", 38 | "ver": "0.3.51", 39 | "Node name for S&R": "LoadImage" 40 | }, 41 | "widgets_values": [ 42 | "fz (88).jpg", 43 | "image" 44 | ] 45 | }, 46 | { 47 | "id": 6, 48 | "type": "SaveImage", 49 | "pos": [ 50 | 569.356201171875, 51 | 476.65899658203125 52 | ], 53 | "size": [ 54 | 576.3162841796875, 55 | 797.1055297851562 56 | ], 57 | "flags": {}, 58 | "order": 4, 59 | "mode": 0, 60 | "inputs": [ 61 | { 62 | "name": "images", 63 | "type": "IMAGE", 64 | "link": 4 65 | } 66 | ], 67 | "outputs": [], 68 | "properties": { 69 | "cnr_id": "comfy-core", 70 | "ver": "0.3.51" 71 | }, 72 | "widgets_values": [ 73 | "mojie-API" 74 | ] 75 | }, 76 | { 77 | "id": 26, 78 | "type": "SaveImage", 79 | "pos": [ 80 | 1192.3756103515625, 81 | 482.5464172363281 82 | ], 83 | "size": [ 84 | 604.986083984375, 85 | 794.0030517578125 86 | ], 87 | "flags": {}, 88 | "order": 8, 89 | "mode": 0, 90 | "inputs": [ 91 | { 92 | "name": "images", 93 | "type": "IMAGE", 94 | "link": 17 95 | } 96 | ], 97 | "outputs": [], 98 | "properties": { 99 | "cnr_id": "comfy-core", 100 | "ver": "0.3.51" 101 | }, 102 | "widgets_values": [ 103 | "ComfyUI" 104 | ] 105 | }, 106 | { 107 | "id": 15, 108 | "type": "MoterPoseNode", 109 | "pos": [ 110 | 1228.786865234375, 111 | 240.5798797607422 112 | ], 113 | "size": [ 114 | 270, 115 | 130 116 | ], 117 | "flags": {}, 118 | "order": 5, 119 | "mode": 0, 120 | "inputs": [ 121 | { 122 | "name": "image_input", 123 | "type": "IMAGE", 124 | "link": 15 125 | } 126 | ], 127 | "outputs": [ 128 | { 129 | "name": "output", 130 | "type": "IMAGE", 131 | "links": [ 132 | 17 133 | ] 134 | } 135 | ], 136 | "properties": { 137 | "cnr_id": "Mojie-API-Party", 138 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 139 | "Node name for S&R": "MoterPoseNode" 140 | }, 141 | "widgets_values": [ 142 | true, 143 | 1, 144 | 1116, 145 | "randomize" 146 | ] 147 | }, 148 | { 149 | "id": 27, 150 | "type": "MoterPoseNode", 151 | "pos": [ 152 | 1904.62841796875, 153 | 241.63043212890625 154 | ], 155 | "size": [ 156 | 270, 157 | 130 158 | ], 159 | "flags": {}, 160 | "order": 6, 161 | "mode": 0, 162 | "inputs": [ 163 | { 164 | "name": "image_input", 165 | "type": "IMAGE", 166 | "link": 18 167 | } 168 | ], 169 | "outputs": [ 170 | { 171 | "name": "output", 172 | "type": "IMAGE", 173 | "links": [ 174 | 22 175 | ] 176 | } 177 | ], 178 | "properties": { 179 | "cnr_id": "Mojie-API-Party", 180 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 181 | "Node name for S&R": "MoterPoseNode" 182 | }, 183 | "widgets_values": [ 184 | true, 185 | 1, 186 | 1048, 187 | "randomize" 188 | ] 189 | }, 190 | { 191 | "id": 29, 192 | "type": "MoterPoseNode", 193 | "pos": [ 194 | 2423.2080078125, 195 | 238.8440704345703 196 | ], 197 | "size": [ 198 | 270, 199 | 130 200 | ], 201 | "flags": {}, 202 | "order": 7, 203 | "mode": 0, 204 | "inputs": [ 205 | { 206 | "name": "image_input", 207 | "type": "IMAGE", 208 | "link": 20 209 | } 210 | ], 211 | "outputs": [ 212 | { 213 | "name": "output", 214 | "type": "IMAGE", 215 | "links": [ 216 | 21 217 | ] 218 | } 219 | ], 220 | "properties": { 221 | "cnr_id": "Mojie-API-Party", 222 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 223 | "Node name for S&R": "MoterPoseNode" 224 | }, 225 | "widgets_values": [ 226 | true, 227 | 1, 228 | 1866, 229 | "randomize" 230 | ] 231 | }, 232 | { 233 | "id": 31, 234 | "type": "SaveImage", 235 | "pos": [ 236 | 1834.437744140625, 237 | 489.2027893066406 238 | ], 239 | "size": [ 240 | 561.5023193359375, 241 | 787.56103515625 242 | ], 243 | "flags": {}, 244 | "order": 9, 245 | "mode": 0, 246 | "inputs": [ 247 | { 248 | "name": "images", 249 | "type": "IMAGE", 250 | "link": 22 251 | } 252 | ], 253 | "outputs": [], 254 | "properties": { 255 | "cnr_id": "comfy-core", 256 | "ver": "0.3.51" 257 | }, 258 | "widgets_values": [ 259 | "ComfyUI" 260 | ] 261 | }, 262 | { 263 | "id": 30, 264 | "type": "SaveImage", 265 | "pos": [ 266 | 2440.73095703125, 267 | 486.9068908691406 268 | ], 269 | "size": [ 270 | 597.9583740234375, 271 | 790.7820434570312 272 | ], 273 | "flags": {}, 274 | "order": 10, 275 | "mode": 0, 276 | "inputs": [ 277 | { 278 | "name": "images", 279 | "type": "IMAGE", 280 | "link": 21 281 | } 282 | ], 283 | "outputs": [], 284 | "properties": { 285 | "cnr_id": "comfy-core", 286 | "ver": "0.3.51" 287 | }, 288 | "widgets_values": [ 289 | "ComfyUI" 290 | ] 291 | }, 292 | { 293 | "id": 13, 294 | "type": "MarkdownNote", 295 | "pos": [ 296 | -105.657958984375, 297 | 186.6623992919922 298 | ], 299 | "size": [ 300 | 276.3636474609375, 301 | 421.98345947265625 302 | ], 303 | "flags": {}, 304 | "order": 1, 305 | "mode": 0, 306 | "inputs": [], 307 | "outputs": [], 308 | "properties": {}, 309 | "widgets_values": [ 310 | "##### 服装模特生成(组图)\n- 左侧上传服装和人脸。\n- 生成第一张后会根据图片修改人物姿势形成组图。\n\n" 311 | ], 312 | "color": "#432", 313 | "bgcolor": "#653" 314 | }, 315 | { 316 | "id": 4, 317 | "type": "LoadImage", 318 | "pos": [ 319 | 216.3179473876953, 320 | 704.7265625 321 | ], 322 | "size": [ 323 | 286.344970703125, 324 | 326 325 | ], 326 | "flags": {}, 327 | "order": 2, 328 | "mode": 0, 329 | "inputs": [], 330 | "outputs": [ 331 | { 332 | "name": "IMAGE", 333 | "type": "IMAGE", 334 | "links": [ 335 | 2 336 | ] 337 | }, 338 | { 339 | "name": "MASK", 340 | "type": "MASK", 341 | "links": null 342 | } 343 | ], 344 | "properties": { 345 | "cnr_id": "comfy-core", 346 | "ver": "0.3.51", 347 | "Node name for S&R": "LoadImage" 348 | }, 349 | "widgets_values": [ 350 | "Asian (10).png", 351 | "image" 352 | ] 353 | }, 354 | { 355 | "id": 2, 356 | "type": "ModelGenNode", 357 | "pos": [ 358 | 539.6621704101562, 359 | 223.85621643066406 360 | ], 361 | "size": [ 362 | 270, 363 | 174 364 | ], 365 | "flags": {}, 366 | "order": 3, 367 | "mode": 0, 368 | "inputs": [ 369 | { 370 | "name": "cloths_image", 371 | "type": "IMAGE", 372 | "link": 1 373 | }, 374 | { 375 | "name": "face_image", 376 | "shape": 7, 377 | "type": "IMAGE", 378 | "link": 2 379 | } 380 | ], 381 | "outputs": [ 382 | { 383 | "name": "output", 384 | "type": "IMAGE", 385 | "links": [ 386 | 4, 387 | 15, 388 | 18, 389 | 20 390 | ] 391 | } 392 | ], 393 | "properties": { 394 | "cnr_id": "Mojie-API-Party", 395 | "ver": "5f88d79db064fced6dce5b6dafb42aa836b81c60", 396 | "Node name for S&R": "ModelGenNode" 397 | }, 398 | "widgets_values": [ 399 | "亚裔", 400 | "woman", 401 | "清新室内风", 402 | 775, 403 | "randomize" 404 | ] 405 | } 406 | ], 407 | "links": [ 408 | [ 409 | 1, 410 | 3, 411 | 0, 412 | 2, 413 | 0, 414 | "IMAGE" 415 | ], 416 | [ 417 | 2, 418 | 4, 419 | 0, 420 | 2, 421 | 1, 422 | "IMAGE" 423 | ], 424 | [ 425 | 4, 426 | 2, 427 | 0, 428 | 6, 429 | 0, 430 | "IMAGE" 431 | ], 432 | [ 433 | 15, 434 | 2, 435 | 0, 436 | 15, 437 | 0, 438 | "IMAGE" 439 | ], 440 | [ 441 | 17, 442 | 15, 443 | 0, 444 | 26, 445 | 0, 446 | "IMAGE" 447 | ], 448 | [ 449 | 18, 450 | 2, 451 | 0, 452 | 27, 453 | 0, 454 | "IMAGE" 455 | ], 456 | [ 457 | 20, 458 | 2, 459 | 0, 460 | 29, 461 | 0, 462 | "IMAGE" 463 | ], 464 | [ 465 | 21, 466 | 29, 467 | 0, 468 | 30, 469 | 0, 470 | "IMAGE" 471 | ], 472 | [ 473 | 22, 474 | 27, 475 | 0, 476 | 31, 477 | 0, 478 | "IMAGE" 479 | ] 480 | ], 481 | "groups": [ 482 | { 483 | "id": 1, 484 | "title": "上传人脸", 485 | "bounding": [ 486 | 220.0405731201172, 487 | 628.464599609375, 488 | 289.97900390625, 489 | 420.2480773925781 490 | ], 491 | "color": "#a1309b", 492 | "font_size": 24, 493 | "flags": { 494 | "pinned": true 495 | } 496 | }, 497 | { 498 | "id": 2, 499 | "title": "上传服装", 500 | "bounding": [ 501 | 219.8437042236328, 502 | 151.0934600830078, 503 | 286.3636474609375, 504 | 471.2363586425781 505 | ], 506 | "color": "#8A8", 507 | "font_size": 24, 508 | "flags": { 509 | "pinned": true 510 | } 511 | }, 512 | { 513 | "id": 3, 514 | "title": "服装模特生成", 515 | "bounding": [ 516 | 529.6621704101562, 517 | 150.25621032714844, 518 | 2519.02734375, 519 | 1137.4327392578125 520 | ], 521 | "color": "#3f789e", 522 | "font_size": 24, 523 | "flags": {} 524 | } 525 | ], 526 | "config": {}, 527 | "extra": { 528 | "ds": { 529 | "scale": 0.5644739300537776, 530 | "offset": [ 531 | 87.39248180534989, 532 | 4.0531302245717615 533 | ] 534 | }, 535 | "frontendVersion": "1.25.9" 536 | }, 537 | "version": 0.4 538 | } --------------------------------------------------------------------------------