ComfyUI Node
BD Bulk Save
Save N inputs in ONE Run using a save context. Wire BD_DerivePBR's 7 outputs to input_1..input_7, set labels accordingly, and all 7 files save in a single Run. No queueing. Replaces N parallel BD_SaveFile nodes for batch save scenarios.
BD Bulk Save
- alpha_mask
- input_1
- input_2
- input_3
- input_4
- input_5
- input_6
- input_7
- input_8
- input_9
- input_10
- input_11
- input_12
- input_13
- input_14
- input_15
- input_16
- saved_count
- filepaths
- status
◄labelsalbedo
normal
roughness
metallic
ao►
◄label_prefix_►
◄context_id►
◄formatpng►
◄jpg_quality95►
◄skip_if_existsfalse►
◄custom_vars►
◄save_alpha_separatelyfalse►
◄invert_alphafalse►
Category🧠BrainDead/Cache
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| labels | STRING | albedo normal roughness metallic ao | One label per line, aligned with WIRED inputs (after skipping empty slots). If labels list is shorter than wired inputs, missing labels save with empty suffix. |
| label_prefixopt | STRING | _ | Prepended to each label before becoming the save suffix. Default '_' so label='albedo' → suffix='_albedo' → file ends in '_albedo'. |
| context_idopt | STRING | Match a BD_SaveContext id. Empty + exactly one context registered = auto-pick. | |
| formatopt | COMBO | png | 3 options: png, jpg, webp |
| jpg_qualityopt | INT | 951–100 | — |
| skip_if_existsopt | BOOLEAN | false | If True, don't overwrite existing files (still reports their path). |
| custom_varsopt | STRING | Extra variables applied to ALL bulk-saved files in this batch. One per line as key=value. Layered ON TOP of the context's custom_vars. Examples: subfolder=PBR materials=metal pass=4k Become %subfolder%, %materials%, %pass% in the template. Empty values OK. | |
| save_alpha_separatelyopt | BOOLEAN | false | Also write the alpha channel as a standalone greyscale PNG alongside the main file, named with the same suffix + '_alpha'. Source of the alpha pixels: • alpha_mask wired → uses the mask (after invert_alpha) • no mask wired, image has 4 channels (RGBA) → extracts the embedded A channel • no mask wired, image is RGB (3ch) → no alpha to extract; this output is skipped NOTE: the _alpha.png is a RAW greyscale representation — white pixel = opaque area, black pixel = transparent area. It is NOT a composited preview; open the main RGBA PNG in a viewer that supports transparency to see the actual cut-out. |
| alpha_maskopt | MASK | Bake this mask into the saved file's alpha channel before writing. Convention: WHITE (1.0) = OPAQUE, BLACK (0.0) = TRANSPARENT. Face mask (white face, black background) → face is opaque, background is cut out. Background mask (white background, black face) → use invert_alpha=True. If you already have an RGBA image (4-channel), you do NOT need to wire alpha_mask — the embedded alpha is preserved automatically when saving. The upstream image tensor is NOT modified — transparency is baked only in the saved file. Accepts batched masks (B, H, W); single (H,W) or (1,H,W) applies to all frames. | |
| invert_alphaopt | BOOLEAN | false | Flip the mask polarity before baking as alpha. Use when your mask has white=background / black=subject and you want the subject opaque. |
| input_1opt | * | Input slot #1. Wire any data type. Empty slots are skipped. | |
| input_2opt | * | Input slot #2. Wire any data type. Empty slots are skipped. | |
| input_3opt | * | Input slot #3. Wire any data type. Empty slots are skipped. | |
| input_4opt | * | Input slot #4. Wire any data type. Empty slots are skipped. | |
| input_5opt | * | Input slot #5. Wire any data type. Empty slots are skipped. | |
| input_6opt | * | Input slot #6. Wire any data type. Empty slots are skipped. | |
| input_7opt | * | Input slot #7. Wire any data type. Empty slots are skipped. | |
| input_8opt | * | Input slot #8. Wire any data type. Empty slots are skipped. | |
| input_9opt | * | Input slot #9. Wire any data type. Empty slots are skipped. | |
| input_10opt | * | Input slot #10. Wire any data type. Empty slots are skipped. | |
| input_11opt | * | Input slot #11. Wire any data type. Empty slots are skipped. | |
| input_12opt | * | Input slot #12. Wire any data type. Empty slots are skipped. | |
| input_13opt | * | Input slot #13. Wire any data type. Empty slots are skipped. | |
| input_14opt | * | Input slot #14. Wire any data type. Empty slots are skipped. | |
| input_15opt | * | Input slot #15. Wire any data type. Empty slots are skipped. | |
| input_16opt | * | Input slot #16. Wire any data type. Empty slots are skipped. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| saved_count | INT | — |
| filepaths | STRING | — |
| status | STRING | — |