一、实际使用中的痛点
我在做漫剧分镜的时候,大量用到 ComfyUI 图生图,踩过不少现实问题,并不是导入一个工作流 json 就万事大吉。
- 工作流不可复现:网上下载的 json 工作流,导入之后报错节点缺失,或者同样提示词,别人出图正常,自己画面完全不对。json 文件只保存节点连线和参数,不携带模型、LoRA、自定义节点,很多人误以为拿到 json 就拿到完整方案。
- 图生图重绘强度拿捏不准:denoise 重绘强度乱设置,要么图片几乎没有变化,要么直接把原图构图、人物全部改掉,相当于重新文生图,丢失原有分镜构图信息ComfyUI。
- 8G 显存频繁 CUDA OOM 闪退:同时加载 checkpoint、IPAdapter、ControlNet 多个模型,跑几张图就直接显存爆掉,只能重启 ComfyUI。
- 角色一致性失控:用图生图迭代分镜,人物五官、发型服饰不断漂移,明明参考同一张人设图,下一镜直接 “换脸”。单纯靠固定 seed 解决不了身份一致性问题。
- GUI 手动操作效率低:几十上百张漫剧分镜,一张张手动上传图片、改提示词、点生成,重复劳动大,缺少脚本自动化批量处理手段。
- 各种奇怪坏图:黑图、灰蒙蒙的图、肢体畸形,排查半天最后发现是 VAE 不匹配、模型文件损坏、分辨率超出模型训练范围。
- 集体模型资源请看这一篇文章:https://developer.aliyun.com/article/1772270?spm=a2c6h.13148508.setting.24.24dc4f0eQDlkv8
二、SD 底层:文生图与图生图核心原理
2.1 文生图底层链路
加载 Checkpoint 模型 → CLIP 编码正向、反向提示词 → 创建空 Latent 潜噪声张量 → KSampler 采样去噪 → VAE 解码器把潜空间张量还原为像素图片输出。
2.2 图生图底层链路(重点)
图生图和文生图最大区别,是潜张量来源不是空白噪声,而是由输入原图编码得到。
- Load Image 读取参考图片;
- VAE Encode:把像素图片压缩为 latent 潜空间张量,保留原图构图、光影、主体布局;
- 根据
denoise_strength(重绘强度)向潜张量加入高斯噪声;
- denoise 0.1‑0.3:轻微修改色彩、细节,构图人物几乎不动;
- denoise 0.3‑0.6:漫剧最常用区间,修改画风、微调表情,保留整体构图;
- denoise 0.6‑0.8:大幅度重绘画面,只保留大致布局;
- denoise=1.0:完全等同于文生图,丢弃原图全部信息,不建议图生图场景使用。
- CLIP 编码提示词送入 UNet 做条件约束;
- KSampler 完成采样;
- VAE Decode 解码,输出最终图片。
关键点:图生图不是 “在原图上面涂抹”,是在潜空间里做噪声重采样。很多新手不理解这点,调参完全凭感觉。
三、ComfyUI 实操搭建标准图生图工作流
环境:Windows,RTX3060 8G,ComfyUI 官方原版,已经装好基础自定义节点 IP‑Adapter,ControlNet。 启动建议,8G 显存启动参数:
python main.py --lowvram --use-pytorch-cross-attention,开启低显存模式,缓解 OOM 问题ComfyUI。
3.1 核心节点清单
Load Checkpoint:加载 SD 底模;Load Image:加载需要重绘的原始参考分镜图;VAE Encode:对输入图片编码得到 latent;IPAdapter Apply(可选,漫剧必用):载入角色参考图,锁定人物五官身份;ControlNet Apply(可选):OpenPose/Canny 锁定姿态、构图;CLIP Text Encode:正向、反向提示词;KSampler:采样器,设置 denoise 重绘强度、采样步数、CFG;VAE Decode:解码出图;Save Image:保存输出结果。
3.2 漫剧场景参考参数(实测可用)
- 分辨率:576×1024(9:16 竖屏)
- sampler:euler a / dpmpp_2m_sde
- steps:22‑28 步
- CFG scale:5‑7,不要设置过高,过高容易畸形崩坏
- denoise_strength:漫剧分镜迭代优先 0.4‑0.55
- IP‑Adapter 权重:0.65‑0.75,兼顾角色身份和画面改动自由度,不要拉满 1.0,画面会僵硬固化。
反向提示词模板,漫剧通用:
畸形,多指,缺指,扭曲五官,水印,文字,模糊,低画质,变形肢体,换脸。
3.3 工作流避坑小经验
- VAE 尽量和 checkpoint 配套,乱换 VAE 很容易出现发黑、泛灰图片;
- 8G 显卡不要同时加载多个 ControlNet 模型,用哪个加载哪个,不用的模型从内存卸载;
- IP‑Adapter 不能完全依赖,最好和角色 LoRA 一起配合,角色一致性效果会提升一大截;
- 不要盲目追求超高分辨率,SD1.5 原生适合 512‑768 区间,硬拉到 2K 极易出现肢体崩坏。
四、Python 脚本:调用 ComfyUI API 批量图生图
使用说明:先在 ComfyUI 画布手动调试好一套图生图工作流,保存为
img2img_workflow.json,脚本读取该工作流模板,遍历本地原始分镜文件夹,批量执行图生图重绘,输出重绘后的图片。 依赖安装:pip install requests websocket-clientComfyUI 必须保持开启,默认端口 8188。
import os import json import websocket import requests import uuid COMFYUI_HOST = "127.0.0.1:8188" CLIENT_ID = str(uuid.uuid4()) WORKFLOW_JSON_PATH = "./img2img_workflow.json" INPUT_IMG_DIR = "./source_frames/" # 需要重绘的原始分镜图片目录 OUTPUT_IMG_DIR = "./img2img_output/" os.makedirs(OUTPUT_IMG_DIR, exist_ok=True) def load_workflow_template(json_path): with open(json_path, "r", encoding="utf‑8") as f: return json.load(f) def queue_prompt(prompt_workflow): payload = {"prompt": prompt_workflow, "client_id": CLIENT_ID} res = requests.post(f"http://{COMFYUI_HOST}/prompt", json=payload, timeout=300) return res.json() def get_result_images(ws, prompt_id): while True: msg_raw = ws.recv() msg = json.loads(msg_raw) if msg["type"] == "executed": data = msg["data"] if data["prompt_id"] == prompt_id and data["node"] is None: output_data = data["outputs"] for node_id in output_data: for img_info in output_data[node_id]["images"]: img_bin = requests.get(f"http://{COMFYUI_HOST}/view/{img_info['filename']}").content return img_bin def get_input_image_list(folder): file_list = [] for fname in sorted(os.listdir(folder)): ext = fname.lower().split(".")[-1] if ext in ["png","jpg","jpeg"]: file_list.append(os.path.join(folder, fname)) return file_list if __name__ == "__main__": workflow_template = load_workflow_template(WORKFLOW_JSON_PATH) img_path_list = get_input_image_list(INPUT_IMG_DIR) print(f"待处理图片总数:{len(img_path_list)}") ws_conn = websocket.create_connection(f"ws://{COMFYUI_HOST}/ws?clientId={CLIENT_ID}") for idx, img_file in enumerate(img_path_list): # 注意:这里根据你自己工作流,修改Load Image节点ID,示例假设Load Image节点id为"4" workflow_template["4"]["inputs"]["image"] = img_file resp = queue_prompt(workflow_template) pid = resp["prompt_id"] print(f"正在处理第{idx+1}张:{os.path.basename(img_file)},prompt_id:{pid}") img_bytes = get_result_images(ws_conn, pid) save_name = os.path.basename(img_file) save_full = os.path.join(OUTPUT_IMG_DIR, save_name) with open(save_full, "wb") as fw: fw.write(img_bytes) print(f"✅完成输出:{save_full}") ws_conn.close() print("全部图生图批量任务执行结束")
注意:脚本里面
workflow_template["4"]的节点 ID,需要替换成你自己 json 工作流中Load Image节点的真实 ID,否则脚本不会替换输入图片,一直跑同一张图。
五、FFmpeg 配套指令(重绘后分镜简单处理)
图生图批量输出完图片序列之后,经常需要简单预处理,做画面裁剪、转视频,适配漫剧生产。
# 1.批量统一图片亮度/缩放(单张示例,可套脚本循环) ffmpeg -y -i ./img2img_output/frame_000.png -vf scale=576:1024 -q:v 95 fixed_frame_000.png # 2.图片序列转测试短视频,看分镜连贯效果 ffmpeg -y -framerate 3 -i ./img2img_output/frame_%03d.png -c:v libx264 -r 24 pix_fmt yuv420p test_preview.mp4
六、常见故障排查(来自本人实际调试记录)
表格
| 现象 | 可能原因 | 解决办法 |
| 图生图出来几乎和原图一模一样 | denoise 重绘强度设置过低 | 漫剧迭代建议调到 0.4‑0.55 区间测试 |
| 图生图之后构图完全大变,人物消失 | denoise 设置接近 1.0 | 降低 denoise;增加 ControlNet Canny/OpenPose 锁定构图姿态ComfyUI |
| 生成黑图、画面灰蒙蒙一片 | VAE 与模型不匹配;模型文件损坏;分辨率过大 | 更换配套 VAE;重新下载 checkpoint;降低输出分辨率 |
| 8G 显卡跑一会 CUDA out of memory | 同时加载过多大模型;没有开启低显存模式 | 启动增加--lowvram参数;不用的 ControlNet/IP‑Adapter 及时卸载;不设置 batch 批量并发;虚拟内存放 NVMe 固态ComfyUI |
| 图生图迭代分镜,人物不停变脸 | 只靠 seed 固定,缺少角色特征约束 | 使用 IP‑Adapter + 角色 LoRA,统一角色参考图,每一轮图生图都带上角色特征注入,不能仅靠提示词描述长相阿里云开发... |
| 导入网上下载的工作流 json,报红色节点缺失 | 本地缺少对应自定义节点 | 在 ComfyUI 管理器安装缺失节点;不要只拷贝 json,确认模型、LoRA 齐全再运行 |
| 画面大量畸形肢体 | CFG 数值过高,采样步数不足,denoise 过高 | CFG 控制 5‑7,steps≥22,denoise 不要超过 0.8;完善反向提示词过滤畸形元素 |
七、方案对比:ComfyUI 图生图 VS 一体化 AI 绘图工具
表格
| 对比项 | ComfyUI SD 底层绘图(图生图) | 一体化封装绘图工具 |
| 部署配置 | 需要手动安装依赖、自定义节点,需要调启动参数优化显存 | 开箱即用,不用处理底层节点逻辑 |
| 参数可控度 | 全部底层参数暴露:denoise、采样器、VAE、IP 权重、ControlNet 权重,自由度极高 | 参数做上层封装,底层潜空间相关选项少 |
| 批量自动化 | 需要自己写 Python 调用 API,上手有一定门槛 | 部分自带批量功能,但定制化弱 |
| 角色一致性能力 | IPAdapter+ControlNet+LoRA 多层组合,可深度调参 | 功能有,但可调节颗粒度不足 |
| 硬件适配 8G 显存 | 需要手动开启 lowvram,管理模型加载卸载 | 内部自动做显存调度,对小白友好 |
| 适合人群 | 需要做漫剧工业化迭代、需要深度调画面效果,愿意花时间调试的技术向创作者 | 快速出图,不想接触底层节点的普通用户 |
八、FAQ
Q:denoise 重绘强度是不是越低越好?A:不是。denoise 太低,模型几乎没有修改空间,做画风迁移、表情修改完全不起效果;太高直接丢失原图构图。漫剧分镜迭代优先 0.4‑0.55 区间做测试,根据输出结果上下微调 0.05。
Q:固定 seed 能不能保证图生图角色不变?A:不能。seed 只能保证噪声初始值一致,SD 模型本身没有 “人物身份记忆”。想要角色不变,必须 IP‑Adapter、LoRA、ControlNet 配合使用,单纯固定 seed 效果很有限。
Q:网上下载的 ComfyUI 工作流 json,导入之后直接就能用于批量漫剧生产吗?A:不能。json 只保存节点连线。你必须确认本地拥有一模一样版本的底模、LoRA、ControlNet 模型、自定义节点,否则会出现节点报错或者画面效果完全不一样。拿到 json 之后一定要少量图片测试,确认效果,再跑批量任务。
Q:8G 显卡做大量图生图批量处理,有什么实操建议?A:开启 lowvram 启动参数;串行处理,不要并发多张;不用的模型及时卸载;虚拟内存放在 NVMe 固态硬盘;分辨率不要盲目拉高,优先 576×1024 这类适合 8G 显存的尺寸。
Q:图生图黑图怎么快速定位问题?A:分步排查:①换一套 VAE 测试;②降低分辨率;③更换 checkpoint 底模;④检查模型文件是否完整;⑤看 ComfyUI 后台控制台报错日志,很多问题控制台会打印关键信息。
九、总结
ComfyUI 的图生图不是一个点一下就完事的黑盒工具,本质是操作 SD 潜空间的一套节点流水线。很多人踩坑,根源是不理解 denoise 重绘强度、VAE、IP‑Adapter 这些底层组件的作用,拿到别人的 json 直接期望 “一键量产”。
对于漫剧项目来说,图生图主要用于分镜画风统一、老分镜修复、表情微调。实际项目流程应该是:少量图片调试工作流、调通参数,确认角色一致性、画面效果达标之后,再上 Python 脚本做批量推理。8G 显存的机器,一定要重视显存优化,合理使用 lowvram 模式,控制模型常驻内存数量,避免频繁 OOM 闪退。