Photo Matte
The last step between AI image and believable photo
- image
- mask
- image
- mask
- photo_matte_info
The gap between "AI image" and "photo" is rarely the model - it's the tone curve. AI renders tend to come out with a certain digital flatness: lifted blacks, crushed highlights, over-saturated midtones. x1PhotoMatte is a one-node filmic grade that fixes exactly that, in the same spirit as a print stock or a matte-paper profile. It's the pack's VFX/Photo branch finishing tool, and it's the node I'd reach for when a render looks close but won't quite pass as real.
The photorealism knowledge doc makes the point this node leans on: realism is mostly a post-processing problem, and the community's standard recipe is grain + grade + subtle motion cues. x1PhotoMatte is the grade half. It's deterministic, instant, and costs nothing - no re-roll, no seed lottery.
How it works
The settings tell you exactly what kind of tone curve it applies:
black_lift(0.10) - lifts the shadows so blacks don't crush to digital zero, the single biggest "printed on paper" tellwhite_compress(0.14) - rolls off the highlights instead of clipping them, which is what film does that digital doesn'tcontrast_softness(0.22) - shapes the S-curve so the midtone punch comes without the plasticky contrast of a hard curvesaturation_soften(0.14) - tames over-saturated colors, especially in highlights where AI loves to bloomwarmth(0.04) - a whisper of warmth, the standard "this was shot on real film/light" nudgemix(1.0) - overall wet-dry blend
Everything in a settings_json string, per the pack's house style. The defaults are a tasteful starting point - this is "print it" as a default, not "Instagram filter."
Inputs and outputs
Required: image and settings_json. Optional: mask for applying the matte to part of the frame only (grade the subject, keep the background as-is).
image- the finished, filmic imagemask- the effective influence maskphoto_matte_info- summary string of resolved settings
Where it slots in
It's designed to sit at the very end of a finishing chain. A typical run: generation → x1Film or x1DenoiseDetail for texture → x1PhotoMatte for the tone curve → grain (the pack's x1Film covers grain) → save. The VFX/Photo branch is one of the more cohesive families in this pack, and Photo Matte is its center of gravity because it's the "make it feel like film" step that everything else orbits.
A practical note: the defaults are subtle by design. If you want the effect to actually read on a hero frame, black_lift and white_compress are the two to nudge - bumping warmth alone will just make it orange, and nobody wants that.
Installing it
ComfyUI Manager (search "MKRShift Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart and it's live. No requirements, no model downloads, no ffmpeg - it's a deterministic numpy tone curve. The usual caveat: the pack is a big repo and you're installing it for a small node. If you do finishing work, the whole VFX/Photo branch justifies the install.
Where people get burned
Expecting a before/after miracle at mix 1.0 with default settings. Photo Matte is a grade, not a filter - on a well-exposed image it looks like "slightly nicer film," which is the point. Crank it if you want it loud, but judge it at defaults first. And if your image already has crushed blacks, black_lift can't recover detail that isn't there - it can only lift the floor.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"black_lift":0.1,"white_compress":0.14,"contrast_softness":0.22,"saturation_soften":0.14,"warmth":0.04,"mix":1.0,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| photo_matte_info | STRING | — |