🖼️💾AGSoft Save Image Plus
Preview a whole batch before you commit — AGSoft Save Image Plus
- images
- images
- width
- height
- filename
- saved_path
Every ComfyUI user has drowned in output/ - fifty near-identical PNGs from a batch of forty-nine that you'd delete if you could. AGSoft Save Image Plus is the cure: it shows you the whole batch as a grid inside the node, with a "Save now" button over each image, so you decide what actually lands on disk. It's a feature-bloated SaveImage from the big Russian-made comfyui-AGSoft utility pack, and if you've ever wanted to pick winners from a run instead of accepting everything, it earns its place at the end of your workflow.
How it works
The trick is a second save mode. Flip save_image to False and the node writes nothing to output/ - each batch image only gets a small temp PNG in ComfyUI/temp/ (the same scratch directory PreviewImage uses). A little JS extension in the pack's web/ folder reads those temp files and draws the grid plus the buttons on the node itself. Click "Save now" on one and it POSTs to a /agsoft/save_now endpoint the node registers, which copies just that image out with your current widget settings. Temp files live in a timestamped name like agsoft_imgplus_<ts>_003.png, so nothing gets clobbered and the grid always refreshes - the node's IS_CHANGED deliberately returns a "always rerun" value so previews regenerate every queue.
One genuinely nice detail: the workflow that gets embedded by "Save now" is serialized from your browser (app.graph.serialize()) at click time, not from the last execution. So you can preview a run with no saves, pick one image three minutes later, and the saved file still carries the live graph that produced it.
The inputs that matter
Most of the ten widgets are the standard saver fare, but these are the ones you'll actually touch:
save_image- the headline switch.Truewrites the whole batch tooutput/immediately (like stockSaveImage),Falseis preview-only until you hit "Save now".output_path- subfolder insideoutput/, e.g.my_projector nestedproject/sub...and absolute paths get stripped, which is a nice safety touch.create_dated_subfolder- on by default, tucks files into aYYYY-MM-DD/folder so yesterday's run doesn't bleed into today's.image_format- PNG / JPG / WebP / BMP, each with its own quality slider (png_compression,jpg_quality,webp_quality). BMP's slider is a no-op; JPG/WebP get quality out of 100.embed_workflow- PNG gets the graph as tEXt chunks (drag it back into ComfyUI to rebuild); JPG/WebP/BMP get a sidecar.jsoninstead, because those formats can't carry the graph.
Outputs are images (passed through untouched), width, height, filename, and saved_path - comma-joined when you save a batch. Wire saved_path into a Show Text node if you want the actual location on screen.
Installing it
Via ComfyUI Manager, search comfyui-AGSoft and install. Or, by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/Art-xmaster/comfyui-AGSoft.git
# restart ComfyUI - the JS preview extension only registers at startup
Restart is not optional: without it the node appears but the preview grid and buttons won't, because WEB_DIRECTORY is loaded on boot. The pack's own requirements.txt is nearly empty (just translators, used by AGSoft Translate), and this node needs nothing beyond Pillow, which ComfyUI already has. Note the pack's pyproject.toml pulls in opencv-python for the video nodes - a ~90MB install you get whether or not you ever touch video. The author documents the pack via the Telegram channel @prompt_by_art; the GitHub README lists 90+ nodes and the AGSoft Empty Latent nodes cover Flux2, QwenImage and Krea2.
Where people get burned
- "temp file missing" when you click Save now - the temp previews are scratch; a ComfyUI restart or temp clean wipes them. Save what you want while the run is fresh.
- Dragging a saved JPG back into ComfyUI won't rebuild anything. The workflow lives in the sidecar
.json, not in the pixels. PNG is the only format that round-trips. - It always reruns. Because of the forced
IS_CHANGED, re-queuing an identical workflow re-saves the whole batch. If you just want fast bulk saving, stockSaveImageis the lighter tool - this node's cost is its superpower. - Batch filenames look different from single saves. A single image saves as
prefix_001.png; in a batch each file gets an extra counter (prefix_1_001.png,prefix_2_001.png), so don't be surprised if thefilenameoutput doesn't match the stock SaveImage scheme.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| save_image | BOOLEAN | true | True = save all batch images to output immediately. False = preview only (temp previews); use the 'Save now' button over each image to save later with current widget settings. --- True = сохранять весь батч в output сразу. False = только превью (temp); сохраняйте позже кнопкой 'Save now' над каждым изображением с текущими настройками виджетов. |
| filename_prefix | STRING | image | Base filename without extension. A number is added automatically (001, 002...). --- Базовое имя файла без расширения. Номер добавляется автоматически (001, 002...). |
| output_path | STRING | Subfolder inside output (e.g. 'my_project'). Nested paths like 'project/sub' are allowed. '..' and absolute paths are stripped. --- Подпапка внутри output (например 'my_project'). Разрешены вложенные пути 'project/sub'. '..' и абсолютные пути отбрасываются. | |
| create_dated_subfolder | BOOLEAN | true | Add a YYYY-MM-DD subfolder inside output_path. --- Добавить подпапку ГГГГ-ММ-ДД внутри output_path. |
| image_format | COMBO | png | Output image format. --- Формат выходного изображения. |
| png_compression | INT | 10–9 | PNG compression: 0=no compression (fast, large files), 6=balance, 9=max compression (slow, small files). --- Сжатие PNG: 0=без сжатия (быстро, большие файлы), 6=баланс, 9=максимум (медленно, маленькие файлы). |
| jpg_quality | INT | 901–100 | JPEG quality: 1=worst (smallest file), 70=balance, 90=high, 100=best (largest file). --- Качество JPEG: 1=худшее (маленький файл), 70=баланс, 90=высокое, 100=лучшее (большой файл). |
| webp_quality | INT | 901–100 | WebP quality: 1=worst, 75=balance, 90=high, 100=best (lossless above 90). --- Качество WebP: 1=худшее, 75=баланс, 90=высокое, 100=лучшее (без потерь выше 90). |
| overwrite_existing | BOOLEAN | false | Overwrite existing files with the same name instead of incrementing the number. --- Перезаписывать существующие файлы с тем же именем вместо увеличения номера. |
| embed_workflow | BOOLEAN | true | PNG: embed prompt+workflow into the image (tEXt chunks, opens on drag&drop). JPG/WebP/BMP: save a separate .json next to the image. --- PNG: вшить prompt+workflow в изображение (tEXt-чанки, открывается перетаскиванием). JPG/WebP/BMP: сохранить отдельный .json рядом с изображением. |
| imagesopt | IMAGE | Image(s) to save. Batch supported — every image gets its own preview and 'Save now' button. --- Изображение(я) для сохранения. Батч поддерживается — у каждого изображения своё превью и кнопка 'Save now'. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| width | INT | — |
| height | INT | — |
| filename | STRING | — |
| saved_path | STRING | — |