L’intera libreria: 221 spazi, 71 kB con gzip – da qualsiasi spazio a qualsiasi altro, in entrambe le direzioni.
npm install color-space
import space from 'color-space' space.rgb.oklch(255, 128, 0) // → [0.732, 0.186, 53] space.oklch.rgb(0.65, 0.1, 180) // → [56.14, 162.97, 145.41] space.oklch.range // [[0,1], [0,0.4], [0,360]]
Oppure un solo spazio: il bundle non contiene altro.
import oklch from 'color-space/oklch.js' oklch.rgb(0.65, 0.1, 180) // → [56.14, 162.97, 145.41]
Tipizzato: le dichiarazioni TypeScript sono incluse nel pacchetto, per l’intera libreria e per ogni spazio da solo.
Per immagini intere e buffer lunghi: 54 spazi, 53 kB con gzip, da 1.4 a 4.8× più veloce del batch JS sulle 26 conversioni misurate.
import space, { alloc } from 'color-space/wasm'
space.oklch.rgb(0.72, 0.16, 41) // → [246, 125, 79]
const buf = alloc(n) // n×3 Float64Array
space.rgb.oklch(buf) // in place
Il modulo non importa nulla, quindi gira ovunque giri WebAssembly: browser, Node, Deno, Bun – e Python, Rust o Go tramite wasmtime o wasmer.
import struct
from wasmtime import Store, Module, Instance # pip install wasmtime
store = Store() # color-space.wasm: the npm package's dist/
cs = Instance(store, Module.from_file(store.engine, 'color-space.wasm'), []).exports(store)
at = cs['alloc'](store, 1.0) & 0xFFFFFFFF # the buffer: n×3 float64 in the kernel's memory
cs['memory'].write(store, struct.pack('3d', 255, 128, 0), at)
cs['rgb_lrgb_n'](store, 1.0) # in place, edge by edge: rgb → linear rgb → oklab
cs['lrgb_oklab_n'](store, 1.0)
struct.unpack('3d', cs['memory'].read(store, at, at + 24)) # (0.732, 0.112, 0.148)
Spazi rgb, lrgb, xyz, xyz-d50, xyy, lms, p3, p3-linear, rec2020, rec2020-linear, a98rgb, a98rgb-linear, prophoto, prophoto-linear, rec709, hsl, hsv, hwb, oklab, oklrab, oklch, oklrch, lab, lchab, lab-d65, lch-d65, din99o-lab, din99o-lch, luv, lchuv, hsluv, hpluv, cam16, hct, ycbcr-bt709, ycbcr-bt2020, jzazbz, jzczhz, ictcp, ictcp-hlg, ipt, din99d, acescg, acescct, acescc, awg3, logc3, logc4, slog3, vlog, log3g10, clog2, ryb, munsell
Tutti i 221 spazi come funzioni shader. Una conversione in rgb restituisce 0–255, come in JavaScript: dividi per 255 per un colore di frammento.
WebGL e OpenGL: GLSL.
import { glsl } from 'color-space/gl'
import oklch from 'color-space/gl/oklch'
const frag = `#version 300 es
precision highp float;
${glsl(oklch, 'rgb')}
out vec4 color;
void main() { color = vec4(oklch_rgb(vec3(0.7, 0.15, gl_FragCoord.x)) / 255.0, 1.0); }`
WebGPU: WGSL.
import { wgsl } from 'color-space/gl'
const code = wgsl(oklch, 'rgb') + `
@fragment fn main(@builtin(position) p: vec4f) -> @location(0) vec4f {
return vec4f(oklch_rgb(vec3f(0.7, 0.15, p.x)) / 255.0, 1.0);
}`
DirectX, Unity e Unreal: HLSL. Metal: MSL. Entrambi generati dal WGSL con naga, una dipendenza opzionale.
import { hlsl } from 'color-space/gl/hlsl' // npm i naga-wasm
import { msl } from 'color-space/gl/msl'
await hlsl('oklch', 'rgb') // float3 oklch_rgb(float3)
await msl('oklch', 'rgb') // metal::float3 oklch_rgb(metal::float3)Converti il girato nel tuo editor: scegli due spazi e scarica un .cube per Resolve, Premiere, Final Cut, OBS o ffmpeg. Le conversioni dei log di camera corrispondono alle trasformazioni ACES ufficiali dell’Academy.
Per usare uno spazio in Photoshop, nella gestione del colore del tuo sistema, in lcms o in ImageMagick, scaricalo come profilo .icc. Gli spazi RGB si possono usare come spazi di lavoro in Photoshop; gli altri convertono tramite una tabella di lookup.
Per agenti IA: chiamano conversioni verificate invece di indovinarle.
npx -y color-space mcp
// Claude Code
claude mcp add color-space -- npx -y color-space mcp
// VS Code
code --add-mcp '{"name":"color-space","command":"npx","args":["-y","color-space","mcp"]}'
// Claude Desktop · Cursor · .mcp.json
{ "mcpServers": { "color-space": { "command": "npx", "args": ["-y", "color-space", "mcp"] } } }Riempimenti e tratti della selezione in uno qualsiasi dei 221 spazi – un piano e una barra per canale, ritagliati sul gamut del file; copia il colore come CSS.
Tutti i colori del file – CSS, Swift, Flutter, Compose, Unity, design token – in uno qualsiasi dei 221 spazi, con un piano e una barra per canale; ogni modifica viene riscritta nella notazione propria del colore.
Un sistema di coordinate per il colore: assi, intervalli e una regola che collega i numeri alla luce misurabile. La visione umana è tricromatica, con tre tipi di coni (S, M, L), quindi tre coordinate sono il minimo per descrivere qualsiasi colore visibile all’occhio. Lo stesso arancione è rgb(255 128 0), oklch(0.732 0.186 53) e XYZ [49, 36.7, 4.5]. Una tavolozza è una selezione di colori; uno spazio permette di descrivere qualsiasi colore.
Un modello di colore definisce le componenti con cui descrivere un colore: tre primari in RGB, tinta, saturazione e chiarezza in HSL, quattro inchiostri in CMYK. Uno spazio colore specifica inoltre i primari, il punto di bianco e la curva di codifica, così che ogni insieme di valori corrisponda a un colore misurabile. Per questo rgb(255 0 0) indica rossi diversi in sRGB, Display P3 e Adobe RGB: un modello, tre spazi.
Nell’uso comune si chiamano entrambi spazi, anche in color-mix(in hsl, …) di CSS e in questo catalogo. Un modello può basarsi su uno spazio già definito: qui HSL e HSV usano sRGB come riferimento, come in CSS.
Dipende dal compito:
Per vedere tutti gli spazi ordinati per compito, raggruppa il catalogo per uso.
OKLCH. Mantiene gli stessi tre parametri – tinta, croma, chiarezza – ma la sua chiarezza è affidabile: in HSL il giallo a L=50 emette circa 13 volte la luce del blu a L=50, quindi L uguale non significa luminosità uguale. In OKLCH sì. CSS supporta oklch() nativamente.
Digitalo o incollalo nel campo colore in alto, per esempio #ff8000. Ogni spazio della pagina mostra subito quel colore; in OKLCH vale 0.732, 0.186, 53, che CSS scrive oklch(0.732 0.186 53). La scheda css di ogni spazio dà la forma da copiare, e nel codice è space.rgb.oklch(255, 128, 0).
Perché sono calcolati in sRGB codificato con gamma, dove la media dei numeri di due colori produce una luce più scura e spenta di quella che darebbe mescolare davvero le loro luci. Interpolare in OKLab lo evita; in CSS si scrive linear-gradient(in oklab, red, blue). La riga interpola verso della scheda di ogni spazio disegna la stessa sfumatura attraverso due spazi affiancati, così vedi la differenza prima di scegliere.
Apri lo spazio log della tua camera, come S-Log3, LogC4 o Apple Log. Nel suo blocco LUT scegli Rec. 709 e il tuo programma: DaVinci Resolve, Premiere Pro, Final Cut Pro, OBS, ffmpeg e altri. Il file .cube viene generato direttamente nel browser. È una conversione tecnica senza tone mapping: le alte luci oltre il bianco diffuso vengono tagliate, e il look lo aggiungi tu.
Un colore che uno spazio può descrivere ma un altro – o il tuo schermo – non può mostrare. Un verde Display P3 acceso non esiste in sRGB: convertilo e i numeri escono dall’intervallo valido. L’atlante lo rende sempre visibile: un ⚠ accanto al colore corrente segnala che è fuori dal Limite scelto, tenendo premuto Alt su un piano o una striscia si vede quale gamut più ampio serve a un colore in quel punto (P3, Rec. 2020), e i tratti fuori intervallo compaiono in trasparenza su una scacchiera.
Uno schermo emette luce; la carta riflette ciò che i suoi inchiostri non assorbono. Con l’inchiostro su carta si ottengono meno colori vividi – i blu, i verdi e i rossi RGB saturi non rientrano nel suo gamut – e quindi in stampa risultano più spenti. In prestampa si converte con un profilo ICC specifico per la macchina da stampa e la carta, come FOGRA39 per la carta patinata europea o GRACoL negli Stati Uniti. Il CMYK di questo catalogo è la formula semplice che CSS usa per device-cmyk() senza profilo: corretta nei valori, ma non è una prova colore.
Per il web e la condivisione, sRGB: browser e telefoni lo danno per scontato quando un file non contiene un profilo. Display P3 conserva più colori di una scena vivace sugli schermi Apple e su molti Android, purché il profilo resti incorporato. Usa Adobe RGB se te lo chiede il laboratorio di stampa. Riserva ProPhoto RGB al ritocco a 16 bit: il suo gamut è così ampio che nei file a 8 bit compare la posterizzazione (banding).
Le conversioni sono formule chiuse, non approssimazioni tabellari, e una conversione di andata e ritorno restituisce il valore di partenza a meno degli errori di arrotondamento in virgola mobile. Le poche eccezioni sono documentate dove si presentano: OSA-UCS non ha un’inversa in forma chiusa, e i sistemi ad atlante come Munsell interpolano tra i gradi pubblicati. L’output in rgb non viene mai limitato: un colore fuori da sRGB risulta sotto 0 o sopra 255, quindi limitalo solo al momento di visualizzarlo.
E sono verificate: ogni spazio rimanda all’articolo o alla specifica che implementa, i valori sono confrontati con colorjs.io ovunque le due librerie si sovrappongano, e i log delle camere con le trasformazioni ACES ufficiali dell’Academy. formula-verification.md documenta che cosa è stato confrontato con che cosa, compresi alcuni punti in cui erano gli stessi articoli pubblicati a contenere errori.
Se i numeri differiscono da quelli di un’altra libreria, confronta gli intervalli: questa mantiene gli intervalli convenzionali di ogni spazio – RGB 0–255, chiarezza Lab 0–100, tinta 0–360 – mentre molte normalizzano tutto su 0–1. Ogni scheda mostra i suoi intervalli; nel codice sono space.oklch.range.
Nativamente rgb(), hsl(), hwb(), lab(), lch(), oklab(), oklch(), più color() per Display P3, Adobe RGB, ProPhoto, sRGB lineare e XYZ (D65 e D50). Il rec2020 di CSS è una gamma pura di 2.4, non la curva BT.2020 del Rec. 2020 di questo catalogo: gli stessi numeri indicherebbero un colore diverso. La scheda css di ogni spazio riporta il colore corrente in una forma pronta da copiare; per gli spazi che CSS non supporta ci sono invece profili ICC o LUT.
Apri Vista e scegli un’opzione in Visione: cecità al rosso (protanopia), cecità al verde (deuteranopia) o cecità al blu (tritanopia). Il catalogo viene ridisegnato come lo vede quell’occhio, così puoi controllare che i colori di una palette restino distinguibili. Circa 1 uomo su 12 ha un deficit della visione dei colori, secondo i dati del NEI.
Sono prodotti su licenza: i loro colori sono definiti da dati che i proprietari vendono, non da formule pubblicate, quindi non c’è una matematica aperta da implementare, e ridistribuirne le tabelle non sarebbe legale. Qui trovi sistemi affini con una matematica pubblica: Munsell (i dati della rinotazione del 1943 sono pubblici) e RAL Design (definito direttamente in CIELAB). Ogni sistema la cui matematica sia mai stata pubblicata ha posto qui; suggeriscine uno che manca.
| Strumento | Spazi | Log di camera | Luma–croma | sRGB | Utilità | Dimensione | Velocità | Target |
|---|---|---|---|---|---|---|---|---|
| 205 | 31 | 16 | 0–255 | parse mix ΔE contrast CVD | 62 kB | JS, WASM, GL, LUT, ICC, OCIO, MCP, Figma, VS Code, CLI, web | ||
| 30 | – | 1 | 0–1 | parse mix gamut ΔE contrast CVD | 23 kB | JS | ||
| 51 | – | – | 0–1 | parse mix gamut ΔE contrast | 34 kB | JS, web | ||
| chroma-js | 11 | – | – | 0–255 | parse mix ΔE contrast palettes | 17 kB | JS | |
| @texel/color | 16 | – | – | 0–1 | parse gamut ΔE | 9 kB | JS | |
| 128 | 24 | 6 | 0–1 | ΔE CVD | – | – | Python, LUT | |
| 77 | – | – | 0–1 | parse mix gamut ΔE contrast CVD palettes | – | – | Python | |
| 9 | – | – | 0–1 | mix contrast CVD palettes | – | – | R, web | |
| 57 | 11 | – | 0–1 | gamut | – | – | C++, Python, GL, LUT, ICC | |
| 22 | – | – | 0–1, 0–255 | ΔE | – | – | web | |
| 9 | – | – | 0–255 | parse gamut | – | – | web |
Dal codice sorgente, dal pacchetto o dalla pagina di ciascun progetto, al 2026-10-18.
@software{Ivanov_color-space_2026,
author = {Ivanov, Dmitry},
license = {CC0-1.0},
month = oct,
title = {{color-space}},
url = {https://github.com/colorjs/color-space},
version = {3.4.0},
year = {2026}
}Ivanov, D. (2026). color-space (Version 3.4.0) [Computer software]. https://github.com/colorjs/color-space
Percettivi
s sta per «simple version», versione semplice; il rapporto prometteva una versione completa (comprehensive), CIECAM97c
1997–2002, CIE
CIECAM02, 2002 – CIECAM02 rese lineare l’adattamento cromatico e fissò a zero la chiarezza del nero
Un unico modello di aspetto che l’industria dell’imaging potesse condividere, chiesto alla CIE al suo simposio di Vienna del 1996.
Storico: il modello di aspetto provvisorio della CIE, superato da CIECAM02.
Il nero cade a chiarezza J ≈ 2.2, non a 0, e l’inversa fornita dallo stesso rapporto è solo approssimata.
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import ciecam97s from 'color-space/ciecam97s.js' ciecam97s.xyz(44.4, 0.5, 217) // → [20.5166, 21.5861, 23.5085] // any-to-any, both ways — the wired hub: import space from 'color-space' space.ciecam97s.rgb(44.4, 0.5, 217) // → [128, 128, 128] space.rgb.ciecam97s(128, 128, 128) // → [44.4, 0.5, 217] // route: ciecam97s → xyz → rgb