Convert CIELAB back to RGB channels. Because Lab covers far more colors than a screen can show, the tool flags out-of-gamut results instead of silently clipping them — you see the clamped preview and get pointed to a proper chroma-preserving gamut fit.
Settings
Generated locally in your browser — your settings and results never leave this page.
From coordinates to pixels, carefully
This converter finishes what instruments start: a measured Lab triplet becomes a displayable color — or an explicit statement that no faithful display exists. Both outcomes are useful; only the second is usually hidden by converters, which is why “the swatch looked different from the sample” is such a common QC mystery.
Worked example: lab(75% −20 55)
A measured olive-yellow:
inverse Lab response → XYZ(D50) Bradford D50 → D65 matrix → linear sRGB → gamma lab(75% −20 55) → about #b4c054 (in gamut)
Push chroma to lab(75% −20 95) and green-channel math exceeds 1.0 — a yellow-green beyond sRGB. The clamped preview shifts hue visibly; the flagged warning plus Gamut Mapper route preserves it at reduced chroma. Choosing which compromise, consciously, is the whole game.
Sources of Lab values in the wild
Spectrophotometer readings, print-standard documents (ISO 12647 targets), color-management literature, big-brand guidelines — and now stylesheets, since lab() ships in browsers. Each source arrives with D50 assumptions this pipeline honors.
Verification habits
Sanity anchors: lab(100% 0 0) must yield #ffffff, lab(0% 0 0) black, and any a*=b*=0 input a neutral gray. This implementation asserts those identities in tests; they are also the fastest way to audit any other converter you meet.
Reference values, computed live
Going from coordinates back to channels benefits from worked anchors. Seven colors whose Lab values, fed to this converter, reproduce the RGB shown — a round-trip you can verify line by line:
| Color | LAB | RGB |
|---|---|---|
| indigo | lab(19.7% 47 -54.3) | rgb(75, 0, 130) |
| gold | lab(87.5% 2.9 86.6) | rgb(255, 215, 0) |
| teal | lab(48% -30.4 -9) | rgb(0, 128, 128) |
| slateblue | lab(44.6% 29.7 -58.7) | rgb(106, 90, 205) |
| sienna | lab(44.3% 30.9 36.3) | rgb(160, 82, 45) |
| yellowgreen | lab(76.8% -33.1 65.6) | rgb(154, 205, 50) |
| dodgerblue | lab(58.4% 0.9 -64.8) | rgb(30, 144, 255) |
Every row here is in-gamut, which is why the round trip is exact. The interesting failures live off this table: raise any row’s chroma components by half and several exit sRGB entirely — the situation where this page’s out-of-gamut warning, rather than a silent clip, becomes the feature you chose it for.
How to use the LAB to RGB Converter
- Enter the Lab color in CSS or bare-number form.
- The result updates live as you type – no convert button needed.
- If the gamut warning appears, follow it to the Gamut Mapper rather than trusting a clip.
- Copy the value with the copy button, or switch the output format dropdown for other export shapes.
Frequently asked questions
Why is LAB to RGB the risky direction?
Lab is a superset: roughly two-thirds of its usable volume has no sRGB counterpart. The math always returns channel numbers, but they may be negative or above 255 – not displayable. This converter says so explicitly instead of clamping quietly like most.
What does clamping do to an out-of-gamut Lab color?
Truncating channels distorts everything at once – hue shifts, lightness jumps. The proper fix reduces chroma along constant hue and lightness until the color fits, which is what the linked Color Gamut Mapper implements (the CSS-style approach).
Which Lab colors convert cleanly?
Anything measured from a screen, obviously, and most muted-to-moderate colors: neutrals, pastels, earth tones. Trouble concentrates in high-chroma regions – saturated cyans, violent magentas, laser greens.
How can I tell how far out of gamut my Lab color is?
Convert it here and compare the requested chroma with what survives mapping – or paste it into the sRGB Gamut Checker, which verdicts a whole list at once and shows each nearest fit.
Is lch() just Lab in disguise?
Yes – same space in polar coordinates: chroma = √(a²+b²), hue = atan2(b, a). Editing chroma/hue is more intuitive than a/b, which is why the LCH Color Converter exists alongside this one.
Do all browsers render lab() CSS the same way?
Modern ones follow the same spec pipeline this tool uses; differences appear only in how out-of-gamut colors get mapped to a given display, an area the CSS working group standardized late. A hex fallback sidesteps the variance for critical UI.
What happens with L* above 100 or below 0?
The tool rejects them: L* is defined 0-100 and values outside are typos, not colors. a* and b* have soft limits – large magnitudes parse but will land far outside any display gamut.