π· Camera Forensic Realism (iPhone 17)
Make renders look like iPhone 17 photos β no model, no API key, just math
- image
- image
You've got a render that's technically photoreal - right subject, right lighting - and it still reads as "AI." Nine times out of ten that's not the model's fault, it's the finish: colors slightly oversaturated, highlights that never roll off, zero noise, no lens falloff. The photorealism playbook fixes that in post - grain, a color cast, a hint of vignette - and that's exactly what this node does, all at once, tuned to one target: what a photo shot on an iPhone 17 looks like.
Despite the name, there's no iPhone involved and no Apple API call. It's an emulation of the phone's image signal processor (ISP) - the white-balance, tone, and color decisions a real camera bakes into every shot - running as pure numpy math on your CPU. No key, no cloud, no model to download. The author's pitch is "no placebo sliders," and v4 actually deleted stages that didn't earn their keep: a fake "Display P3" conversion (mathematically a no-op) got cut, three redundant strength multipliers merged into one master_strength, and three overlapping sharpeners collapsed into a single detail stage.
How it works
Six stages, all operating on float32 in linear or log space:
- White balance - channel gains in linear light, luminance-preserving, so warming the image doesn't brighten it.
- Global tone - exposure, shadow lift, midtone contrast around the 0.18 photographic pivot, plus a Reinhard highlight rolloff that never clips.
- Smart HDR - Durand-style local tone mapping in log-luminance. It splits the image into base + detail, compresses the base, and leaves the detail alone - shadows up, highlights down, without halos.
- Color science - done in Oklab (perceptually uniform), so vibrance boosts muted colors more than saturated ones without hue shift, skin gets a real protection mask, and there's the subtle iPhone signature: cool shadows, warm highlights.
- Detail - two-scale unsharp (fine texture around 1px, mid clarity around 2% of the frame) with tanh halo suppression.
- Optics & sensor - natural
1/(1+krΒ²)Β²vignette in linear light plus photon-weighted grain that gets stronger in shadows, like a real sensor.
Everything runs per-image on the CPU, so it costs zero VRAM. It's fast enough to be a default finisher.
The inputs that matter
There are a lot of them, but you'll actually touch these:
photographic_style- 15 iPhone 17 presets,Standardby default. The moods (Vibrant, Dramatic, Ethereal, the two B&W ones) retune tone and color; the undertones (Amber, Gold, Rose Gold, Cool Rose, Neutral) just steer warmth. They're offsets layered on top of your sliders, so you can keep tuning after picking one.master_strength(0.85) - the single honest blend between original and processed. If the whole look is too much, this is the one knob. The per-stage sliders are absolute; they don't get re-scaled by it.- The
enable_*toggles - one per stage. The fastest way to learn what's doing what is to switch stages off and watch. skin_protection(0.7) - caps skin chroma so faces don't drift orange when you push vibrance. If a portrait looks waxy or over-saturated, this is where you look.grainandvignette- the "shot on a phone" credibility layer. Keepvignettelow (0.25 default; iPhones are well-corrected) or you get Instagram-circle framing.
It takes one IMAGE in and puts one IMAGE out. The standard placement is the last thing before SaveImage: [Generate] β [Upscale] β [FaceDetailer] β [π· Camera Forensic Realism] β [SaveImage]. If you want a film grade on top of the phone look, the pack's own LUT Apply node slots in after it.
Install
Same story as the whole pack - through ComfyUI Manager (search "ComfyUI-CameraForensicRealism") or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/MONKEYFOREVER2/ComfyUI-CameraForensicRealism.git
cd ComfyUI-CameraForensicRealism
pip install -r requirements.txt
Restart ComfyUI and find it under Right-click β Add Node β image/forensic β π· Camera Forensic Realism (iPhone 17). The requirements file is just numpy>=1.24.0 - numpy and torch already ship with ComfyUI. There are no model files to hunt down.
Where people get burned
Honest caveat: this pack is brand new and has essentially zero community mileage yet - nothing on the usual forums, no war stories to crib from. So treat the defaults as a starting point, not gospel. A few things I'd watch: the CPU numpy path is per-image, so it's fine for stills but you'll feel it on long video batches; and if your render is already contrasty, the default highlights of 0.5 can flatten it - drop master_strength before you start fighting individual sliders.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| photographic_style | COMBO | Standard | iPhone 17 Photographic Style. Undertones (Amber/Gold/Rose Gold/Cool Rose/Neutral) steer warmth; moods (Vibrant/Natural/Luminous/Dramatic/Quiet/Cozy/Ethereal/B&W) steer tone+color. Applied as offsets on top of your sliders. |
| master_strength | FLOAT | 0.850β1 | Final blend between original and processed image. One honest mix control β per-stage sliders are absolute. |
| seed | INT | 00β4294967295 | Random seed for grain reproducibility |
| enable_white_balance | BOOLEAN | true | Channel gains in linear light, luminance-preserving (warming doesn't brighten) |
| wb_temperature | FLOAT | 0.12-1β1 | Cool (blue) <----> Warm (orange). iPhone AWB sits slightly warm: ~0.1-0.15 |
| wb_tint | FLOAT | 0.00-1β1 | Green <----> Magenta. 0 = neutral |
| enable_tone | BOOLEAN | true | Linear-light tone: exposure, shadow lift, midtone contrast, filmic highlight rolloff |
| exposure | FLOAT | 0.05-1β1 | Exposure in EV. iPhone meters slightly bright: ~0.05 |
| contrast | FLOAT | 0.15-1β1 | Midtone contrast around the 0.18 photographic pivot. iPhone punch ~0.15 |
| shadows | FLOAT | 0.350β1 | Luminance-masked shadow lift + tiny black-point lift. iPhone never crushes blacks |
| highlights | FLOAT | 0.500β1 | Reinhard soft-knee highlight rolloff β smooth, monotonic, never blows out |
| enable_smart_hdr | BOOLEAN | true | Local tone mapping in log-luminance: compresses the base layer, keeps detail. Like Smart HDR 5 fusion |
| hdr_strength | FLOAT | 0.350β1 | How much local dynamic range compression (shadows up, highlights down β locally) |
| enable_color | BOOLEAN | true | Oklab color rendering: hue-preserving vibrance, skin protection, iPhone split-tone |
| vibrance | FLOAT | 0.400β1 | Smart saturation: boosts muted colors more, leaves saturated ones alone. Hue-preserving (Oklab) |
| skin_protection | FLOAT | 0.700β1 | Real skin mask (Oklab hue ~50Β°) that shields skin from vibrance and caps skin chroma β no orange faces |
| shadow_tint | FLOAT | 0.250β1 | Cool/blue tint in shadows β the subtle iPhone blue-black signature |
| highlight_warmth | FLOAT | 0.200β1 | Golden warmth in highlights β complements the cool shadows |
| enable_detail | BOOLEAN | true | Single coherent detail stage: fine texture + mid clarity, halo-suppressed, luminance-only |
| texture | FLOAT | 0.350β1 | Fine-scale detail (~1px): pores, fabric, hair. The 'computational crunch' |
| clarity | FLOAT | 0.200β1 | Mid-scale local punch (~2% of frame). Keep low for natural look |
| enable_optics | BOOLEAN | true | Lens vignette (linear light) + photon-weighted sensor grain |
| grain | FLOAT | 0.200β1 | Sensor noise, stronger in shadows like a real sensor. iPhone base ISO ~0.15-0.25 |
| vignette | FLOAT | 0.250β1 | Natural 1/(1+krΒ²)Β² illumination falloff applied in linear light. iPhone is well-corrected: keep low |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |