Save Image Private (GeN13)
Save Image Private (GeN13) writes PNG + JPG in one pass and covers the preview while it does
- images
- IMAGE
- width
- height
Core Save Image gives you a filename prefix and a counter. That's it. No format choice, no quality setting, no way to also get a JPEG for the client while keeping the PNG with the workflow inside it, and - if you're presenting or streaming - a big clear preview of whatever you just made sitting on the canvas.
Save Image Private (GeN13) fixes all three at once. It saves PNG, JPG, BMP, or PNG + JPG together under the same number, with a quality and compression control, and the node preview can be hidden behind a mosaic, frosted, gradient, palette or solid cover that you hold down to peek through.
The PNG + JPG thing is the real feature
Here's the tension it solves, and it's old: PNG carries the workflow, JPG doesn't. Drag a ComfyUI PNG back onto the canvas and the graph reconstructs itself, metadata and all - that's the whole "the image is the project file" convention this ecosystem runs on. JPEG has no PNG text chunks, so the moment you convert for a client or a web upload, the graph is gone. Post it to a host that recompresses and the graph is gone anyway.
Choosing PNG + JPG writes both at the same sequence number, so PRIVATE/img_00042_.png and PRIVATE/img_00042_.jpg sit next to each other: the archive copy with the reproducibility in it, and the small copy you actually send. The tooltip says it explicitly - the PNG embeds the workflow, the JPG does not. Keep the PNGs. Future you will want the seed.
Fields
save- ON writes tooutput/; OFF keeps only a temporary preview, like Preview Image. Nice touch: it turns the node into a preview node without rewiring.filename_prefix- takes subfolders, soPRIVATE/imgwrites intooutput/PRIVATE/. The counter continues from the highest matching number already in that folder instead of restarting at 1.format-PNG,JPG,BMP,PNG + JPG.padding- counter digits, 1–10; 4 gives you0001.jpg_quality- 1–100, default 95. For client delivery, 90–95 is the useful band; below 80 you're paying for it in skin gradients.png_compression- 0–9, lossless either way. Higher is smaller and slower. Default 4 is a reasonable middle; 9 on a 4K batch is a genuine time cost for a modest saving.
Outputs are a passthrough, which is the pattern that keeps chains tidy: IMAGE unchanged, plus width and height for the first image of the batch. So you can save mid-graph and keep going without a fan-out.
The privacy cover
Same frontend machinery as the pack's other Private nodes: a preview panel with mosaic (8 cells on the long edge), frosted glass, gradient, palette and solid options, drawn over the preview only. The image file is untouched - the README is explicit that this hides the on-screen preview and nothing else.
Two things to set before you rely on it: privacy defaults to OFF, and the settings live in the node's properties, which means they're saved with the workflow but never sent in an API prompt. If your setup is headless, there's nothing to hide and nothing to configure.
While a run is going you also get the last saved file's name in the node's status area, which is more feedback than core Save Image gives you.
Installing
Manager → search GeN13 → install → restart. Manual install:
cd ComfyUI/custom_nodes
git clone https://github.com/heigen13/ComfyUI-GeN13
pip install -r ComfyUI-GeN13/requirements.txt
requirements.txt has exactly one entry, nvidia-ml-py, used by the pack's monitor strip. Saving is Pillow, which ComfyUI already has. No model downloads. Portable build: python_embeded\python.exe -m pip install -r ....
Where it bites
If you need CivitAI to auto-detect your model and LoRAs from the metadata, this node writes the ComfyUI workflow/prompt chunks, not an A1111-style parameters string - the same limitation as core Save Image. Resource auto-linking on upload wants the flat A1111 block, so keep a metadata-specific save node around for that job.
And the passthrough is genuinely passive: it's not a "save and continue at higher precision" node, it hands you back exactly what you gave it. Which is fine and is what you want, but don't expect the save to have altered anything.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Images: a single image or a batch to save. | |
| save | BOOLEAN | true | Save: SAVE writes to output; PREVIEW only keeps a temporary preview, like Preview Image. |
| filename_prefix | STRING | ComfyUI | Filename prefix: may include subfolders, such as PRIVATE/img. |
| format | COMBO | PNG | Format: PNG + JPG saves both under the same number; WEBP can be lossless or lossy. |
| padding | INT | 51–10 | Counter digits: the file number is zero-padded to this width; 4 gives 0001. |
| jpg_quality | INT | 951–100 | JPG quality: higher values give better quality and larger files. |
| png_compression | INT | 40–9 | PNG compression: lossless; higher values give smaller files but slower saving. |
| metadataopt | COMBO | embed | Metadata: embed writes the prompt and workflow into PNG and WEBP; strip saves pixels only. |
| png_bit_depthopt | COMBO | 8 | PNG bit depth: 16 keeps the full precision of the decoded image for grading. |
| webp_losslessopt | BOOLEAN | false | WEBP lossless: ON keeps every pixel; OFF uses webp_quality. |
| webp_qualityopt | INT | 901–100 | WEBP quality: lossy only; higher values give better quality and larger files. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | Image: passed through unchanged for further nodes. |
| width | INT | Width: image width in px; for a batch, the first image. |
| height | INT | Height: image height in px; for a batch, the first image. |