Save Static Image JNK
Save images to any path you want, metadata included
- image
- success
ComfyUI's built-in SaveImage writes into its own /output folder with its own naming scheme, and if you've ever needed an image somewhere else - a project folder, a named file, a path you computed at runtime - you've felt the itch this node scratches. "Save Static Image JNK" takes an image and writes it to an exact file_path you provide, with a PNG/WebP choice, quality control, an optional embedded workflow, and a "don't touch existing files" mode. It's the pack's answer to "let me save where I want, how I want."
The mechanism is where the useful details hide. It converts your tensor to PIL, stamps an EXIF datetime on it (so files carry a capture time), and writes to the path. The format input is a straight PNG-or-WebP choice. Quality works differently per format, which trips people up: for PNG, the quality enum (100/95/90/85/80) is converted into a compression level - 100 means level 0 (no compression), 80 means level 4. For WebP it's a real quality value passed straight through. So "80" is the sensible default for both, but if you want PNG to be lossless-and-big you pick 100, and if you want it small you go lower. The metadata toggle is the party trick: set it to "enable" and it embeds the full prompt and workflow JSON as PNG text chunks (the same metadata that makes ComfyUI workflows shareable in the file itself), so your saved image drags its graph along with it. WebP gets the EXIF but not the workflow chunks.
The skip_if_exists toggle is the one that makes batch workflows safe. Flip it on and if the target file already exists, the node bails out early - it still returns success and shows you a preview, but it refuses to clobber your earlier output. That's the difference between re-running a batch and accidentally overwriting the one good render you'd already saved. The output is a single success boolean, true if the file was written (or skipped), false if saving failed - wire it into a text node or a conditional if you want to know what happened.
The inputs that matter:
- file_path - full destination path, including filename and extension. Directories are created for you.
- format / quality - PNG or WebP, and the quality number.
- skip_if_exists - protect existing files from being overwritten.
- metadata - embed the workflow into the PNG when you care about reproducibility.
Install: ComfyUI Manager β search "JNK" β Install, then restart. Or:
cd ComfyUI/custom_nodes/
git clone https://github.com/Aljnk/ComfyUI-JNK-Tiny-Nodes.git
Then restart. Nothing extra to pip - this node only needs Pillow, which ComfyUI already has.
Gotchas: the quality input is a dropdown of five fixed values, not a free slider - you can't type 92, you pick from the list. Failure mode is silent-ish: on an error it logs ---JNK---> SaveStaticImage_JNK ---> Error saving image to the console and returns false, but it doesn't throw, so your graph keeps running with a lie in the success output if you don't check it. And remember skip_if_exists only protects this node's files - it checks existence, not identity, so a different image with the same filename will also be skipped. If you're building reproducible pipelines, turn metadata on; if you're filling a folder with variations, keep skip_if_exists on so one bad re-run can't eat your good outputs.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| file_path | STRING | β | |
| format | COMBO | png | 2 options: png, webp |
| quality | COMBO | 80 | 5 options: 100, 95, 90, 85, 80 |
| skip_if_exists | BOOLEAN | false | β |
| metadata | COMBO | disable | 2 options: disable, enable |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| success | BOOLEAN | β |