ANDRO Range Stats
See what your VAE actually decoded, not what the clamp let you see
- image
- image
- report
- histogram
- banding_mask
Every number in the comfyui-vae-float32 README came out of this node. Image Range Stats is the measuring stick the pack is built around: it tells you how much of an image batch sits outside [0,1] and how finely the values are actually quantised. Same image in, a report that says whether you're looking at 77 real levels or 3.3 million.
Why does that matter? Because stock ComfyUI decodes in bfloat16 and clamps to [0,1], and neither fact is visible in the graph. The picture looks fine - the numbers are what differ. This node turns "the decode looks fine" into "min=-0.019557 max=+1.018609, 506 744 distinct values in [0.2,0.3]" so you can actually tell whether your float32 pipeline is doing anything.
How it works
It's dead simple under the hood: it scans the batch, reports the min/max and the percentage of samples below 0 and above 1, then runs a precision probe - it counts distinct values and the smallest step inside the [0.2, 0.3] band. That band is deliberate: it's bright enough to be real signal, flat enough that quantisation shows. An 8-bit encode gives you ~26 levels there with step 3.9e-03; the stock bf16 decode gives you 77; float32 gives you hundreds of thousands.
Inputs
Just two, and both are what they look like:
image- any IMAGE batch. Wire it straight offVAEDecodeFloat32or the stock decode.label- a STRING that prefixes the report so you can tell two readouts apart. Do what the README's starter workflow does: run one on the float32 decode and one on the stock decode, labelled "ours" and "stock", and the whole point of the pack lands in one Run.
Outputs
report- the STRING with the range, the out-of-bounds percentages, the precision probe and the tensor's dtype/shape. Read it in the console.image- passes the image through untouched, so you can hang this node mid-chain without a reroute. Handy.
The trap: a measuring node that reports nothing probably never ran
This is stock ComfyUI, not the pack, but it bites exactly here. The little selection strip that appears when you select nodes on the canvas has a ▶ button, and it does not mean Run - it queues only the selected output nodes and drops everything else, reporting success. In the pack's own testing, selecting PreviewImage and hitting ▶ meant both Image Range Stats nodes and the EXR saver silently never executed. A plain Run (the big one in the toolbar) executes every output node. If your stats node goes quiet, check that first before you suspect the node.
Install
ComfyUI Manager (search "comfyui-vae-float32"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/AndreiOrehov/comfyui-vae-float32
Restart, and you're done - this node needs nothing beyond stock ComfyUI. It's one of the pack's zero-dependency members.
The honest use case: this is a diagnostic node, not a deliverable. You reach for it when you're setting up a float32/EXR pipeline and want proof the decode path actually changed anything, or when a grade is banding and you want to know whether the banding is your 8-bit export or your decode. It answers that question in one run, and then it sits in your workflow quietly passing the image through. That's fine. Some nodes earn their keep by being boring.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The batch to measure. It comes back out unchanged, so this node can sit anywhere in a chain. | |
| label | STRING | stats | Free text, printed at the head of the report - so two of these in one graph can be told apart. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | The image, passed through untouched - wire it onward to measure mid-chain. |
| report | STRING | Min/max/mean, percentiles, the share outside [0,1] the stock clamp would delete, the measured quantisation step as EFFECTIVE BITS, and how much of the frame is at risk of banding. |
| histogram | IMAGE | Log-scaled histogram with the [0,1] clamp limits marked in red. Log because the out-of-range tails are a fraction of a percent - on a linear axis they are invisible, which is why people believe nothing is lost. |
| banding_mask | MASK | Where banding will appear first: real gradient, too little noise to dither it. Wire it to a preview to see which parts of the shot need the precision. |