Infrared Colour Swap

Darkroom for light you can't see — Real-time WebGL2 GPU Engine
400500600700nm850IR →
Upload an IR/UV Photo

JPEG, PNG, WebP, or RAW. Standard formats load instantly; RAW is decoded from the sensor via AMaZE.

Needs a RAW with the camera's colour data — no effect otherwise.

RECENTLY ADDED

Sharpening, which this tool was missing entirely. Demosaicing interpolates two of every three colour values per pixel, so it always costs some acuity — every raw converter adds it back as a matter of course, and this one never did. That was a large part of why the same file looked softer here than elsewhere. Applied to brightness only, so it can’t turn colour noise into coloured speckle, and scaled by how much local structure a region has: measured, noise at 1–3 levels out of 255 gets no gain at all while a real edge gets the full amount. An overshoot limiter keeps bright edges from clipping into white halos.

Blown highlights are reconstructed rather than left flat. A clipped highlight rarely clips in all three channels at once — whichever channel the white balance gains hardest pins first, while the others still hold real data. Those survivors now refill the pinned one. Where all three did pin there is nothing left to estimate from, so those resolve to neutral instead: previously a sunlit cloud went magenta or cyan before it went white, which was never a look, just the order the channels happened to clip in.

Highlights and Shadows rebuilt. The old version multiplied a wide mask over the image, so at −100 a mid-grey was pulled down 23% along with the sky, and scaling a whole region by one factor flattened the structure inside it — cloud form disappeared. A sweep of the slider grid also found 488 points where the old constants inverted tonal order, making a brighter input come out darker, despite a comment claiming that had been solved. The replacement is monotonic by construction and verified across a 21×21 grid: mid-grey is now untouched, and the gradient close to clipping comes out at 204% of its original slope, so highlight detail is stretched apart rather than compressed together.

Shadow posterisation in RAW decoding. The encode table is indexed by linear value but sRGB is steepest exactly where that table is coarsest, so everything below a threshold collapsed onto one of two outputs, with truncation biasing every sample downward. Now interpolated: worst shadow error drops from 0.80 to 0.004 levels out of 255.

Also tried and removed: a colour-noise reduction pass for RAW files. It worked as designed and was still wrong for this material — on a full-spectrum frame the violet/green separation in foliage is colour, not brightness, so any radius that removed blotching also removed the subject. Pulled rather than left in as a setting nobody should use.

Join the Discord
Filter curves ↗
100%
BEFORE AFTER
hold to compare
◀ BeforeAfter ▶
READOUTScopes — histogram & clipping
highlight shadow gamut pulled won't print
READOUT Source channels — which one carries your signal?

The three channels as loaded, before any swap — which one carries your signal depends on your filter stack.

R
G
B
READOUT Raw sensor data (experimental, diagnostic only)

Looks inside the RAW file’s sensor data. Reporting only — nothing here changes what you see or export.

No RAW file loaded yet.

01 Channel Swap
RGB Channel Swap

Holds the pixel’s original brightness through the swap, easing off only where the new hue can’t physically carry it.

Brightness weighting ▸

Rec.709 assumes green carries the most information, which is often backwards on a converted sensor — IR frequently dominates red or blue instead. Move weight toward whichever channel actually carries the signal in your swap.

from R
from G
from B
offset
total
R out
100
G out
100
B out
100

Holds the pixel’s pre-swap brightness, recovering as far as the gamut allows rather than clipping.

Drag a cell sideways to scrub it, or type an exact value.

Presets

Named by what each one does, not by filter — a 3×3 matrix has no idea what glass was in front of the lens, so the same swap looks different on different filters. Check a button's subtitle for what to expect on yours. Either way, treat it as a starting point: white balance and the sliders below will still need adjusting for your specific photo.

UV Presets
IR Presets
Film stocks & recipes

Fitted to specific reference photos, not to yours — a starting point, not a finished result. Expect to still adjust white balance, exposure, and the targeted colour bands for your own photo's light and filter.

Fedia’s transform for his triple-bandpass filter — measured from that stack, not from film. Replaces the channel swap rather than layering on it, and runs before white balance. On or off, not blended.

My Presets
02 Targeted Colour — optional, applied to the original colours

Fix a colour straight from the camera. It is listed second because most photos never need it, but it still runs before the swap and white balance in the pipeline — so what you pick here is the original colour, not the swapped one.

03 White Balance
Pre-WB: Not set
Post-WB: Not set

Set by Auto tone, or drag directly. Independent of the Post-Swap Neutral picker above — using that, or Clear Post, resets these back to 1.00.

Cool ← → warm · green ← → magenta. Applied after the picker, for pushing a deliberate cast on top of neutral.

04 Light

Exposure pushes evenly and can clip; Brightness lifts the middle and eases off at black and white.

Neither can bring back a channel that clipped in camera — once it reads 1.0, nothing’s left to find.

05 Colour

Perceptual: equal hue steps look equally different to the eye. Channel: matches how a channel swap moves colour, so 120° lines up exactly with a 3-way swap like Cyclic rotation.

Saturation scales every pixel equally; Vibrance weights the boost toward pixels that are still muted.

Trades brightness for richer colour where a hue can't have both.

Tri-tone merge

Three hue-rotated, auto-levelled copies merged by Lighten — a rebuild of the classic Aerochrome action.

Past about 40 the merge starts pulling every hue with it, and near 100 it inverts the swap — foliage turns cyan and the sky magenta. Keep it low unless that is the effect you want.

Split toning

Two tints crossing between dark and bright, added as chroma so brightness stays untouched.

LUT (.cube) — optional colour grade (live)
No LUT loaded — a film-style grade layered on top of the channel swap, shown live in the preview.
06 Detail

Corrections for what the capture chain did — demosaic softening, sensor noise, lens falloff. Judge these at 100%, not by the overall look.

Sharpening

Radius 1.0 suits full-size files. Raise Masking to keep sharpening off flat sky and out of noise.

Noise reduction

Luminance always costs detail. Colour is usually cheaper — but on IR frames the foliage colour is the detail, so it softens more than you’d expect.

Vignette

Centre: 0.50, 0.50 (default)

Positive removes a vignette, negative adds one. Spread sets the untouched radius, Falloff how sharply it ramps past it.

Decode settings for your next photo ▸

Needs a RAW with the camera's colour data — no effect otherwise.

Both apply to the next file you open, not the one on screen.

07 Export
Export format

Batch — apply this look to many files

Processes every file with today’s settings into one .zip. Your current image and adjustments are untouched.

Converting rather than editing? Leave every slider alone and pick a format above — one file or many, this turns RAW into TIFF, PNG or JPEG. Tick use the camera’s embedded preview on the opening screen first if you want the camera’s own colour instead of the raw sensor decode.

Google Analytics cookies are used to count visits.