简介:面向 ComfyUI 与 QwenImageEdit 用户的多角度剧情分镜图生图工作流,适合需要批量生成连贯剧情分镜画面的创作者、AIGC 爱好者及 ComfyUI 进阶学习者。资源包内共 1 个文件,为可直接导入的 JSON 工作流文件,约 12KB,通过节点化配置将 QwenImageEdit 的图像编辑能力与多角度分镜需求结合,省去手动搭建复杂节点流程的繁琐步骤。目前已有 595 人学习浏览。导入后即可查看完整节点连接与参数设置,可在此基础上调整镜头角度、角色一致性及画幅构图,快速产出多角度剧情分镜图;同时可结合描述中提供的 CSDN 配套教程与开源项目文档,理解底层 Tauri+Django 调用逻辑,便于二次开发或迁移到自己的 ComfyUI 环境中,对提升图生图流程效率与分镜创作质量有明显帮助。
1. ComfyUI 里做多角度剧情分镜:这份 QwenImageEdit 工作流文件能干什么
画完主视图再拿 ControlNet 重绘换机位,角色变形、背景穿帮是常态。如果你在 ComfyUI 里做剧情分镜也卡在这一步,这份 QwenImageEdit 多角度剧情分镜图生图工作流(c0144.json)值得往下看:它走指令式编辑路线,输入「侧面平视」「低角度仰拍」这类自然语言,模型直接在原图上重绘出新机位,角色身份和画面风格保持住,不用手动抠线稿、描深度图。
资源本体是一个可直接导入 ComfyUI 的 JSON 工作流,运行依赖 QwenImageEdit 插件与模型权重,解决的是分镜里最耗时的「换机位不换角色」。适合漫画分镜作者、短剧脚本可视化、独立游戏概念设计,以及需要批量出分镜的插画团队。新手能照下文跑通第一组分镜,熟手能改模板和采样参数接进批处理。后文的环境准备与避坑排查,是我跑这类工作流踩过之后的整理。
2. 为什么要用 QwenImageEdit 做分镜:模型选型与 ComfyUI 环境准备
2.1 指令式编辑和 ControlNet 重绘的本质区别
先讲传统路线的边界。ControlNet 加 img2img 是结构控制:用 depth、lineart、pose 这类条件图锁住构图,prompt 只负责风格和内容。这套组合做局部重绘、换风格非常稳,但一旦要换机位就露馅——机位变了意味着构图信息全变了,你得先为每一个新视角重新生成一张符合透视关系的条件图。放到分镜流程里,这一步基本等于重画,省下的时间全搭回条件图制作上。所以传统 ComfyUI 换机位工作流的痛点不在采样,在「新角度的条件图谁来做」。
QwenImageEdit 换了一个范式。它本质是基于 Qwen 图像基座的指令式编辑模型,输入是「原图 + 编辑指令」,输出是编辑后的新图。模型自己判断指令里的“谁要动、哪里动、怎么动”,不需要你提供任何结构条件图。代价是结构可控性变弱,它不像 ControlNet 逐像素锁构图,存在自由发挥的空间。但“语义控制”恰好是分镜业务需要的抽象——分镜脚本本身就是语言:“镜头切到主角左侧 45 度,过肩拍背影”。把这句话直接塞给模型,比手动为每个机位重做 condition 图快一个数量级。这个取舍想清楚了,后面调参才不会跑偏。
2.2 环境准备:ComfyUI 本体、插件与模型权重
环境搭建上,新手最快路径是装秋叶一键整合包,ComfyUI 本体、Python 环境和常用节点都打包好了;老手习惯 git clone 官方仓库自己建 venv。两条路都能走,关键在后面两步:装 QwenImageEdit 节点插件、放模型权重。插件可以在 ComfyUI Manager 里搜关键词「Qwen Image Edit」安装,也可以直接克隆到 custom_nodes 目录后重启。
# 已有 Git 环境的做法:克隆插件并安装依赖 cd ComfyUI/custom_nodes git clone <QwenImageEdit插件仓库地址,以 ComfyUI Manager 搜索结果为准> cd <插件目录> pip install -r requirements.txt # 模型权重放到 models 下对应目录(具体路径以插件 README 为准) mkdir -p ../models/checkpoints # 将 qwen-image-edit.safetensors 手动放入该目录这里有个细节:插件仓库地址各家镜像比较多,我不写死,在 Manager 里搜最稳。模型权重体积不小,手动下载放置比依赖 ComfyUI 自动下载靠谱,后者的下载通道经常卡在半路,第 5 章有对应排查。文件名最好和工作流 JSON 里引用的一致,不一致就改加载节点 widget 里的 model_name 字段,别去改 JSON 里的连接关系。
2.3 显存(VRAM)评估与运行预期
跑这类指令编辑模型,1024 分辨率下 BF16 加载加推理大约要 14 到 18G 显存。16G 显卡是舒适区,12G 用 --lowvram 也能动,但速度和体验会打折。显存紧张时优先降输入分辨率到 768,或者把步数压到 20,不要一上来就开批量四张,那是在给翻车创造条件。
# 显存吃紧时的启动参数 python main.py --lowvram --maximum-vram-use 4.0注意力优化不是刚需,但值得试。常见的是装 SageAttention,对长序列注意力有加速和降显存的效果。安装命令各家文档不太一样,装不上不影响出图,可以先跳过。我一般先把工作流跑通,之后再回头优化速度,顺序搞反了容易陷入“环境没配好就怀疑模型有问题”的死循环。出图速度方面,1024 分辨率 30 步,40 系显卡一张大概 1 到 3 分钟,这个量级对分镜批产是可接受的。
3. 把 c0144.json 工作流跑起来:节点结构与出图流程拆解
3.1 导入工作流:解压、拖拽与红节点诊断
先解压 c0144.rar 取出 c0144.json。这个资源包对应作者博客《ComfyUI 使用教程、开发指导、资源下载》里的 c0144 条目,下载回来解压即得。导入 ComfyUI 有两种方式:把 JSON 文件直接拖到画布,或者点 Workflow → Open 选择文件。导入后如果出现红色节点块,说明对应自定义节点没装,先别怀疑文件坏,看第 5 章第一条。
# 解压资源包(Windows 和 Linux 通用) unrar x c0144.rar # 没装 unrar 的话用 7z 也可以 7z x c0144.rar导入前可以先校验 JSON 格式,避免文件损坏导致 ComfyUI 直接无响应。用 Python 的 json 模块做一次解析,顺便把节点清单打出来,一眼就能看出这个工作流由哪些节点组成,和你装的插件是否匹配。
import json with open("c0144.json", "r", encoding="utf-8") as f: data = json.load(f) # UI 导出的工作流是 {"nodes": [...]};API 格式是 {node_id: {...}} nodes = data.get("nodes", []) if isinstance(data, dict) else data for n in nodes: print(f"{n.get('type', '?'):36s} | {n.get('title', '')}")这段脚本把每个节点的类型和标题列出来。重点看两类:一类是 QwenImageEdit 相关的加载节点和文本节点(插件提供),另一类是 KSampler、VAEDecode、SaveImage 这些内建节点。如果工作流引用了环境里不存在的节点类型,ComfyUI 导入后就会在这类地方弹红块,输出清单里也会直接暴露缺失项。
3.2 核心节点链:输入图、指令文本、采样器与解码输出
典型的 QwenImageEdit 图生图链路是:LoadImage 输入原图 → 加载节点读入模型和文本编码器 → 指令文本节点编码编辑要求 → 采样器在隐空间扩散 → VAEDecode 解码 → SaveImage 落盘。c0144.json 里这些连接已经接好,需要动的参数不多,按优先级排如下。
| 节点 | 作用 | 需要动的参数 |
|---|---|---|
| LoadImage | 载入原画或参考帧 | 切换新分镜原图 |
| QwenImageEdit 加载节点 | 载入模型权重与文本编码器 | model_name 选择权重文件 |
| 指令文本节点 | 承载编辑指令 | 每次换机位就改它 |
| KSampler | 隐空间扩散采样 | steps、cfg、denoise、seed |
| VAEDecode + SaveImage | 解码并输出图片 | 输出文件名前缀 |
采样参数决定了出图上限。我一般先把 denoise 放 0.65 附近跑通,再往 0.7 到 0.8 调。denoise 越高模型自由发挥越大,机位变化更明显但角色越容易漂;太低则变化不明显,等于原地微调。steps 用 30 够用,cfg 在 5 到 7 区间,seed 固定方便对比。这些参数 c0144.json 应该都带初值,先跑通再动,别一上来就追求“最佳参数”。
3.3 指令文本的结构:把相机语言翻译成编辑指令
这个工作流的核心操作只有一个:把机位描述写成编辑指令。Qwen 系模型对中文理解不错,但镜头术语有歧义。我的建议是“中文描述方向、英文标术语”,比如:保持角色面貌、服装、场景光照不变,将镜头改为 over-the-shoulder 视角,从角色左后方 45 度拍摄,中景,背景轻微虚化。中文负责语义锚定,英文负责术语精确,实测命中率更高。
提示:一个指令只做一件事。先写「保持…不变」做锚定,再写「将镜头改为…」做变化,不要在同一条指令里同时要求换机位、换服装、加滤镜。指令叠加越多,模型越容易顾此失彼。
为什么不写负面提示词?指令编辑模型通常不按 negative prompt 那一套工作,它只按正面指令理解任务。与其在负面里堆“不要变形、不要多手指”,不如把正面指令写清楚。这是它和常规 txt2img 工作流差别最大的地方,也是新手最容易拿旧习惯套的地方。
4. 多角度剧情分镜实战:从单张原画到五视角分镜
4.1 输入图准备:分辨率、构图与一致性边界
输入图质量直接决定分镜下限。这类编辑模型对低清、模糊、噪点多的原图容忍度差,常见翻车是原图本身糊,模型自作主张“补”出一堆错误细节。我的习惯是:输入图分辨率控制在 1024 以内但不低于 768;主体放在画面偏中位置;背景先别堆复杂纹理,用干净场景测机位,再上复杂场景。这样能把变量控制在“机位变化”这一个维度上。
角色一致性还有一个容易被忽略的点:单张原图提供的信息量有限,尤其从正面转到背面这种大角度变化,模型没见过角色背面长什么样,只能猜。常见补强做法是给模型附加第二张参考图——前一个镜头里同角色的其他角度。插件支持多图输入的话,把参考图接进加载节点的附加输入,指令里加一句“以参考图中的角色特征为准”,能明显减少“换个角度换个脸”的尴尬。
4.2 五视角指令模板:景别、机位、镜头运动
下面五个是剧情分镜最常用的视角,直接抄。前缀锚定句都一样:「保持角色的五官、发型、服装、场景光照和整体画风完全不变」,后面接各视角的机位描述。
| 剧情用途 | 相机描述 | 完整指令示例 |
|---|---|---|
| 建立镜头 | 全景,正面平视 | 保持…完全不变,镜头拉远到全景,正面平视,交代角色与场景的空间关系 |
| 对话镜头 | 中景,过肩视角 | 保持…完全不变,镜头改为 over-the-shoulder,从角色A左后方 45 度拍摄,前景带角色A肩部,焦点在角色B |
| 情绪特写 | 特写,机位微仰 | 保持…完全不变,镜头切到角色面部特写,机位微微仰起,背景大虚化,突出眼神 |
| 压迫感 | 低角度仰拍 | 保持…完全不变,镜头改为低角度仰拍,角色位于画面上方,强化透视与压迫感 |
| 场面调度 | 高角度俯拍 | 保持…完全不变,镜头升高改为俯拍,全景,呈现角色A与角色B的相对站位和桌面布局 |
模板里的“镜头拉远”“镜头升高”这类运动描述,对编辑模型来说不是真的镜头运动,而是要求它改变透视关系。效果近似,但别期望有视频级运镜。分镜用途下完全够用,真要运镜得走图生视频管线,那是另一套工作流的事。先把这五个角度跑顺,再按剧情需要扩展机位。
4.3 批量生成与种子控制:让剧情在同一角色上连续
五个视角不是逐个手动改指令,而是批量做。固定 seed 能让基础采样噪声保持一致,换指令时角色特征漂移幅度会小一些。反过来,如果某个角度总出崩坏图,换 seed 再试也是排查手段——这属于典型的“玄学”,多试几个种子,挑能用的固定下来。同一批分镜务必用同一颗种子,否则角色一致性没法聊。
批量做法是复制 JSON 改指令。下面这个脚本遍历分镜指令列表,生成 N 份独立的工作流文件,之后逐个导入 ComfyUI 排队出图。注意只改指令文本节点里的字符串 widget,不要动节点之间的连接关系。
import copy import json shots = [ "保持角色的五官、发型、服装、场景光照和整体画风完全不变,镜头拉远到全景,正面平视", "保持角色的五官、发型、服装、场景光照和整体画风完全不变,镜头改为 over-the-shoulder,左后方 45 度中景", "保持角色的五官、发型、服装、场景光照和整体画风完全不变,镜头切到面部特写,机位微仰", ] with open("c0144.json", "r", encoding="utf-8") as f: base = json.load(f) for i, shot in enumerate(shots): wf = copy.deepcopy(base) for n in wf["nodes"]: t = n.get("type", "").lower() # 只处理 QwenImageEdit 类节点,或非 CLIP 的文本节点 if "qwenimageedit" not in t and ("text" not in t or "clip" in t): continue vals = n.get("widgets_values", []) for idx, v in enumerate(vals): if isinstance(v, str) and len(v) > 10: vals[idx] = shot with open(f"shot_{i+1:02d}.json", "w", encoding="utf-8") as f: json.dump(wf, f, ensure_ascii=False, indent=2) print("已生成 3 个分镜工作流文件")脚本逻辑不复杂:deepcopy 出原始工作流,逐个替换长度大于 10 的字符串 widget——这类值通常就是指令文本,因为模型名、文件名、种子这些字段要么是短串要么是数字。但要注意,替换完打开生成的文件确认一下,被替换的确实是指令节点而不是别的长文本字段。这种“复制工作流改字段”的做法,比在界面上手改更可复现,每个分镜对应一份 JSON,出图结果能归档,改版时回到对应镜号重新提交就行。
成组校验是最后一步。生成的分镜图要查三项:角色身份是否连续(五官、发色、服装细节)、光照方向是否与原图一致、相邻镜头之间的空间关系是否说得通。三项里角色一致性优先,光照方向不对可以后期调,角色变了整个分镜就作废。我每次批量出完图,会把五个视角拼成一张 contact sheet 再逐项打勾,比单张看效率高一倍。
5. 避坑排查:QwenImageEdit 工作流最常见的五个翻车现场
5.1 红块节点 Load Failed:插件缺失或版本错位
现象:拖入 c0144.json 后,画布上一片红色节点,提示 cannot find node type。
原因:环境里没装 QwenImageEdit 节点插件,或者插件版本太老、太新,节点类名对不上工作流里的引用。
解决:先在 ComfyUI Manager 里搜缺失节点并安装,装完重启。还红就点红块看报错里的节点类型全名,去插件仓库查这个类型是否改过名,回退或升级插件版本对齐。工作流 JSON 里的节点类型名是写死的,插件一改名旧工作流就红,这是 ComfyUI 生态的普遍现象,不是文件本身坏了。dump 节点清单那招(第 3.1 节)在这里能直接定位缺的是哪个。
5.2 角色变成另一个人:指令没锁住身份
现象:机位变了,脸也换了,出来的角色不是原图那个人。
原因:指令里只写了机位,没写“保持角色身份”。模型拿到一条只描述构图的指令,会把重绘当成重新创作。
解决:把锚定句放到指令最前面,明确写“保持五官、发型、服装、光照、画风完全不变”。角色特征最好细化到“黑色长发、红色围巾、深色外套”这个粒度,越具体越不容易漂。另一个有效手段是给模型附加同角色其他角度的参考图,双保险。这个坑在批量生成时最容易出现,因为脚本复制的锚定句一旦写得含糊,五张图一起翻车。
5.3 CUDA out of memory:显存爆掉
现象:采样跑到一半,控制台报 CUDA out of memory,ComfyUI 队列卡死。
原因:1024 输入加 BF16 精度,连续多个任务排队,显存峰值超了。
解决:启动参数加 --lowvram(第 2.3 节),输入图降到 768,批量任务拆成单个排队。如果频繁 OOM,检查是不是开了多个 ComfyUI 实例互相抢显存。还有一个容易被忽略的点:ComfyUI 界面上 Cancel 全部任务后,已加载进显存的模型才会释放,别只看队列空了就继续加任务。
5.4 叠影、多手指、结构崩坏:指令矛盾或 denoise 过高
现象:侧面机位出现正面视角才有的五官,或者手指数量不对、身体结构断裂。
原因:指令里同时带了多个视角描述,模型不知道听谁的;或者 denoise 开到 0.85 以上,自由发挥过头。
解决:一个指令只做一个机位变化,去掉“顺便换个角度又来一个特写”这类叠加描述。denoise 从 0.65 起步,单次上调不超过 0.05。必要时换 seed——结构崩坏很多时候是采样噪声和模型的偶然碰撞,换颗种子就正常了。这个坑没有通用解,本质是编辑模型的结构控制上限,遇到就降需求、降 denoise、换种子三连试。
5.5 模型下载卡住或找不到权重
现象:第一次运行提示找不到 qwen-image-edit.safetensors,或 ComfyUI 自动下载进度卡在 0%。
原因:ComfyUI 内置下载走的通道不稳定;工作流 JSON 里引用的文件名和你本地文件不一致。
解决:手动下载模型文件放到 models/checkpoints(或插件 README 指定的目录),文件名改成和加载节点 model_name 一致;不想改文件名就改工作流里加载节点的权重路径。下载源优先用国内镜像站(如 hf-mirror 这类站点),下载完先核对文件大小再放进去——半截文件会导致加载报错但不是缺文件提示,这种“假存在”比直接缺失更坑,排查时很容易绕远路。
6. 进阶:把分镜工作流接进自动化与团队协作
分镜需求永远是批量且反复的,一集短剧改三版脚本、每版二十个镜头是常态。手动在 ComfyUI 界面切图、改指令、点 Queue,治标不治本。进阶做法是把 c0144.json 转成 API 格式,用代码提交任务。ComfyUI 自带这套接口:菜单里 Workflow → Export(API)会导出一份可直接 POST 的 JSON,配合 --listen 启动,局域网内任何机器都能提交任务。
# 开启 API 模式,局域网可访问 python main.py --listen 0.0.0.0 --port 8188import json import urllib.request def queue_prompt(server: str, api_json_path: str): with open(api_json_path, "r", encoding="utf-8") as f: prompt = json.load(f) payload = {"prompt": prompt, "client_id": "storyboard"} req = urllib.request.Request( f"http://{server}/prompt", data=json.dumps(payload).encode(), headers={"Content-Type": "application/json"}, ) with urllib.request.urlopen(req) as resp: return json.loads(resp.read().decode()) print(queue_prompt("127.0.0.1:8188", "c0144_api.json")["prompt_id"])这段代码把工作流提交到 ComfyUI 队列,返回的 prompt_id 可以轮询 /history 接口查状态。对团队来说,把“镜号、景别、机位、指令文本”维护成一张表,脚本按行生成 API 工作流、统一命名落盘,比在界面上人肉操作可追溯得多。如果你用的是作者那套 Tauri+Django 开源 AI 工具箱(博客里《我的AI工具箱Tauri+Django开源git项目介绍和使用》那篇),这类工作流 JSON 可以作为任务模板接进它的任务管理:前端填镜头脚本,后端调 /prompt 接口,局域网内多台机器排队出分镜。我实际跑下来最大的收益不在出图速度,而在“每个镜头都能追溯是哪份 JSON、哪颗种子、哪版指令出的”,这是手工操作给不了的后悔药。
从那以后,我每次拿到外部工作流 JSON 都强制走一遍流程:先 dump 节点清单、再核对模型路径、最后用一张低分辨率测试图跑通,才会上高清批处理。这套流程帮我挡掉了至少一半的无效翻车,希望帮到你。
本文还有配套的精品资源,点击获取