H3 • Render Image
One frame, 50 steps, and the trick that kills the banding
- image_job
- image
- run_info
What it's for
This is where the image actually happens. It takes the job prepared by H3 • Text to Image or H3 • Image Edit and does two things: samples one latent frame, then decodes it into exactly one picture. Everything you'd expect a sampler to own lives here - steps, seed, sampler, scheduler - and everything you'd expect a loader to own does not.
If you've read the pack's older guides, this is the point where things got simpler. Frame counts, frame selection, decoder mode pickers: gone. One frame in, one image out.
How it works
Sampling runs through ComfyUI's own SamplerCustomAdvanced, fed by a BasicGuider and the prepared conditioning, with sigmas computed from your scheduler and step count. Because the latent is one frame of H3's video stream, no video packet is ever sampled. The load-bearing bit is the decode.
The problem: H3's VAE expects temporal context. Hand it a single frame and the stock lone-token decode gives you banding - that fine horizontal striping people blamed on the model. The fix is borrowed, with permission and attribution, from Fizgig H3 Still: the latent is repeated to five frames at decode time only, decoded as a group, and the middle frame is kept. The diffusion model still only ever sampled one frame - nothing is being faked as a video. You just give the VAE a couple of neighbours to lean on, then throw them away. The decoder ships inside this pack, so there's no separate Fizgig install and no extra dependency.
The inputs that matter
image_job - from Text to Image or Image Edit. That's the only wire in.
steps - always manual, 1 to 200, default 50. Fifty is Fizgig's no-Turbo still recipe and it's a genuinely slow setting; it's a starting point, not a law. With the Larry v4 adapter at strength 0.38 the paired recipe is 20 steps, and going below that without a distilled adapter just buys you mush. Fewer steps trade quality for speed, always.
seed - 42 by default, with control_after_generate attached, which means the usual ComfyUI trap applies: the number in the box after a run is the seed for the next run. Find a keeper, set it to fixed, and understand you may already have lost the one you liked. The useful part here is the caching: changing only the seed or the steps reuses the cached prompt and reference preparation upstream, so iteration is cheap.
sampler_name and scheduler are optional and advanced, defaulting to er_sde and simple. That pair is the Fizgig still starting recipe, and the honest advice is to leave them alone unless you're running a controlled comparison. The scheduler works with the loaded H3 model's native flow shifts; swapping schedules on a flow-matching model is the classic way to make everything look worse for no reason.
The outputs
image - exactly one image. Straight into Save Image or Preview Image; no slicing, no picking.
run_info - a string, and much more useful than it sounds, especially since a browser-side preview never shows it. Wire it to any string display node and you get the receipt:
2048x1536 | one sampled latent frame | 50 steps | seed 42 | er_sde/simple |
1 reference(s) | sample 61.24s, decode 4.10s |
model minimax_h3_fl2va_pruned_int8_convrot.safetensors | LoRAs minimax_h3_turbo_v4_step600_ema @ 0.38
That's the actual canvas after rounding, the reference count, both timings split out, and - the genuinely handy part - every LoRA and strength that was applied. Chain three adapters, something looks wrong, and this tells you what the graph really loaded rather than what you think you set. Model loading and cached preparation are excluded by design, so the numbers mean "sampling and decode", not "how long you waited".
Install
ComfyUI Manager, search "MiniMax H3 Image Studio", or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/astropuzzo/ComfyUI-MiniMax-H3-Image-Studio
Restart and refresh. ComfyUI 0.37.0 or newer - the pack's dynamic inputs need it, and the decoder leans on current VAE internals. No Python dependencies; requirements.txt is empty by design. The only things you must download are the three H3 model files: the FL2VA diffusion model, the Qwen3-VL encoder, and the H3 video VAE into models/vae/.
Where people get burned
"Use the official H3 video VAE and update ComfyUI. An image VAE is not required." That's the decoder refusing to run against the wrong VAE. It's not a missing-file error, it's a wrong-file error, and the fix is the video VAE - not the image VAE some older H3 guides mention.
"Render Image expects one H3 latent frame, not a video packet." You've fed it something else - usually a stock latent or a video-shaped job rather than the pack's H3_STILL_JOB.
OOM at high megapixels. The usual answer, and it's in the right order: lower megapixels, use a supported quantized checkpoint, and let ComfyUI's native offloading do its job. Tiled decoding isn't a fix for the diffusion model not fitting.
Steps feel arbitrary. They are, a bit. 50 without an adapter, 20 with Larry v4 at 0.38, and the run_info string will tell you which one you actually ran.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image_job | H3_STILL_JOB | Connect Text to Image or Image Edit. | |
| steps | INT | 501–200 | Always manual. Start at 50 without a LoRA, or 20 with the optional Larry v4 adapter at 0.38 (Fizgig's still recipe). Fewer steps trade quality for speed. |
| seed | INT | 420–18446744073709550000 | Seed for repeatable sampling. Changing only seed or steps reuses cached prompt/reference encoding. |
| sampler_nameopt | COMBO | er_sde | ER-SDE is the Fizgig still starting recipe. Change only for controlled comparisons. |
| scheduleropt | COMBO | simple | Simple is the starting schedule. Uses the loaded H3 model's native flow shifts. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Exactly one image. Connect directly to Save Image or Preview Image. |
| run_info | STRING | Actual canvas, steps, seed, sampler, reference count and sampling/decode seconds; excludes model loading and cached preparation. |