comfy-png-inspector:把一张 ComfyUI 出图的参数读回来

前言

做 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 或一个目录,输出以下内容:

  1. LoRA 链:按真实执行顺序列出每个 LoRA 及其权重,支持正负值。
  2. 采样参数:seed、steps、CFG、sampler / scheduler、denoise、latent size。
  3. 模型链:base model、CLIP(含类型)、VAE、保存前缀、pre-sampler 补丁(ModelSamplingAuraFlow、CFGNorm 等)。
  4. 两段 prompt:经 link 解析,标注来源节点与槽位;运行时生成的槽位单独标记为 generated at runtime。
  5. 旁路节点:从 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 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜