The colour you asked for, and the one you got

Type a colour into the target field and the picture will almost never carry exactly that value. Three things move it, each for a good reason, and the receipt under the swatch says which.

Three reasons, in the order they act

First, hue shift keeps lightness. It borrows the target's hue and leaves every pixel's own lightness where the light put it, so the selection is delivered at its own lightness rather than the target's. That is the mode's whole point — the folds and reflections survive — and it is also why a pale yellow typed onto dark red paint arrives as a dark gold.

Second, chroma is a scale, not a value. Hue shift multiplies the selection's chroma by one factor taken from the ratio of the target's chroma to the selection's mean, capped at 1.6, so washed-out paint does not become neon.

Third, the gamut. Some colours cannot exist at some lightnesses on a screen. Those are brought in by lowering chroma along constant hue and lightness, never by clamping channels, and the receipt prints the share of the selection that needed it.

Four receipts from one painted ramp

The rows below are computed by the engine when this page is built, on a red paint ramp drawn in code — sixty-four steps from shadow to highlight at an OKLCH chroma of 0.17 and a hue of 27°, sampled at its middle.

Asked, got, and the distance between them (ΔE_OK)
TargetAskedGotΔE_OKReduced to fit
teal, hue shift#00999d#0072750.12289.1%
pale yellow, hue shift#f7e785#7164000.42176.6%
saturated blue, absolute replace#0031e3#0031e30.00073.4%
pale yellow, matched#f7e785#f7e7850.00043.8%

Reading the rows

The teal lands close, because its lightness is near the ramp's middle. The pale yellow is far off in hue shift: the ramp cannot be that light without its lightness moving. The saturated blue in absolute replace is too saturated for sRGB at that lightness, so part of the selection is reduced to fit. The last row is the pale yellow again with “match as closely as sRGB allows” on, which moves the selection's lightness and chroma onto the target's and leaves only the gamut.

Why print the difference at all

A receipt that always said “exact” would be lying on most photographs. The difference is printed as ΔE_OK — a plain Euclidean distance in OKLab, labelled as such rather than as the CIEDE2000 figure print shops use — so it can be trusted, compared between jobs, and acted on: keep it, move the target to what the selection can show, or switch on the match.

Back to the swatches

Every pixel is remapped locally — this page has no server to send to.