前言¶
做 ComfyUI 相关的 DSH 插件或智能体时,经常要回答一个问题:这张图是怎么生成的。PNG 的 tEXt 块里确实存了 workflow,但字段名是 ComfyUI 的 [node_id, slot] 引用,prompt 常常是走 link 传过来的空串,LoRA 链绕在几十个节点上,导出的 workflow 里还有一堆 mode: 4 的 bypass 节点其实没参与出图。手工在画布上点,错一处就复现不出结果。
下面介绍 zzcyydshhh/comfy-png-inspector。它本质上是个 PNG 元数据解析器,前端是一个零依赖、不联网的单页工具,同一套解析逻辑打包成 DSH bundle,对模型暴露一个 comfy_png_inspect 工具。
这是什么¶
作者是 zzcyydshhh,仓库在 GitHub 上有 16 stars,MIT 许可,package.json 里版本号是 0.1.0。它解决的是同一个痛点的两处场景:人在浏览器里翻几百张旧图的参数,模型在 Harness 里直接对某个 output 目录出一份摘要。Web UI 与插件共用 comfy-png-core.js,没有第二套实现。
核心功能¶
工具输入一个 PNG 或一个目录,输出以下内容:
- LoRA 链:按真实执行顺序列出每个 LoRA 及其权重,支持正负值。
- 采样参数:seed、steps、CFG、sampler / scheduler、denoise、latent size。
- 模型链:base model、CLIP(含类型)、VAE、保存前缀、pre-sampler 补丁(
ModelSamplingAuraFlow、CFGNorm等)。 - 两段 prompt:经 link 解析,标注来源节点与槽位;运行时生成的槽位单独标记为 generated at runtime。
- 旁路节点:从
workflow.nodes[].mode判断,4为 bypass、2为 mute,列出「画布上存在但未参与出图」的节点。
解析上有几处容易踩的,工具明确处理了:
CLIPTextEncode.text直接读是空串,因为文本来自 link。工具会回溯到源节点并写成CLIPTextEncode#4.text[slot 0] ← ZhPromptEnhance#79.text[slot 0]这样的形式。- LoRA 链不是按节点排列顺序,而是从
KSampler.model沿inputs.model反向遍历,到UNETLoader/CheckpointLoaderSimple为止再反转,得到执行顺序。 tEXt/zTXt/iTXt都读,zTXt和压缩iTXt用DecompressionStream('deflate')解压。
Web UI 还提供:缩略图列表、Ctrl+K 聚焦的搜索(文件名 / LoRA 名 / prompt 正文)、CSV(UTF-8 BOM,Excel 可直开)与 JSON 导出、批量打包 zip,以及一个模板重建功能。
安装与启用¶
在 Harness 里用官方命令安装(按 README 原文,不带版本或 commit 后缀):
dsh plugin add https://github.com/zzcyydshhh/comfy-png-inspector
package.json 声明了 peer 依赖:
"peerDependencies": {
"@deepseek-ai/cordis": "~4.0.5",
"@deepseek-ai/dsh-tools": ">=0.0.1-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0"
},
"dsh": {
"bundle": {
"patch": "./cordis.patch.yml"
}
}
也就是说它通过 cordis.patch.yml 打补丁的方式注册到 Harness。安装前建议先读一遍仓库源码和 cordis.patch.yml,确认补丁内容与你的 Harness 版本兼容——插件以当前 dsh 进程的权限运行,不额外受限。
典型用法¶
装好后模型侧多一个工具:
comfy_png_inspect(path, limit?, include_prompt?)
path 指向单个 PNG 或整个 output 目录;limit 控制返回条目数,include_prompt 决定是否带完整 prompt。对一个目录调用时,每个图都出一份 LoRA 链、采样设置、模型链、latent size、prompt 和旁路节点清单,模型可以直接据此生成复现说明。
Web UI 部分不依赖安装命令,直接本地起:
git clone https://github.com/zzcyydshhh/comfy-png-inspector.git
cd comfy-png-inspector
打开 comfy-png-inspector.html(Chrome / Edge 103+,需要 DecompressionStream),把 ComfyUI 的 output 文件夹拖进窗口即可。仓库根目录的 index.html 只是 GitHub Pages 用的一行跳转,离线打开也会落到同一个应用。界面中英双语,顶部切换,浏览器语言决定默认值,也可以用 ?lang=en 强制指定。
也可以不打开浏览器,直接用命令行:
python cli/comfy_png_parse.py ./output --no-text
python cli/comfy_png_parse.py ./output --csv index.csv --json index.json
python cli/comfy_png_parse.py a.png --full # 完整 prompt
只用标准库,输出与 Web UI 一致。
复现工作流的两种模式¶
选中一张图后有两个按钮,取决于 PNG 里带了多少信息:
| 原样导出 | 从模板重建 | |
|---|---|---|
| 按钮 | Export this image’s workflow JSON | Rebuild from template |
| 条件 | PNG 内有 workflow 块 |
载入一个画布 workflow 当模板 |
| 结果 | 生成那一刻的原始画布 | 模板布局 + 灌入解析出的参数 |
| 适用 | 直接复现,最可靠 | API-only 出图、映射回现有模板 |
重建会替换 base model / CLIP / VAE / latent size / 保存前缀 / prompt / KSampler 字段,再按解析顺序重建整条 LoRA 链,并把链尾接回模板原本的消费者(比如 ModelSamplingAuraFlow 的 model 输入)。操作先给一份逐项变更清单,然后自检:link 端点存在、无自环、KSampler 接线完整。模板本身深拷贝,不会被写回。
限制与注意¶
- 只支持 PNG。ComfyUI 元数据放在 PNG 块里,jpg / webp 没有。
- 被截图工具、IM 转发或 Photoshop 重新保存后
tEXt会丢失,界面会提示没有 ComfyUI 元数据。 file://下浏览器不允许 JavaScript 扫描目录,每次会话需要手动选一次或拖一次。- 重建受模板里已有的节点类别限制:PNG 有而模板没有的类别不会被凭空造出来(LoRA 节点是例外,按解析数量重建)。导出前先看变更清单。
- zip 打包只存不压,为保持零依赖,几百个 workflow 会在十几 MB 量级。
结尾¶
它的价值在于把「翻一张图的参数」这件事变成一次可编程的调用,模型侧一个工具,人侧一个本地页面,底层是同一份解析代码。目录页在 https://www.skillhub.cn/plugins/zzcyydshhh/comfy-png-inspector ,仓库在 https://github.com/zzcyydshhh/comfy-png-inspector 。