Farbe, Palette, Verlauf oder Bild in jedem Farbraum darstellen. Vom Bildschirm bis zum Druck, vom Farbwähler bis zur Forschung, von 1860 bis 2026.
Die ganze Bibliothek: 221 Farbräume, 71 kB mit gzip – jeder Farbraum in jeden anderen, in beide Richtungen.
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]]
Oder ein einzelner Farbraum – das Bundle enthält nichts anderes.
import oklch from 'color-space/oklch.js' oklch.rgb(0.65, 0.1, 180) // → [56.14, 162.97, 145.41]
Typisiert: Die TypeScript-Deklarationen liegen dem Paket bei, für die ganze Bibliothek und für jeden Farbraum einzeln.
Für ganze Bilder und lange Puffer: 54 Farbräume, 53 kB mit gzip, 1.4–4.8× schneller als der JS-Batch bei den 26 gemessenen Umrechnungen.
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
Das Modul importiert nichts und läuft daher überall, wo WebAssembly läuft: in Browsern, Node, Deno, Bun – und aus Python, Rust oder Go über wasmtime oder 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)
Farbräume 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
Alle 221 Farbräume als Shader-Funktionen. Eine Umrechnung nach rgb liefert 0–255 wie in JavaScript: für eine Fragmentfarbe durch 255 teilen.
WebGL und 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 und Unreal: HLSL. Metal: MSL. Beide erzeugt naga, eine optionale Abhängigkeit, aus dem WGSL-Code.
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)Material im Schnittprogramm umrechnen: zwei Farbräume wählen und eine .cube-Datei für Resolve, Premiere, Final Cut, OBS oder ffmpeg herunterladen. Kamera-Log-Umrechnungen stimmen mit den offiziellen ACES-Transformationen der Academy überein.
Einen Farbraum in Photoshop, das Farbmanagement Ihres Systems, lcms oder ImageMagick bringen: als .icc-Profil herunterladen. RGB-Farbräume dienen in Photoshop als Arbeitsfarbräume, die übrigen rechnen über eine Lookup-Tabelle um.
Für KI-Agenten: Sie rufen geprüfte Umrechnungen auf, statt sie zu raten.
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"] } } }Füllungen und Konturen der Auswahl in jedem der 221 Farbräume – eine Ebene und ein Balken je Kanal, auf den Farbumfang der Datei beschnitten; die Farbe als CSS kopieren.
Jede Farbe der Datei – CSS, Swift, Flutter, Compose, Unity, Design-Tokens – in jedem der 221 Farbräume, mit einer Ebene und einem Balken je Kanal; Änderungen werden in der Schreibweise der jeweiligen Farbe zurückgeschrieben.
Ein Koordinatensystem für Farbe: Achsen, Bereiche und eine Regel, die Zahlen mit messbarem Licht verknüpft. Das menschliche Sehen ist trichromatisch, mit drei Zapfentypen (S, M, L); daher sind mindestens drei Koordinaten nötig, um jede für das Auge sichtbare Farbe zu beschreiben. Dasselbe Orange ist rgb(255 128 0), oklch(0.732 0.186 53) und XYZ [49, 36.7, 4.5]. Eine Palette ist eine Auswahl bestimmter Farben; mit einem Farbraum lässt sich jede beliebige Farbe angeben.
Ein Farbmodell legt fest, mit welchen Komponenten eine Farbe beschrieben wird: drei Primärfarben bei RGB, Buntton, Sättigung und Helligkeit bei HSL, vier Druckfarben bei CMYK. Ein Farbraum bestimmt zusätzlich die Primärvalenzen, den Weißpunkt und die Übertragungskurve. Damit entspricht jeder Satz von Zahlen einer eindeutig messbaren Farbe. Deshalb bezeichnet rgb(255 0 0) in sRGB, Display P3 und Adobe RGB jeweils ein anderes Rot: ein Modell, drei Farbräume.
Im Alltag werden beide als Farbräume bezeichnet, auch in CSS mit color-mix(in hsl, …) und in diesem Katalog. Ein Modell kann einen bestehenden Farbraum als Grundlage verwenden: HSL und HSV basieren hier auf sRGB, wie in CSS.
Das hängt von der Aufgabe ab:
Um alle Farbräume nach Aufgabe sortiert zu sehen, gruppieren Sie den Katalog nach Anwendung.
OKLCH. Es verwendet dieselben drei Parameter – Buntton, Buntheit, Helligkeit –, aber seine Helligkeit ist verlässlich: In HSL strahlt Gelb bei L=50 etwa 13-mal so viel Licht ab wie Blau bei L=50, gleiches L heißt also nicht gleiche Helligkeit. In OKLCH schon. CSS unterstützt oklch() nativ.
Geben Sie den Hex-Wert oben in das Farbfeld ein oder fügen Sie ihn ein, etwa #ff8000. Jeder Farbraum auf der Seite zeigt diese Farbe sofort; in OKLCH sind es 0.732, 0.186, 53, in CSS geschrieben oklch(0.732 0.186 53). Der Tab css in der Detailansicht jedes Farbraums liefert die kopierfertige Form, im Code heißt es space.rgb.oklch(255, 128, 0).
Weil sie im gammakodierten sRGB berechnet werden, wo das Mitteln der Zahlen zweier Farben dunkleres, stumpferes Licht ergibt, als es das Mischen ihres Lichts täte. Interpolation in OKLab vermeidet das; in CSS schreibt man linear-gradient(in oklab, red, blue). Die Zeile interpolieren in jeder Detailansicht zeigt denselben Verlauf, in zwei Farbräumen berechnet, nebeneinander, sodass der Unterschied vor der Wahl sichtbar ist.
Öffnen Sie den Log-Farbraum Ihrer Kamera, etwa S-Log3, LogC4 oder Apple Log. Wählen Sie in seinem Block LUT das Ziel Rec. 709 und Ihre Software: DaVinci Resolve, Premiere Pro, Final Cut Pro, OBS, ffmpeg und weitere. Ihr Browser erzeugt die .cube-Datei. Es ist eine technische Umrechnung ohne Tone Mapping: Lichter über dem diffusen Weiß werden abgeschnitten, und der Look bleibt Ihnen überlassen.
Eine Farbe, die ein Farbraum beschreiben, ein anderer – oder Ihr Bildschirm – aber nicht zeigen kann. Ein leuchtendes Grün aus Display P3 gibt es in sRGB nicht: Umgerechnet fallen die Zahlen aus dem gültigen Bereich. Der Atlas macht das sichtbar: Ein ⚠ bei der aktuellen Farbe zeigt, dass sie außerhalb des unter „Grenze“ gewählten Farbumfangs liegt; mit gedrückter Alt-Taste über einer Ebene oder einem Streifen sehen Sie, welchen größeren Farbumfang eine Farbe dort braucht (P3, Rec. 2020); Abschnitte außerhalb des Bereichs erscheinen blass über einem Schachbrettmuster.
Ein Bildschirm strahlt Licht ab; Papier reflektiert, was seine Druckfarben nicht absorbieren. Druckfarbe auf Papier erreicht weniger leuchtende Farben – gesättigte RGB-Blau-, -Grün- und -Rottöne liegen außerhalb –, also werden sie stumpfer gedruckt. Die Druckvorstufe wandelt über ein ICC-Profil für Druckmaschine und Papier um, etwa FOGRA39 für europäisches gestrichenes Papier oder GRACoL in den USA. Das CMYK dieses Katalogs ist die einfache Formel, die CSS für device-cmyk() ohne Profil verwendet – rechnerisch korrekt, aber kein Proof für den Druck.
Für das Web und zum Teilen sRGB: Browser und Smartphones gehen davon aus, wenn eine Datei kein Profil mitbringt. Display P3 bewahrt auf Apple- und vielen Android-Bildschirmen mehr von einer leuchtenden Szene, solange das Profil eingebettet bleibt. Adobe RGB schicken Sie, wenn ein Fotolabor danach fragt. ProPhoto RGB gehört in die 16-Bit-Bearbeitung: Sein Farbumfang ist so groß, dass 8-Bit-Dateien Tonwertabrisse zeigen.
Umrechnungen sind geschlossene Formeln, keine Näherungen über Tabellen, und Hin- und Rückumrechnung liefern die Ausgangswerte bis auf Rundungsfehler der Gleitkommaarithmetik zurück. Die wenigen Ausnahmen sind dort dokumentiert, wo sie auftreten: OSA-UCS hat keine geschlossene Umkehrung, und Atlas-Systeme wie Munsell interpolieren zwischen veröffentlichten Stufen. Die Ausgabe in rgb wird nie begrenzt: Eine Farbe außerhalb von sRGB kommt mit Werten unter 0 oder über 255 zurück; begrenzen Sie sie also erst bei der Anzeige.
Außerdem sind sie überprüft: Jeder Farbraum verlinkt das Paper oder die Spezifikation, die er umsetzt, Werte werden überall, wo sich beide überschneiden, gegen colorjs.io getestet, die Kamera-Logs gegen die offiziellen ACES-Transformationen der Academy. formula-verification.md hält fest, was wogegen geprüft wurde – einschließlich einiger Stellen, an denen schon die veröffentlichten Paper Fehler enthielten.
Weichen die Zahlen von denen einer anderen Bibliothek ab, die Wertebereiche vergleichen: Diese hier behält die üblichen Bereiche jedes Farbraums – RGB 0–255, Lab-Helligkeit 0–100, Buntton 0–360 –, während viele alles auf 0–1 normieren. Jede Karte zeigt ihre Bereiche; im Code stehen sie in space.oklch.range.
Nativ rgb(), hsl(), hwb(), lab(), lch(), oklab(), oklch(), dazu color() für Display P3, Adobe RGB, ProPhoto, lineares sRGB und XYZ (D65 und D50). CSS-rec2020 ist ein reines Gamma 2.4, nicht die BT.2020-Kurve von Rec. 2020 in diesem Katalog – dieselben Zahlen bezeichnen eine andere Farbe. Der Tab css in der Detailansicht jedes Farbraums gibt die aktuelle Farbe kopierfertig aus; Farbräume, die CSS fehlen, gibt es stattdessen als ICC-Profile oder LUTs.
Öffnen Sie Ansicht und wählen Sie unter Sehen eine Variante: rotblind (Protanopie), grünblind (Deuteranopie) oder blaublind (Tritanopie). Der Katalog wird so neu gezeichnet, wie dieses Auge ihn sieht, sodass Sie prüfen können, ob die Farben einer Palette unterscheidbar bleiben. Etwa 1 von 12 Männern hat eine Farbsehschwäche, nach Angaben des NEI.
Das sind lizenzierte Produkte: Ihre Farben sind durch Daten definiert, die die Eigentümer verkaufen, nicht durch veröffentlichte Formeln – es gibt also keine offengelegten Formeln, die man implementieren könnte, und ihre Tabellen weiterzugeben wäre nicht legal. Verwandte Systeme mit veröffentlichten Formeln sind enthalten: Munsell (seine Renotation von 1943 ist öffentlich zugänglich) und RAL Design (direkt in CIELAB definiert). Jedes System, dessen Formeln je veröffentlicht wurden, gehört hierher; schlagen Sie ein fehlendes vor.
| Werkzeug | Farbräume | Kamera-Logs | Luma–Chroma | sRGB | Werkzeuge | Größe | Geschwindigkeit | Ziele |
|---|---|---|---|---|---|---|---|---|
| 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 |
Aus Quellcode, Paket oder Website des jeweiligen Projekts, Stand 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
Farbmetrik
benannt nach Allen Poirson und Brian Wandell; Johnson & Fairchild bezeichnen seine Kanäle als A, C1, C2
1993, Poirson & Wandell
Die Gegenfarbkanäle, die S-CIELAB vor der Umrechnung in CIELAB jeweils mit ihrer eigenen räumlichen Empfindlichkeit weichzeichnet.
S-CIELAB und andere räumliche Farbabstandsmetriken: hier filtern, dann nach CIELAB umrechnen.
Nicht auf Weiß normiert: D65 liegt bei O2 −5.3, O3 3.7; Buntheit null ist also nicht neutral.
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import poirsonWandell from 'color-space/poirson-wandell.js' poirsonWandell.xyz(18.8, -1.1, 0.8) // → [20.5166, 21.5861, 23.5085] // any-to-any, both ways — the wired hub: import space from 'color-space' space['poirson-wandell'].rgb(18.8, -1.1, 0.8) // → [128, 128, 128] space.rgb['poirson-wandell'](128, 128, 128) // → [18.8, -1.1, 0.8] // route: poirson-wandell → xyz → rgb