chromatic

pub package publisher

A comprehensive color science library for Dart. Color space conversions, perceptual color difference (Delta E), chromatic adaptation, and more.

Port of Python's colormath with identical math, validated against 690+ Python-generated test fixtures and the Sharma 2005 CIEDE2000 reference dataset.

🎨 Live demo: https://enraio.github.io/chromatic/

Features

  • 10 color spaces: sRGB, Adobe RGB, Apple RGB, BT.2020, XYZ, xyY, Lab, LCH(ab), Luv, LCH(uv), HSL, HSV, CMY, CMYK, IPT
  • 4 Delta E formulas: CIE76, CIE94 (graphic arts + textiles), CIEDE2000 (the gold standard), CMC l:c
  • Chromatic adaptation: Bradford, von Kries, XYZ scaling β€” convert between any illuminant (D50, D65, A, C, F-series, etc.)
  • Proper sRGB EOTF: piecewise transfer function (not simple power gamma)
  • Proper BT.2020 transfer: ITU-R BT.2020 piecewise OETF
  • Hex parsing: #ff8040, ff8040, #f84 shorthand
  • All immutable: every color type is a pure value class

Validated against Python colormath

Every conversion and Delta E formula is tested against 690+ fixtures generated from Python colormath, plus the 34-pair Sharma 2005 reference dataset for CIEDE2000. Max error against Sharma's published values: 4.9e-5.

Usage

import 'package:chromatic/chromatic.dart';

// Parse and convert
final red = SRgbColor.fromHex('#ff0000');
final lab = sRgbToLab(red);         // Lab(53.24, 80.09, 67.20)
final lch = labToLchAb(lab);        // LCH(53.24, 104.55, 39.99)
print(red.hex);                      // #ff0000

// Perceptual distance β€” use CIEDE2000
final blue = sRgbToLab(SRgbColor(0.0, 0.0, 1.0));
print(deltaE00(lab, blue));          // ~52.88 (clearly different)
print(deltaE00(lab, lab));           // 0.0

// Chromatic adaptation between illuminants
final xyzC = XyzColor(0.5, 0.4, 0.1, illuminant: 'c');
final xyzD65 = adaptXyzColor(xyzC, targetIlluminant: 'd65');

// Or directly
final (x, y, z) = chromaticAdapt(
  0.5, 0.4, 0.1,
  sourceIlluminant: 'c',
  targetIlluminant: 'd65',
  method: 'bradford',      // or 'von_kries', 'xyz_scaling'
);

Performance vs Python colormath

Benchmarks on M-series Mac, 100K iterations each:

Operation chromatic (Dart) colormath (Python) Speedup
sRGB β†’ Lab 4,072,988 ops/s 87,224 ops/s 46.7Γ—
sRGB β†’ XYZ 6,002,041 ops/s 130,585 ops/s 46.0Γ—
sRGB β†’ HSL 5,448,700 ops/s 201,759 ops/s 27.0Γ—
sRGB β†’ HSV 6,059,504 ops/s 200,664 ops/s 30.2Γ—
sRGB β†’ LCH 3,432,651 ops/s 70,992 ops/s 48.4Γ—
sRGB β†’ Luv 5,288,207 ops/s 80,895 ops/s 65.4Γ—
Lab β†’ sRGB 1,502,720 ops/s 28,874 ops/s 52.0Γ—
Delta E 1976 99,304,866 ops/s 272,325 ops/s 364.7Γ—
Delta E 1994 27,173,913 ops/s 43,891 ops/s 619.1Γ—
Delta E CIEDE2000 4,507,144 ops/s 10,700 ops/s 421.2Γ—
Delta E CMC 16,784,156 ops/s 33,854 ops/s 495.7Γ—
Bradford adaptation 2,950,027 ops/s 48,610 ops/s 60.7Γ—
Batch (100K colors β†’ Lab) 16.3 ms 1036.3 ms 63.6Γ—

Reproduce:

dart run benchmark/benchmark.dart
python3.11 benchmark/benchmark.py

Supported color spaces

Space Forward Inverse
sRGB rgbToXyz xyzToSRgb
Adobe RGB rgbToXyz xyzToAdobeRgb
Apple RGB rgbToXyz xyzToAppleRgb
BT.2020 rgbToXyz xyzToBt2020
XYZ xyzToLab, xyzToLuv, xyzToXyy, xyzToIpt ←
xyY xyyToXyz xyzToXyy
Lab labToLchAb, labToXyz ←
LCH(ab) lchAbToLab labToLchAb
Luv luvToLchUv, luvToXyz ←
LCH(uv) lchUvToLuv luvToLchUv
HSL rgbToHsl hslToRgb
HSV rgbToHsv hsvToRgb
CMY rgbToCmy cmyToRgb
CMYK cmyToCmyk cmykToCmy
IPT xyzToIpt iptToXyz

Convenience shortcuts: sRgbToLab, sRgbToLchAb, sRgbToHsl, sRgbToHsv, labToSRgb, lchAbToSRgb.

Delta E reference

| Delta E < 1.0 | Imperceptible to humans | | Delta E 1–2 | Perceptible on close inspection | | Delta E 2–3.5 | Perceptible at a glance | | Delta E 5+ | Clearly different colors |

Illuminants supported

Observer Illuminants
2Β° A, B, C, D50, D55, D65, D75, E, F2, F7, F11
10Β° D50, D55, D65, D75

Running tests

# Regenerate fixtures from Python colormath (one-time)
pip3.11 install colormath numpy
python3.11 tool/generate_fixtures.py

# Run all Dart tests
dart test

License

BSD-3-Clause (matches Python colormath).

Libraries

chromatic
A comprehensive color science library for Dart.