π§ Save Images (Dehypnotic)
Save images in any format, with filenames you can actually sort
- images
- images
- saved_path
ComfyUI's built-in Save Image node is PNG-only and names files in a way that's fine until you want to organize output. Save Images (Dehypnotic) is the "I want control over this" version: seven output formats, sequential naming you define, optional workflow embedding, and it passes your images straight through so it drops into any graph without breaking a wire.
How it works
It's pure Pillow - which ships with ComfyUI - so this node adds zero Python dependencies to your install. Each tensor in the batch becomes a PIL image and gets saved with format-appropriate options: JPEG gets quality + optimize, PNG gets optimize plus an optional workflow text chunk, WebP gets lossless (default on) or quality, and every file gets your DPI stamped in. Naming auto-increments by scanning whatever's already in the folder, so re-running a workflow appends instead of clobbering your earlier runs. That's the detail that makes batch workflows tolerable.
The inputs that matter
Everything is technically "required," but most of it is set-and-forget:
- images - the batch; saved one frame at a time.
- extension - png / jpg / jpeg / webp / gif / bmp / tiff. PNG or JPG for sharing; WebP when you care about file size.
- filename_prefix - the default is
QIE, which I can't explain and you should change. - number_padding, number_start, filename_delimiter - gives you
QIE_0001.png-style names. - quality, optimize_image, lossless_webp, dpi - only touch these if file size or a print/DTP use case actually matters to you.
- embed_workflow - writes the workflow JSON into the file (PNG text chunk, WebP XMP). That's the "workflow included" community norm from the ComfyUI ecosystem, automated in one toggle instead of remembered.
One honest caveat on embed_workflow: in the shipped code it pulls the workflow JSON from the node's own attributes or the COMFY_WORKFLOW_JSON environment variable. If you flip it on and see no metadata in the output file, that's the likely reason - it's not the node silently failing.
Outputs: images (passthrough, so you can keep chaining downstream) and saved_path (STRING, one absolute path per line - handy if a later node wants to read the list back). Output node, so it can terminate the graph.
Install
Same pack as the other Dehypnotic save nodes. ComfyUI Manager, search "Dehypnotic Save nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Dehypnotic/comfyui-dehypnotic-save-nodes
Restart. No requirements.txt, and since Pillow is already there, nothing else to install.
Common issues
- Files landing in dated folders you didn't ask for -
date_subfolder_patterndefaults to%Y-%m-%d. Clear it for flat output. - External paths blocked - same pack-wide rule as the MP3 and video nodes: output/ only, unless you whitelist roots in
dehypnotic_save_allowed_paths.json(ComfyUI root,config/, oruser/config/) or setDEHYPNOTIC_SAVE_ALLOWED_PATHS. - Heads up: the README announces this repo will be deleted; the maintained home is
Dehypnotic/ComfyUI-Dehypnotic, and the class name staysSaveImagesDehypnotic, so your workflows survive the swap.
If all you ever do is drop PNGs into output/, the core node is fine. This one earns its place when you need batch JPG/WebP exports, filenames you can sort, or workflow metadata embedded in the file.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| file_path | STRING | β | |
| date_subfolder_pattern | STRING | %Y-%m-%d | β |
| filename_prefix | STRING | QIE | β |
| filename_delimiter | STRING | _ | β |
| number_padding | INT | 41β10 | β |
| number_start | INT | 10β1000000 | β |
| extension | COMBO | png | 7 options: png, jpg, jpeg, webp, gif, bmp, +1 |
| quality | INT | 1001β100 | β |
| optimize_image | BOOLEAN | true | β |
| lossless_webp | BOOLEAN | true | β |
| dpi | INT | 3001β1200 | β |
| embed_workflow | BOOLEAN | false | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |
| saved_path | STRING | β |