Difforum · Fill Reveal (AI)
Repaint What the Camera Uncovered
- images
- masks
- model
- positive
- negative
- vae
- images
- info
Parallax has a hard limit that every "living photo" demo quietly papers over: the depth map only describes the original camera view. Move the virtual camera and you reveal background that was never photographed. There is no pixel data there - a depth warp can stretch the border, or leave gray, and neither is scenery.
Fill Reveal is the honest fix. Guide Frames, H3 Shot and Keyframes mark the invented area in a mask; this node repaints only that area with an image model, and keeps the known pixels exactly.
How it does it
Per frame: take the mask (grow it a little into the known image so the seam hides, feather the edge), hand the frame plus mask to ComfyUI's core InpaintModelConditioning, run a normal KSampler on it, decode, then composite the result back through the feather with a soft alpha. seed + frame index seeds each frame differently, so a multi-frame fill doesn't paste the same invention into every hole.
It runs on plain MODEL/VAE/CONDITIONING, which means any image model works. The cleanest seams come from a dedicated inpaint checkpoint - SDXL inpainting, Flux Fill - because those models are trained to read the mask as a condition rather than just "generate here", and the difference shows up exactly at the edges. A regular checkpoint works too; it just leaves more seam.
The inputs that matter
imagesandmasks- the frames with holes, and the mask where 1 means "fill this". That's Guide Frames' default convention, so they wire straight across.frames-all,first,last, orfirst + last. This is the practical dial. Runfirst + lastfor an FL2VA shot,allfor a keyframe set that's about to guide a model. It's one diffusion per frame, so the tip in the tooltip is the whole cost model: only paint the frames a video model will actually see.positive/negative- describe the scene so the fill matches. Inpainting follows the prompt; if the fill is inventing a shopping mall behind your forest, that's a prompt problem, not a node problem.grow(16) andfeather(12) - the seam controls. Grow pushes the mask into the known image so the model redraws a little of the real photo as it blends; feather softens where painted meets original. These are the two numbers to fiddle with, and the classic values (4–12 px of feather for a still image) hold up here.steps,cfg,sampler_name,scheduler- same rules as everywhere else in the pack. Turbo/LCM/DMD2 models want cfg 1–2 and an lcm or euler_ancestral sampler with sgm_uniform; a regular SDXL fill is happy at cfg 4–7.
Outputs
images (the frames, with holes filled) and info - which is a per-frame report of how much of the image it actually filled, plus a "nothing revealed, kept" line on frames where the camera didn't uncover anything. That line matters: it means the mask was empty and the node correctly did nothing instead of doing something.
Install
ComfyUI Manager → search "Difforum", or:
cd ComfyUI/custom_nodes && git clone https://github.com/chillithebillis/Difforum.git difforum
Restart. You need an image model - the pack ships no weights - and the node uses ComfyUI's own InpaintModelConditioning, so nothing extra installs.
Where people get burned
The cost. This is real sampling, one pass per frame, at full resolution. Painting a 240-frame clip with SDXL is a long evening. Check how much is actually revealed first - info on Guide Frames reports the average revealed area - and if it's 8%, consider letting the feedback loop or the video model handle it and save Fill Reveal for the frames that get anchored.
The other one is edge quality. A big grow with a small feather gives you a hard ring where the model's invention meets your photo; a small grow with a big feather bleeds the fill into the parts you wanted preserved. Start at the defaults, look at one frame at 100%, and adjust from what you see - the composite is deterministic, so a single test frame tells you everything.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Frames with holes where the camera uncovered new area (gray from Guide Frames). | |
| masks | MASK | 1 = area to fill (Guide Frames default convention). | |
| model | MODEL | An image model; an inpainting checkpoint (SDXL inpainting, Flux Fill) gives the cleanest seams. | |
| positive | CONDITIONING | Describe the scene so the fill matches it. | |
| negative | CONDITIONING | Negative conditioning (CLIP Text Encode). | |
| vae | VAE | The VAE that matches the model. | |
| frames | COMBO | all | Which frames to paint: all keyframes, or only the first / last (FL2VA). |
| steps | INT | 241–100 | Inpainting steps. |
| cfg | FLOAT | 5.00–30 | Prompt strength. Turbo / LCM / DMD2 models want 1-2; regular SDXL 4-7. |
| sampler_name | COMBO | euler | Sampler. euler / dpmpp_2m for regular models, euler_ancestral or lcm for turbo. |
| scheduler | COMBO | normal | Noise schedule. karras / normal for regular models, sgm_uniform for turbo. |
| grow | INT | 160–256 | Pixels the mask is grown into the known image, to hide the seam. |
| feather | INT | 120–256 | Soft edge, in pixels, where the painted area meets the original. |
| seed | INT | 00–18446744073709550000 | Fill seed; change it for another fill. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| info | STRING | — |