PixlRGB
A linear RGB working space whose primaries hold every colour there is. Every camera colour and every colour of every standard space is a positive number in it, so an edit sees all of a photograph, and nothing is clipped until PIXL says where. The specification and its ICC profiles are open, under CC BY-SA 4.0.
What PixlRGB is
Every image editor computes in some RGB space. Choose a small one (sRGB, Display P3) and the colours a camera records beyond it are clipped the moment the file is opened. Choose a large one built for film (ACES AP0) and a third of its codes describe light that cannot exist. PixlRGB is the answer PIXL measured its way to:the smallest triangle that holds the whole visible range, with D65 white, in linear light.
- 100%of the visible range inside, and every primary of sRGB, Display P3, Adobe RGB and Rec.2020
- 6.17%of its u′v′ area is not a colour (ACES AP0: 32.7%; ProPhoto, which misses colours too: 11.9%)
- 32-bit floatin PIXL's master, linear, 1.0 at 203 cd/m², light above white kept
PixlRGB is an open standard. Its primaries, its derivation and both ICC profiles are published under the Creative Commons Attribution-ShareAlike 4.0 licence. Anyone can implement it, embed the profiles, or check the numbers. PIXL Engine itself remains closed source.
The gamut map
The CIE 1976 u′v′ diagram spaces colours so that equal distances are closer to equal differences to the eye than the older xy diagram. The curved edge is the spectral locus, every pure wavelength from 380 to 700 nm; the straight edge closing it is the purple line. Everything a human can see is inside. Turn spaces on and off, and point anywhere to read the coordinates and which spaces hold that colour.
The web and most screens (IEC 61966-2-1).
Apple displays, iPhone photos; PIXL’s standard output.
Print and older wide-gamut workflows.
UHD and HDR video (ITU-R BT.2020); PIXL’s PQ/HLG output.
A raw-editing working space (ROMM RGB, D50 white).
ACEScg, the film industry’s working space.
ACES2065-1, the archival space.
PIXL’s working space: the smallest triangle holding every colour.
% = share of the visible range (u′v′ area) inside the triangle.
CamerasEach spectral light from 400 to 680 nm as the camera records it, through its fitted colour matrix (PIXL camera database v1). A 3 × 3 matrix can place a real light outside the visible range; PixlRGB keeps it as recorded.
PixlRGB's green and blue corners lie outside the diagram. That is not a defect: no three real colours can enclose the curved locus, so any space that holds every colour needs at least two primaries that are not colours themselves. What matters is how little room those take, and PixlRGB takes the least of any triangle that does the job.
| Space | Visible range held | Area that is not a colour | White | Used for |
|---|---|---|---|---|
| sRGB | 33.1% | 0.0% | D65 | The web and most screens (IEC 61966-2-1). |
| Display P3 | 41.5% | 0.0% | D65 | Apple displays, iPhone photos; PIXL’s standard output. |
| Adobe RGB | 38.6% | 0.0% | D65 | Print and older wide-gamut workflows. |
| Rec.2020 | 57.0% | 0.0% | D65 | UHD and HDR video (ITU-R BT.2020); PIXL’s PQ/HLG output. |
| ProPhoto RGB | 76.3% | 11.8% | D50 | A raw-editing working space (ROMM RGB, D50 white). |
| ACES AP1 | 58.6% | 0.6% | ACES | ACEScg, the film industry’s working space. |
| ACES AP0 | 99.8% | 32.7% | ACES | ACES2065-1, the archival space. |
| PixlRGB | 100.0% | 6.2% | D65 | PIXL’s working space: the smallest triangle holding every colour. |
Why the working space matters
For some edits it does not. White balance, exposure, saturation and contrast about a grey, done in linear light with true luminance, give the same result in any linear space with the same white: PIXL measured PixlRGB against its previous Rec.2020 working space and found these within one 16-bit code. Everything that acts on the channels one at a time is different: per-channel curves and gamma, a red-only gain, CDL per channel, the channel mixer, HSL bands. Those see "red", "green" and "blue", and which red, green and blue depends entirely on the primaries.
In a narrow space, a colour outside it arrives as a negative channel, and the first such operation clips it, turning its hue. In PixlRGB a real colour never has a negative channel, so a per-channel edit works on the colour the camera saw. The edges are also where the eye is least forgiving: the saturated reds of tail lights, the cyans of tropical water, the violets of flowers.
The definition
The primaries and the white, as CIE 1931 xy chromaticities, are the definition. Everything else is derived from them.
| x | y | |
|---|---|---|
| Red | 0.7360 | 0.2644 |
| Green | −0.3256 | 1.3204 |
| Blue | 0.1414 | −0.0105 |
| White (D65) | 0.3127 | 0.3290 |
Two forms
- Linear.
R,GandBare proportional to light;(1, 1, 1)is white, and values above 1 are light above white, kept. This is the form PIXL computes in, as 32-bit floats. - Integer.
V = L^(1/γ)for0 ≤ L ≤ 1, a pure power with no linear segment, withγ = 144179/65536 = 2.19999695, the s15.16 number nearest 2.2 that an ICC profile can hold. For standard-dynamic-range files at 10 bits or more. Light above white has no integer form; content with headroom is stored as linear floats.
Luminance is Y = 0.33774 R + 0.67539 G − 0.01313 B. Blue's weight is negative, because the blue primary sits below the diagram. A real colour's luminance is never negative; a value pushed outside the visible range can have one, which is one of the ways PIXL tells the two apart.
How the primaries were chosen
- The visible range is the convex hull, in xy, of every wavelength of the CIE 1931 2° observer from 360 to 830 nm at 1 nm. Any mixture of spectral lights lies on a chord between two of them.
- The standard primaries join it. Display P3's red (0.680, 0.320) and Rec.2020's (0.708, 0.292) have
x + y = 1, soZ = 0, which no light has: they sit just outside the visible range (by 1.15 × 10⁻⁴ and 3.9 × 10⁻⁵). Holding them anyway makes every colour of every standard space positive in PixlRGB. - The triangle of least area that holds all of these, measured in u′v′, where equal areas are closer to equally many colours. Each side of such a triangle touches the hull, so a triangle is three directions: every triple on a 1° grid was scored, and the best eight refined by Nelder–Mead. They agree on the least area to 1.5 × 10⁻⁷ of it.
- Rounded outward to four decimals, keeping the smallest u′v′ area that still holds every point.
The result holds the visible range and the standard primaries with a margin of 4.5 × 10⁻⁶ in xy. Five candidate triangles were drawn and compared before this one was chosen; the derivation reproduces the numbers above from the CIE's data.
Ten bits or more
A space this wide spends codes on colours no picture holds, so its integer steps are larger than a display space's. PIXL measured the largest step between neighbouring codes on smooth ramps, in ΔE2000 (1 is roughly the smallest difference an observer sees side by side):
| Bits | Sky | Skin | Neutral | Display P3 sky / skin |
|---|---|---|---|---|
| 8 | 1.38 | 1.39 | 0.41 | 0.71 / 0.78 |
| 10 | 0.34 | 0.34 | 0.10 | 0.18 / 0.19 |
| 12 | 0.086 | 0.086 | 0.026 | 0.044 / 0.048 |
| 16 | 0.0054 | 0.0054 | 0.0027 | 0.0028 / 0.0030 |
At 8 bits a gradient would band visibly, so PIXL refuses to write an 8-bit PixlRGB file it computed (the request names pixel.depth as the field to change), and writes 10, 12 and 16-bit AVIF, PNG, TIFF and JPEG XL. A file that is only copied keeps the bits it had.
Outside the visible range
A space that holds every colour also holds values that are not colours. A strong edit can push a pixel there: double the saturation of a neon sign and its red may leave the locus. PIXL's master runs a guardafter every grade stage: a pixel that was a colour before the step and is not after it is pulled back onto the edge of the visible range, along its line from white, so its dominant wavelength is kept, and with its luminance kept. What was outside before a step (a camera's own estimate, below) is left exactly as it was.
- 29.8%of a photo pulled back after saturation ×2, where a plain clip would turn hues
- 0.86mean ΔE2000 of the result against no guard (p99 5.2); lightness moves at most 2.6
- 0pixels moved by saturation ×0.5, or by any edit that keeps colours inside
A pixel that is positive in Rec.2020 is accepted without a test (Rec.2020's primaries are among the range's vertices), and real colours within 10⁻⁵ of the edge count as inside, so an unedited photograph keeps every bit.
From the sensor in
A raw file holds what the sensor's three filters measured, which is not a colour space. Turning it into colour takes a camera profile, and most software uses one 3 × 3 matrix per camera, made for daylight. PIXL fits its own, from measured spectral sensitivities.
- The data. 52 cameras' sensitivities (rawtoaces-data, Academy Software Foundation), 190 training reflectances, and the CIE's daylight, LED and fluorescent illuminants.
- The fit. A forward matrix per light, minimising mean CIEDE2000 against the reflectances' true colours, with the white held exactly; the colour matrix is derived from it so the two agree at the light's white. Lights: tungsten (A) and daylight (D65), and for 24 cameras a third, fluorescent.
- The bar a camera must clear to be held: mean ΔE2000 ≤ 2 on held-out patches under tungsten and under daylight, p95 ≤ 4 under daylight, and never worse than the matrix it replaces under any of eight lights.
- 46 / 52cameras clear the bar and are in PIXL's camera database v1
- −2.31ΔE2000, median gain under tungsten over the common Adobe-derived matrix
- −1.07ΔE2000, median gain under daylight
Against the archive standards
No open study compares named raw converters on colour accuracy, so we hold PIXL's profiles to the public standards that libraries and archives digitise to. The strictest, FADGI's four-star level, asks for a mean ΔE2000 below 2 and a 90th percentile below 4; the Dutch national library's Metamorfoze asks for a mean of 3 or less.
How to read this. The standards are written for a real chart photographed under studio light and measured. These figures are a simulation: each camera's measured spectral sensitivities, 190 reflectances and the CIE's illuminants, scored on the patches the fit never saw. They show what the profile can do, without the lens, the light and the exposure that a real shot adds. For scale, the X-Rite reference data for a ColorChecker SG, measured with a spectrophotometer alone, already sits 0.59 to 0.82 ΔE2000 from the chart's own values (Kirchner et al., 2021).
The white a profile finds matters as much. On a chart under lights of known colour, PIXL's profiles find tungsten's and daylight's own white exactly; the Adobe-derived matrices miss by 0.014–0.025 in xy, 10–18% warm in kelvin. Every database version is frozen once published and checked by its hash, so a camera's colour never changes under a user's feet.
A 3 × 3 matrix is an estimate: turn on a camera in the map and you can see each one record some spectral lights outside the visible range. Measured through the fitted profiles, every training patch lies inside under daylight; under tungsten one deep red lies outside on all 52 cameras, by up to 0.018 in xy. PixlRGB keeps such a value exactly as the camera gave it; that is what a working space that is wide enough is for.
To every screen out
Nothing leaves PixlRGB by accident. Outputs are made by a conversion PIXL states in its report: Display P3 for standard pictures, Rec.2020 for PQ and HLG (whose signals are defined in Rec.2020's primaries), linear PixlRGB for floating-point masters, or PixlRGB itself in its integer form.
- Gamut compression, in ICtCp. A colour beyond the output's primaries is eased toward its edge along its own hue line in ICtCp (a perceptual space made for HDR), only when the picture needs it, with a soft zone just inside the edge so nothing kinks. On a photo with saturation doubled, hue in ICtCp moved a median 0.00° (p95 0.01°) against a per-channel clip's 0.23° (p95 0.70°). Bright colours inside the gamut are left alone.
- A perceptual HSL. "+30 saturation" in classic HSL moves an sRGB red, a green and a blue by very different amounts: 2.3 to 7.9 ΔE2000, a 3.5× spread, and 6.3× in a linear space. PIXL's perceptual HSL works in ICtCp and is calibrated per band, so +30 is the same visual step, 4.19 ΔE2000, in every one of its eight bands. The classic HSL stays available for presets that depend on it.
Matrices for implementers
Computed from the definition in exact arithmetic, rounded to ten decimals. Where they and the chromaticities disagree in the last place, the chromaticities are right.
Linear PixlRGB → CIE XYZ (D65, Y = 1)
⎡ 0.9401642213 −0.1665451578 0.1768368635⎤
⎢ 0.3377437773 0.6753876729 −0.0131314503⎥
⎣−0.0005109588 0.0026598121 1.0869088975⎦
CIE XYZ → linear PixlRGB
⎡ 0.9768075112 0.2414872446 −0.1560061742⎤
⎢−0.4884438167 1.3598071400 0.0958968251⎥
⎣ 0.0016544875 −0.0032141070 0.9197322996⎦
Linear Rec.2020 → linear PixlRGB (every entry positive)
⎡ 0.6856241563 0.3006112504 0.0137645934⎤
⎢ 0.0461034038 0.8540014684 0.0998951279⎥
⎣ 0.0002094925 0.0238794711 0.9759110364⎦The integer form uses its profile's numbers. Under a pure power the curve is steep near black, and the s15.16 rounding of the colorants alone would move a dark channel by up to 30 16-bit codes. So an implementation of the integer form computes with the colorants PixlRGB.icc states (listed in the specification), and a reader of the profile lands on PIXL's samples exactly.
Download and use
- PixlRGB.icc, the integer form: ICC v4 matrix/TRC, pure power γ 144179/65536, D50 connection space with the Bradford adaptation from D65 in its
chadtag. 948 bytes. SHA-2565fd7896a024c48b11d3c3a65ff1c81491efd44f7e53e4bda87f2dc116616641b. - PixlRGB-linear.icc, the linear form. 960 bytes. SHA-256
bb166ac6637986ad306725ae490591b968d6623d1673c597cdc3ca34ddf7d344. - NOTICE.txt, the attribution to carry.
Neither profile has a chrm tag: its numbers cannot be negative. No CICP code point names PixlRGB, so a file in it is described by its profile, which any ICC v4 colour engine reads.
Licence. The PixlRGB specification and profiles are © 2026 Syed Ali (xuckless), PIXL Foundation, licensed under CC BY-SA 4.0. Use them in any product, free or commercial; credit PixlRGB and PIXL Foundation, and share changed versions under the same licence.
Sources and method
- CIE 2019, Colour-matching functions of CIE 1931 standard colorimetric observer, DOI 10.25039/CIE.DS.xvudnb9b, CC BY 4.0. The diagram's locus and every coverage figure on this page are computed from it (380–700 nm at 5 nm for the drawing; 360–830 nm at 1 nm for the derivation).
- rawtoaces-data (Academy Software Foundation), commit e9b8503, Apache-2.0: the cameras' spectral sensitivities and the 190 training reflectances.
- CIE daylight, LED and fluorescent illuminant tables (DOIs 10.25039/CIE.DS.w7zunnny, .vgssnyfg, .ukaymjdn), CC BY-SA 4.0.
- CIEDE2000 as Sharma, Wu and Dalal write it, held to their 34 published test pairs.
- FADGI, Technical Guidelines for Digitizing Cultural Heritage Materials, 3rd edition, May 2023 (digitizationguidelines.gov; Zenodo record 7929962, CC0): colour accuracy as mean and 90th-percentile ΔE2000, four stars < 2 and < 4, three stars < 3.5 and < 7.
- Metamorfoze Preservation Imaging Guidelines 2.0 (KB, National Library of the Netherlands, April 2025; CC BY-ND 3.0): Metamorfoze level, mean ΔE2000 ≤ 3, maximum ≤ 7.
- Kirchner, van Wijk, van Beek, Koster, “Exploring the limits of color accuracy in technical photography”, Heritage Science 9:57 (2021), 10.1186/s40494-021-00536-x, CC BY 4.0.
- The figures are held by PIXL Engine's tests:
pixlrgb_candidates_are_the_charts,the_published_profiles_are_what_pixl_writes,the_guard_pulls_back_only_what_a_saturation_boost_pushed_out,every_body_fitted_under_a_and_d65, and the gamut-compression suite.