Documentation du code de SPIP et de ses plugins

Palette Factory

colorimetrie.php

Ce fichier contient l'API de conversion d'une couleur unitaire entre espaces colorimétriques.

C'est la couche la plus basse du plugin : elle ne connaît que des couleurs isolées — jamais un nuancier ni une palette — et ne dépend d'aucune autre couche. Les nuanciers, les palettes et les collections s'appuient dessus.

Quatre chaînes de conversion sont couvertes, chacune parcourable dans les deux sens. Les trois premières partagent leur début et divergent à partir de XYZ, selon l'espace perceptuel visé :

hex ⟷ rgb ⟷ xyz ⟷ lab ⟷ polarLAB
hex ⟷ rgb ⟷ xyz ⟷ luv ⟷ polarLUV
hex ⟷ rgb ⟷ xyz ⟷ oklab ⟷ oklch
hex ⟷ hsl

Toutes les conversions qui passent par XYZ ont besoin d'un blanc de référence, c'est-à-dire de la couleur que l'œil tient pour blanche dans les conditions d'observation retenues. C'est lui qui fixe l'origine des espaces perceptuels : une couleur n'est « bleutée » ou « jaunie » que par rapport à lui. La colorimétrie définit ce blanc par un illuminant, une lumière normalisée décrite par sa répartition spectrale. Ce fichier retient l'illuminant D65, la lumière du jour moyenne, qui est celui de sRGB et donc des écrans : c'est le blanc qu'attendent les navigateurs et les autres bibliothèques de couleur. Ses coordonnées XYZ sont figées dans les constantes _EZPALETTE_D65_*, et les valeurs XYZ sont exprimées sur l'échelle 0-100.

Sur ces conversions s'appuient quatre services, qui sont la raison d'être des trois chaînes : l'interrogation du gamut sRGB, qui dit si une couleur est représentable à l'écran et jusqu'à quel chroma ; l'interpolation entre deux couleurs dans l'espace de son choix ; la simulation des déficiences de la vision des couleurs ; enfin la mesure de la luminance, du contraste WCAG et de l'écart perceptuel entre deux couleurs.

Toutes les fonctions qui renvoient un jeu de coordonnées l'indexent par l'initiale minuscule de chaque coordonnée de l'espace visé, sans exception : x, y et z pour XYZ, l, a et b pour LAB, l, u et v pour LUV, l, c et h pour les espaces polaires, r, g et b pour RGB, h, s et l pour HSL. Les fonctions qui renvoient une couleur hexadécimale rendent une chaîne au format #RRGGBB.

Les échelles, en revanche, sont celles de chaque espace et non une convention maison. La clarté vaut 0-100 en LAB, en LUV et dans leurs formes polaires, mais 0-1 en Oklab et en Oklch, dont le chroma culmine autour de 0,4 quand celui de LAB atteint 135. C'est la convention d'Ottosson, reprise par CSS : la renormaliser rendrait les valeurs incomparables à toute autre implémentation.

Tags
note

Les coordonnées polaires de LAB et celles de LUV sont toutes deux appelées « HCL » dans la littérature, ce qui est une source constante de confusion : elles désignent des espaces différents, aux chromas et aux teintes distincts. Ce fichier suit la convention du paquet R colorspace, référence du domaine, qui réserve le nom HCL au polarLUV et nomme explicitement polarLAB l'autre. Les fonctions couleur_*_hcl() opèrent donc sur le polarLUV ; pour le polarLAB, utiliser les fonctions couleur_*_polarlab().

Table of Contents

Constants

_EZPALETTE_CIE_EPSILON  = 0.008855999999999999
Constantes de la CIE définissant le raccord entre la partie cubique et la partie linéaire des fonctions de transfert de CIE L*a*b* et CIE L*u*v*.
_EZPALETTE_CIE_KAPPA  = 903.3
_EZPALETTE_D65_X  = 95.047
Coordonnées XYZ du blanc de référence D65, sur l'échelle 0-100.
_EZPALETTE_D65_Y  = 100.0
_EZPALETTE_D65_Z  = 108.883
_EZPALETTE_GAMUT_TOLERANCE  = 0.5 / 255
Tolérance retenue pour juger qu'une couleur tient dans le gamut sRGB, exprimée en composante normalisée.

Functions

colorimetrie_srgb_lineariser()  : float
Linéarise une composante sRGB en supprimant sa correction gamma.
colorimetrie_srgb_corriger_gamma()  : float
Applique la correction gamma à une composante sRGB linéaire.
colorimetrie_hex_to_dec()  : array<string|int, mixed>
Convertit une couleur hexadécimale en composantes RGB décimales.
colorimetrie_dec_to_hex()  : string
Convertit des composantes RGB décimales en couleur hexadécimale.
colorimetrie_hex_to_hsl()  : array<string|int, mixed>
Convertit une couleur hexadécimale en HSL.
colorimetrie_hsl_to_hex()  : string
Convertit des coordonnées HSL en couleur hexadécimale.
colorimetrie_rgb_to_xyz()  : array<string|int, mixed>
Convertit des composantes RGB décimales en coordonnées XYZ, en prenant D65 pour blanc de référence.
colorimetrie_xyz_to_srgb_normalise()  : array<string|int, mixed>
Convertit des coordonnées XYZ en composantes sRGB normalisées, sans écrêtage.
colorimetrie_xyz_to_rgb()  : array<string|int, mixed>
Convertit des coordonnées XYZ en composantes RGB décimales, en prenant D65 pour blanc de référence.
colorimetrie_xyz_to_lab()  : array<string|int, mixed>
Convertit des coordonnées XYZ en CIE L*a*b*, en prenant D65 pour blanc de référence.
colorimetrie_lab_to_xyz()  : array<string|int, mixed>
Convertit des coordonnées CIE L*a*b* en XYZ, en prenant D65 pour blanc de référence.
colorimetrie_xyz_to_luv()  : array<string|int, mixed>
Convertit des coordonnées XYZ en CIE L*u*v*, en prenant D65 pour blanc de référence.
colorimetrie_luv_to_xyz()  : array<string|int, mixed>
Convertit des coordonnées CIE L*u*v* en XYZ, en prenant D65 pour blanc de référence.
colorimetrie_cartesien_to_polaire()  : array<string|int, mixed>
Convertit des coordonnées cartésiennes en coordonnées polaires (chroma et teinte).
colorimetrie_lab_to_polarlab()  : array<string|int, mixed>
Convertit des coordonnées CIE L*a*b* en polarLAB.
colorimetrie_polarlab_to_lab()  : array<string|int, mixed>
Convertit des coordonnées polarLAB en CIE L*a*b*.
colorimetrie_luv_to_polarluv()  : array<string|int, mixed>
Convertit des coordonnées CIE L*u*v* en polarLUV, c'est-à-dire en HCL.
colorimetrie_polarluv_to_luv()  : array<string|int, mixed>
Convertit des coordonnées polarLUV, c'est-à-dire HCL, en CIE L*u*v*.
colorimetrie_xyz_to_oklab()  : array<string|int, mixed>
Convertit des coordonnées XYZ en Oklab, en prenant D65 pour blanc de référence.
colorimetrie_oklab_to_xyz()  : array<string|int, mixed>
Convertit des coordonnées Oklab en XYZ, en prenant D65 pour blanc de référence.
colorimetrie_oklab_to_oklch()  : array<string|int, mixed>
Convertit des coordonnées Oklab en Oklch, leur forme polaire.
colorimetrie_oklch_to_oklab()  : array<string|int, mixed>
Convertit des coordonnées Oklch en Oklab.
colorimetrie_hex_to_lab()  : array<string|int, mixed>
Convertit une couleur hexadécimale en CIE L*a*b*.
colorimetrie_hex_to_polarlab()  : array<string|int, mixed>
Convertit une couleur hexadécimale en polarLAB.
colorimetrie_polarlab_to_hex()  : string
Convertit des coordonnées polarLAB en couleur hexadécimale.
colorimetrie_hex_to_hcl()  : array<string|int, mixed>
Convertit une couleur hexadécimale en HCL, c'est-à-dire en polarLUV.
colorimetrie_hcl_to_hex()  : string
Convertit des coordonnées HCL, c'est-à-dire polarLUV, en couleur hexadécimale.
colorimetrie_hex_to_oklab()  : array<string|int, mixed>
Convertit une couleur hexadécimale en Oklab.
colorimetrie_oklab_to_hex()  : string
Convertit des coordonnées Oklab en couleur hexadécimale.
colorimetrie_hex_to_oklch()  : array<string|int, mixed>
Convertit une couleur hexadécimale en Oklch.
colorimetrie_oklch_to_hex()  : string
Convertit des coordonnées Oklch en couleur hexadécimale.
colorimetrie_polarlab_est_dans_gamut()  : bool
Indique si une couleur exprimée en polarLAB est représentable en sRGB.
colorimetrie_polarlab_chroma_maximal()  : float
Calcule le chroma le plus élevé qu'une teinte et une clarté données autorisent en sRGB.
colorimetrie_interpoler()  : string
Interpole entre deux couleurs, dans l'espace demandé.
colorimetrie_simuler_deficience()  : string
Simule la perception d'une couleur par une personne dont la vision des couleurs est déficiente.
colorimetrie_luminance_relative()  : float
Calcule la luminance relative d'une couleur, telle que définie par les WCAG.
colorimetrie_delta_e_76()  : float
Calcule l'écart perceptuel ΔE*ab entre deux couleurs, selon la formule CIE 1976.
colorimetrie_contraste_wcag()  : float
Calcule le rapport de contraste entre deux couleurs, tel que défini par les WCAG.
colorimetrie_lab_delta_e_2000()  : float
Calcule l'écart perceptuel ΔE₀₀ entre deux couleurs exprimées en CIE L*a*b*, selon la formule CIEDE2000.
colorimetrie_delta_e_2000()  : float
Calcule l'écart perceptuel ΔE₀₀ entre deux couleurs hexadécimales, selon la formule CIEDE2000.

Constants

_EZPALETTE_CIE_EPSILON

Constantes de la CIE définissant le raccord entre la partie cubique et la partie linéaire des fonctions de transfert de CIE L*a*b* et CIE L*u*v*.

public mixed _EZPALETTE_CIE_EPSILON = 0.008855999999999999

_EZPALETTE_D65_X

Coordonnées XYZ du blanc de référence D65, sur l'échelle 0-100.

public mixed _EZPALETTE_D65_X = 95.047

_EZPALETTE_GAMUT_TOLERANCE

Tolérance retenue pour juger qu'une couleur tient dans le gamut sRGB, exprimée en composante normalisée.

public mixed _EZPALETTE_GAMUT_TOLERANCE = 0.5 / 255

Elle vaut un demi-niveau de quantification sur huit bits : en deçà, l'écrêtage ne modifie pas l'octet rendu, et la couleur est donc représentable en pratique. Un seuil infinitésimal écarterait des couleurs qui s'affichent pourtant à l'identique.

Functions

colorimetrie_srgb_lineariser()

Linéarise une composante sRGB en supprimant sa correction gamma.

colorimetrie_srgb_lineariser(float $coordonnee) : float

La fonction opère sur une seule composante (R, G ou B), pas sur une couleur complète, et travaille en valeurs normalisées : elle attend un flottant dans l'intervalle [0, 1] et rend un flottant dans le même intervalle. La normalisation est donc à la charge de l'appelant, qui divise la composante 0-255 par 255 : pour la couleur rgb(150, 160, 14), on appelle colorimetrie_srgb_lineariser(150 / 255), etc.

La valeur d'entrée est une valeur encodée, à peu près perceptuelle, telle que stockée dans un fichier ou une feuille de style ; la valeur de sortie est proportionnelle à l'intensité lumineuse. Cette conversion est un préalable obligatoire à tout calcul linéaire sur la lumière : passage à XYZ et calcul de la luminance relative. Ainsi, 14 / 255 vaut 0,0549 en encodé mais seulement 0,0044 en lumière.

En pratique, la fonction n'est pas appelée directement : colorimetrie_rgb_to_xyz() et colorimetrie_luminance_relative() s'en chargent pour les trois composantes.

Parameters
$coordonnee : float

Composante sRGB encodée et normalisée, dans l'intervalle [0, 1]

Tags
see
colorimetrie_srgb_corriger_gamma()

Opération réciproque

Return values
float

Composante linéarisée, dans l'intervalle [0, 1]

colorimetrie_srgb_corriger_gamma()

Applique la correction gamma à une composante sRGB linéaire.

colorimetrie_srgb_corriger_gamma(float $coordonnee) : float

Réciproque exacte de colorimetrie_srgb_lineariser() : elle attend une composante linéaire normalisée et rend la composante encodée correspondante, toujours normalisée. Il revient à l'appelant de la dénormaliser en la multipliant par 255.

Une couleur hors du gamut sRGB produit ici des composantes linéaires négatives, prises en charge par la partie linéaire de la fonction : elles traversent la conversion sans produire de NAN et sont écrêtées plus loin, au moment de la dénormalisation.

Parameters
$coordonnee : float

Composante sRGB linéaire normalisée, dans l'intervalle [0, 1]

Tags
see
colorimetrie_srgb_lineariser()

Opération réciproque

Return values
float

Composante encodée en gamma, dans l'intervalle [0, 1]

colorimetrie_hex_to_dec()

Convertit une couleur hexadécimale en composantes RGB décimales.

colorimetrie_hex_to_dec(string $hex) : array<string|int, mixed>

C'est la porte d'entrée de tout le fichier : chaque chaîne de conversion partant d'une couleur hexadécimale commence ici. Elle est donc la seule à valider son entrée, ce qui dispense les autres de le faire.

Sont acceptées les notations sur trois ou six caractères hexadécimaux, avec ou sans # et quelle que soit la casse. Toute autre entrée rend le noir et est journalisée : elle ne peut pas être devinée, et la laisser passer serait pire. hexdec() en tirerait en effet une couleur en ignorant silencieusement les caractères invalides — bonjour donnerait rgb(11, 0, 0) — au prix, depuis PHP 8.3, d'une dépréciation par composante.

Parameters
$hex : string

Couleur hexadécimale, avec ou sans #, sur 3 ou 6 caractères

Tags
note

Le noir n'est pas une valeur d'erreur : c'est une couleur comme une autre, et rien ne distingue en retour une entrée invalide d'un #000000 légitime. C'est un choix assumé, qui préserve la garantie tenue partout dans ce fichier — aucune conversion n'échoue ni ne rend NAN — et qui laisse le signalement au journal. Un appelant qui doit valider une saisie contrôle le format en amont plutôt que d'interpréter ce retour.

Return values
array<string|int, mixed>

Composantes RGB, index r, g et b, chacune dans l'intervalle 0-255. Le noir si l'entrée n'est pas une couleur hexadécimale

colorimetrie_dec_to_hex()

Convertit des composantes RGB décimales en couleur hexadécimale.

colorimetrie_dec_to_hex(int $r, int $g, int $b) : string

Les composantes sont ramenées dans l'intervalle 0-255 : une couleur hors du gamut sRGB est donc écrêtée sur le bord du gamut plutôt que rejetée.

Parameters
$r : int

Rouge, 0-255

$g : int

Vert, 0-255

$b : int

Bleu, 0-255

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_hex_to_hsl()

Convertit une couleur hexadécimale en HSL.

colorimetrie_hex_to_hsl(string $hex) : array<string|int, mixed>
Parameters
$hex : string

Couleur hexadécimale

Return values
array<string|int, mixed>

Coordonnées HSL :

  • index h : teinte, 0-360
  • index s : saturation, 0-1
  • index l : luminosité, 0-1

colorimetrie_hsl_to_hex()

Convertit des coordonnées HSL en couleur hexadécimale.

colorimetrie_hsl_to_hex(float $h, float $s, float $l) : string
Parameters
$h : float

Teinte, 0-360

$s : float

Saturation, 0-1

$l : float

Luminosité, 0-1

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_rgb_to_xyz()

Convertit des composantes RGB décimales en coordonnées XYZ, en prenant D65 pour blanc de référence.

colorimetrie_rgb_to_xyz(int $r, int $g, int $b) : array<string|int, mixed>
Parameters
$r : int

Rouge, 0-255

$g : int

Vert, 0-255

$b : int

Bleu, 0-255

Return values
array<string|int, mixed>

Coordonnées XYZ sur l'échelle 0-100, index x, y et z

colorimetrie_xyz_to_srgb_normalise()

Convertit des coordonnées XYZ en composantes sRGB normalisées, sans écrêtage.

colorimetrie_xyz_to_srgb_normalise(float $x, float $y, float $z) : array<string|int, mixed>

Étape commune à colorimetrie_xyz_to_rgb() et aux fonctions d'interrogation du gamut : elle applique la matrice XYZ vers sRGB, puis la correction gamma, et rend les trois composantes telles quelles.

Une couleur représentable en sRGB a ses trois composantes dans l'intervalle [0, 1] ; une composante hors de cet intervalle signale une couleur hors du gamut. C'est précisément l'information que l'écrêtage de colorimetrie_xyz_to_rgb() détruit, et la raison d'être de cette fonction.

Parameters
$x : float

Coordonnée X, 0-100

$y : float

Coordonnée Y, 0-100

$z : float

Coordonnée Z, 0-100

Tags
see
colorimetrie_polarlab_est_dans_gamut()

Test de représentabilité qui s'appuie dessus

Return values
array<string|int, mixed>

Composantes sRGB normalisées et non écrêtées, index r, g et b

colorimetrie_xyz_to_rgb()

Convertit des coordonnées XYZ en composantes RGB décimales, en prenant D65 pour blanc de référence.

colorimetrie_xyz_to_rgb(float $x, float $y, float $z) : array<string|int, mixed>

Une couleur hors du gamut sRGB est écrêtée composante par composante. L'opération n'est pas neutre : elle déplace la teinte et écrase le chroma, sans le signaler. Pour construire une rampe régulière, interroger le gamut au préalable avec colorimetrie_polarlab_chroma_maximal().

Parameters
$x : float

Coordonnée X, 0-100

$y : float

Coordonnée Y, 0-100

$z : float

Coordonnée Z, 0-100

Tags
see
colorimetrie_xyz_to_srgb_normalise()

Même conversion, sans écrêtage ni dénormalisation

Return values
array<string|int, mixed>

Composantes [r, g, b] entières, écrêtées dans l'intervalle 0-255

colorimetrie_xyz_to_lab()

Convertit des coordonnées XYZ en CIE L*a*b*, en prenant D65 pour blanc de référence.

colorimetrie_xyz_to_lab(float $x, float $y, float $z) : array<string|int, mixed>
Parameters
$x : float

Coordonnée X, 0-100

$y : float

Coordonnée Y, 0-100

$z : float

Coordonnée Z, 0-100

Return values
array<string|int, mixed>

Coordonnées LAB, index l (0-100), a et b

colorimetrie_lab_to_xyz()

Convertit des coordonnées CIE L*a*b* en XYZ, en prenant D65 pour blanc de référence.

colorimetrie_lab_to_xyz(float $l, float $a, float $b) : array<string|int, mixed>
Parameters
$l : float

Clarté L*, 0-100

$a : float

Coordonnée a*

$b : float

Coordonnée b*

Return values
array<string|int, mixed>

Coordonnées XYZ sur l'échelle 0-100, index x, y et z

colorimetrie_xyz_to_luv()

Convertit des coordonnées XYZ en CIE L*u*v*, en prenant D65 pour blanc de référence.

colorimetrie_xyz_to_luv(float $x, float $y, float $z) : array<string|int, mixed>
Parameters
$x : float

Coordonnée X, 0-100

$y : float

Coordonnée Y, 0-100

$z : float

Coordonnée Z, 0-100

Return values
array<string|int, mixed>

Coordonnées LUV, index l (0-100), u et v

colorimetrie_luv_to_xyz()

Convertit des coordonnées CIE L*u*v* en XYZ, en prenant D65 pour blanc de référence.

colorimetrie_luv_to_xyz(float $l, float $u, float $v) : array<string|int, mixed>
Parameters
$l : float

Clarté L*, 0-100

$u : float

Coordonnée u*

$v : float

Coordonnée v*

Return values
array<string|int, mixed>

Coordonnées XYZ sur l'échelle 0-100, index x, y et z

colorimetrie_cartesien_to_polaire()

Convertit des coordonnées cartésiennes en coordonnées polaires (chroma et teinte).

colorimetrie_cartesien_to_polaire(float $abscisse, float $ordonnee) : array<string|int, mixed>

Fonction interne commune au polarLAB et au polarLUV, qui ne diffèrent que par le plan sur lequel la transformation polaire est appliquée.

Parameters
$abscisse : float

Coordonnée a*, u* ou a

$ordonnee : float

Coordonnée b*, v* ou b

Return values
array<string|int, mixed>

Coordonnées polaires, index c (chroma) et h (teinte en degrés, 0-360)

colorimetrie_lab_to_polarlab()

Convertit des coordonnées CIE L*a*b* en polarLAB.

colorimetrie_lab_to_polarlab(float $l, float $a, float $b) : array<string|int, mixed>
Parameters
$l : float

Clarté L*, 0-100

$a : float

Coordonnée a*

$b : float

Coordonnée b*

Return values
array<string|int, mixed>

Coordonnées polarLAB, index l, c (chroma) et h (teinte, 0-360)

colorimetrie_polarlab_to_lab()

Convertit des coordonnées polarLAB en CIE L*a*b*.

colorimetrie_polarlab_to_lab(float $h, float $c, float $l) : array<string|int, mixed>
Parameters
$h : float

Teinte, 0-360

$c : float

Chroma

$l : float

Clarté L*, 0-100

Return values
array<string|int, mixed>

Coordonnées LAB, index l, a et b

colorimetrie_luv_to_polarluv()

Convertit des coordonnées CIE L*u*v* en polarLUV, c'est-à-dire en HCL.

colorimetrie_luv_to_polarluv(float $l, float $u, float $v) : array<string|int, mixed>
Parameters
$l : float

Clarté L*, 0-100

$u : float

Coordonnée u*

$v : float

Coordonnée v*

Return values
array<string|int, mixed>

Coordonnées HCL, index l, c (chroma) et h (teinte, 0-360)

colorimetrie_polarluv_to_luv()

Convertit des coordonnées polarLUV, c'est-à-dire HCL, en CIE L*u*v*.

colorimetrie_polarluv_to_luv(float $h, float $c, float $l) : array<string|int, mixed>
Parameters
$h : float

Teinte, 0-360

$c : float

Chroma

$l : float

Clarté L*, 0-100

Return values
array<string|int, mixed>

Coordonnées LUV, index l, u et v

colorimetrie_xyz_to_oklab()

Convertit des coordonnées XYZ en Oklab, en prenant D65 pour blanc de référence.

colorimetrie_xyz_to_oklab(float $x, float $y, float $z) : array<string|int, mixed>

Oklab poursuit le même but que CIE Lab* — une distance euclidienne qui approche la distance perçue — mais son ajustement est plus récent et corrige deux défauts bien identifiés de son aîné : la teinte des bleus dérive vers le violet lorsqu'on éclaircit, et les dégradés passant par le bleu virent au violet en leur milieu. C'est l'espace que retient CSS pour ses fonctions oklab() et oklch(), et celui que recommandent aujourd'hui la plupart des outils pour construire un dégradé.

Ses échelles ne sont pas celles du reste du fichier : la clarté va de 0 à 1 et non de 0 à 100, et les coordonnées a et b restent comprises entre -0,4 et 0,4 environ. C'est la convention d'Ottosson, reprise telle quelle par CSS ; la renormaliser sur 0-100 rendrait les valeurs incomparables à toute autre implémentation, ce qui coûterait plus cher que l'irrégularité.

Parameters
$x : float

Coordonnée X, 0-100

$y : float

Coordonnée Y, 0-100

$z : float

Coordonnée Z, 0-100

Tags
note

La conversion passe par la réponse des trois types de cônes, compressée par une racine cubique. La racine est prise en conservant le signe : une couleur hors du gamut donne des réponses négatives, sur lesquelles pow() rendrait NAN. Le fichier garantit partout qu'aucune conversion ne produit de NAN.

Return values
array<string|int, mixed>

Coordonnées Oklab : index l (clarté, 0-1), a et b

colorimetrie_oklab_to_xyz()

Convertit des coordonnées Oklab en XYZ, en prenant D65 pour blanc de référence.

colorimetrie_oklab_to_xyz(float $l, float $a, float $b) : array<string|int, mixed>
Parameters
$l : float

Clarté, 0-1

$a : float

Coordonnée a

$b : float

Coordonnée b

Return values
array<string|int, mixed>

Coordonnées XYZ sur l'échelle 0-100, index x, y et z

colorimetrie_oklab_to_oklch()

Convertit des coordonnées Oklab en Oklch, leur forme polaire.

colorimetrie_oklab_to_oklch(float $l, float $a, float $b) : array<string|int, mixed>

C'est à Oklab ce que polarLAB est à CIE Lab* : les mêmes couleurs, décrites par une teinte et un chroma plutôt que par deux coordonnées cartésiennes. C'est la forme qu'expose CSS sous le nom oklch().

Parameters
$l : float

Clarté, 0-1

$a : float

Coordonnée a

$b : float

Coordonnée b

Return values
array<string|int, mixed>

Coordonnées Oklch : index l (clarté, 0-1), c (chroma, 0-0,4 environ) et h (teinte, 0-360)

colorimetrie_oklch_to_oklab()

Convertit des coordonnées Oklch en Oklab.

colorimetrie_oklch_to_oklab(float $h, float $c, float $l) : array<string|int, mixed>
Parameters
$h : float

Teinte, 0-360

$c : float

Chroma, 0-0,4 environ

$l : float

Clarté, 0-1

Return values
array<string|int, mixed>

Coordonnées Oklab, index l, a et b

colorimetrie_hex_to_lab()

Convertit une couleur hexadécimale en CIE L*a*b*.

colorimetrie_hex_to_lab(string $hex) : array<string|int, mixed>

C'est la conversion à préférer dès qu'un même jeu de couleurs doit être comparé plusieurs fois : ΔE opère sur des coordonnées LAB, et colorimetrie_delta_e_2000() refait cette conversion à chaque appel. Comparer n couleurs deux à deux coûte donc conversions si l'on passe par elle, contre n en convertissant d'abord puis en appelant colorimetrie_lab_delta_e_2000().

Parameters
$hex : string

Couleur hexadécimale

Tags
see
colorimetrie_lab_delta_e_2000()

Écart perceptuel entre deux couleurs déjà converties

Return values
array<string|int, mixed>

Coordonnées LAB, index l, a et b

colorimetrie_hex_to_polarlab()

Convertit une couleur hexadécimale en polarLAB.

colorimetrie_hex_to_polarlab(string $hex) : array<string|int, mixed>
Parameters
$hex : string

Couleur hexadécimale

Return values
array<string|int, mixed>

Coordonnées polarLAB, index l, c et h

colorimetrie_polarlab_to_hex()

Convertit des coordonnées polarLAB en couleur hexadécimale.

colorimetrie_polarlab_to_hex(float $h, float $c, float $l) : string
Parameters
$h : float

Teinte, 0-360

$c : float

Chroma

$l : float

Clarté, 0-100

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_hex_to_hcl()

Convertit une couleur hexadécimale en HCL, c'est-à-dire en polarLUV.

colorimetrie_hex_to_hcl(string $hex) : array<string|int, mixed>
Parameters
$hex : string

Couleur hexadécimale

Return values
array<string|int, mixed>

Coordonnées HCL, index l, c et h

colorimetrie_hcl_to_hex()

Convertit des coordonnées HCL, c'est-à-dire polarLUV, en couleur hexadécimale.

colorimetrie_hcl_to_hex(float $h, float $c, float $l) : string
Parameters
$h : float

Teinte, 0-360

$c : float

Chroma

$l : float

Clarté, 0-100

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_hex_to_oklab()

Convertit une couleur hexadécimale en Oklab.

colorimetrie_hex_to_oklab(string $hex) : array<string|int, mixed>
Parameters
$hex : string

Couleur hexadécimale

Return values
array<string|int, mixed>

Coordonnées Oklab, index l (0-1), a et b

colorimetrie_oklab_to_hex()

Convertit des coordonnées Oklab en couleur hexadécimale.

colorimetrie_oklab_to_hex(float $l, float $a, float $b) : string
Parameters
$l : float

Clarté, 0-1

$a : float

Coordonnée a

$b : float

Coordonnée b

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_hex_to_oklch()

Convertit une couleur hexadécimale en Oklch.

colorimetrie_hex_to_oklch(string $hex) : array<string|int, mixed>
Parameters
$hex : string

Couleur hexadécimale

Return values
array<string|int, mixed>

Coordonnées Oklch, index l (0-1), c et h

colorimetrie_oklch_to_hex()

Convertit des coordonnées Oklch en couleur hexadécimale.

colorimetrie_oklch_to_hex(float $h, float $c, float $l) : string
Parameters
$h : float

Teinte, 0-360

$c : float

Chroma, 0-0,4 environ

$l : float

Clarté, 0-1

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_polarlab_est_dans_gamut()

Indique si une couleur exprimée en polarLAB est représentable en sRGB.

colorimetrie_polarlab_est_dans_gamut(float $h, float $c, float $l) : bool

Les espaces perceptuels décrivent bien plus de couleurs qu'un écran n'en sait afficher : un triplet polarLAB parfaitement valide peut n'avoir aucun équivalent sRGB. Dans ce cas colorimetrie_polarlab_to_hex() rend tout de même une couleur, écrêtée composante par composante, dont la teinte et le chroma ne sont plus ceux demandés. Cette fonction permet de le savoir avant de convertir.

Le test porte sur les composantes sRGB non écrêtées, à _EZPALETTE_GAMUT_TOLERANCE près : est tenue pour représentable une couleur dont l'écrêtage ne changerait pas le rendu sur huit bits.

Parameters
$h : float

Teinte, 0-360

$c : float

Chroma

$l : float

Clarté, 0-100

Tags
see
colorimetrie_polarlab_chroma_maximal()

Chroma le plus élevé qui satisfasse ce test

Return values
bool

true si la couleur est représentable en sRGB

colorimetrie_polarlab_chroma_maximal()

Calcule le chroma le plus élevé qu'une teinte et une clarté données autorisent en sRGB.

colorimetrie_polarlab_chroma_maximal(float $h, float $l[, float $precision = 0.05 ]) : float

C'est l'outil qui permet de construire une rampe honnête. Laisser l'écrêtage des composantes faire son œuvre déplace la teinte et écrase la clarté ; plafonner le chroma demandé sur ce maximum les préserve toutes deux, la seule concession étant une couleur moins vive là où le gamut ne suit pas. Deux stratégies s'offrent alors :

  • plafonner couleur par couleur, chacune sur son propre maximum : la rampe reste aussi vive que possible, mais son chroma varie avec la clarté ;
  • plafonner toute la rampe sur le plus petit des maxima : le chroma devient constant, au prix des couleurs les plus vives.

Sur un bleu de teinte 296 étalé de la clarté 20 à 90, le premier réglage ramène la dérive de teinte de 5,5° à moins de 0,25° et rend les clartés demandées à l'unité près.

La valeur rendue est le premier franchissement du bord du gamut en partant de l'axe des gris : tous les chromas qui lui sont inférieurs sont représentables, ce qui est la propriété dont une rampe a besoin.

Parameters
$h : float

Teinte, 0-360

$l : float

Clarté, 0-100

$precision : float = 0.05

Largeur de l'intervalle en deçà de laquelle la dichotomie s'arrête

Tags
note

Il serait tentant de chercher ce maximum par une simple dichotomie sur tout l'intervalle. Ce serait supposer le gamut étoilé par rapport à l'axe des gris, ce qu'il n'est pas : le cube sRGB projeté dans CIE Lab* présente des pointes, dont la plus marquée est le sommet du jaune. À sa clarté, 97,1, le rayon de teinte 102,9 est représentable de 0 à 28,5, ne l'est plus jusqu'à 96,4, puis l'est de nouveau sur le seul voisinage du sommet, à 96,9. Une dichotomie franchirait cette lacune et rendrait un maximum inatteignable depuis l'axe des gris. La recherche procède donc en deux temps : un balayage par pas d'une unité repère le premier chroma non représentable, puis une dichotomie affine la frontière dans l'intervalle ainsi encadré. Une lacune plus étroite qu'une unité de chroma resterait invisible, ce qui est sans conséquence : l'écart est très inférieur au seuil de perception.

Return values
float

Chroma maximal représentable, nul si la clarté elle-même est hors de l'intervalle 0-100

colorimetrie_interpoler()

Interpole entre deux couleurs, dans l'espace demandé.

colorimetrie_interpoler(string $hex1, string $hex2, float $ratio[, string $espace = 'oklab' ]) : string

Le chemin suivi d'une couleur à l'autre dépend entièrement de l'espace : entre le bleu et le jaune, RGB traverse un gris terne, HSL parcourt les verts saturés, les espaces perceptuels tiennent le milieu. C'est pourquoi l'espace est un paramètre et non un détail d'implémentation.

Oklab est retenu par défaut. C'est aujourd'hui le meilleur choix pour un dégradé : il corrige la dérive des bleus vers le violet dont souffre CIE Lab*, précisément sur le trajet qu'empruntent le plus souvent les nuanciers séquentiels et divergents.

Dans les espaces à teinte — HSL, polarLAB, HCL, Oklch — l'interpolation suit le plus court des deux arcs du cercle chromatique. Lorsqu'une des deux couleurs est achromatique, sa teinte, fixée à zéro par convention, est remplacée par celle de l'autre extrémité : sans cette précaution, un dégradé vers le blanc virerait au rouge.

Parameters
$hex1 : string

Couleur de départ, hexadécimale

$hex2 : string

Couleur d'arrivée, hexadécimale

$ratio : float

Position sur le trajet, de 0 pour la couleur de départ à 1 pour celle d'arrivée. Une valeur hors de cet intervalle est ramenée à ses bornes

$espace : string = 'oklab'

Espace d'interpolation : oklab, oklch, lab, polarlab, hcl, hsl ou rgb. Toute autre valeur revient au défaut, oklab

Return values
string

Couleur hexadécimale au format #RRGGBB

colorimetrie_simuler_deficience()

Simule la perception d'une couleur par une personne dont la vision des couleurs est déficiente.

colorimetrie_simuler_deficience(string $hex[, string $type = 'deuteranopie' ]) : string

Une palette cartographique n'est lisible que si ses couleurs restent distinctes pour tout le monde. Cette fonction rend la couleur telle qu'elle est perçue, ce qui permet de comparer les couleurs simulées entre elles : deux couleurs qui se confondent après simulation se confondront pour le lecteur concerné.

Trois déficiences sont couvertes, toutes trois dans leur forme complète, ou dichromatique :

  • protanopie : absence des cônes sensibles au rouge ;
  • deuteranopie : absence des cônes sensibles au vert, de loin la plus fréquente ;
  • tritanopie : absence des cônes sensibles au bleu, la plus rare.

La simulation est une transformation linéaire des composantes RGB linéaires : elle modélise une réponse des photorécepteurs, qui dépend de la lumière reçue et non de la valeur encodée. C'est aussi pourquoi le résultat peut sortir du gamut, auquel cas il est écrêté comme partout ailleurs dans ce fichier.

Parameters
$hex : string

Couleur hexadécimale

$type : string = 'deuteranopie'

Déficience simulée : deuteranopie, protanopie ou tritanopie. Tout autre valeur rend la couleur inchangée

Tags
note

Les matrices sont celles de Machado, Oliveira et Fernandes (2009), prises à la sévérité maximale. Ce modèle a remplacé la construction géométrique de Brettel, Viénot et Mollon dans la plupart des outils, pour deux raisons : il rend mieux compte des déficiences partielles, et il s'exprime comme une simple matrice.

Return values
string

Couleur perçue, hexadécimale au format #RRGGBB

colorimetrie_luminance_relative()

Calcule la luminance relative d'une couleur, telle que définie par les WCAG.

colorimetrie_luminance_relative(int $r, int $g, int $b) : float
Parameters
$r : int

Rouge, 0-255

$g : int

Vert, 0-255

$b : int

Bleu, 0-255

Tags
note

Les WCAG situent le raccord de la fonction de transfert à 0,03928 là où la spécification sRGB retient 0,04045. Les deux valeurs circulent, l'écart est infime et sans conséquence visible : on retient ici la fonction de transfert sRGB, ce qui garantit la cohérence avec le reste du fichier.

Return values
float

Luminance relative, 0 pour le noir et 1 pour le blanc

colorimetrie_delta_e_76()

Calcule l'écart perceptuel ΔE*ab entre deux couleurs, selon la formule CIE 1976.

colorimetrie_delta_e_76(string $hex1, string $hex2) : float

L'écart est la distance euclidienne entre les deux couleurs dans l'espace CIE Lab*, dont c'est précisément la raison d'être : y être équidistant approche l'équidistance perceptuelle.

Ordres de grandeur usuels : en deçà de 1 l'écart n'est pas perceptible, autour de 2,3 il correspond au seuil de discrimination, au-delà de 5 les deux couleurs se distinguent au premier coup d'œil.

Parameters
$hex1 : string

Première couleur hexadécimale

$hex2 : string

Seconde couleur hexadécimale

Tags
note

Il s'agit bien de la formule de 1976 et non de CIE2000, plus précise mais nettement plus coûteuse. CIE2000 corrige la surestimation des écarts dans les bleus saturés et la sous-estimation dans les gris ; pour comparer des couleurs voisines d'un même nuancier, l'écart entre les deux formules reste marginal.

Return values
float

Écart perceptuel, nul si les deux couleurs sont identiques

colorimetrie_contraste_wcag()

Calcule le rapport de contraste entre deux couleurs, tel que défini par les WCAG.

colorimetrie_contraste_wcag(string $hex1, string $hex2) : float

Le rapport vaut 1 pour deux couleurs de même luminance et 21 entre le noir et le blanc. Les WCAG exigent 4,5 pour le niveau AA sur du texte courant, 7 pour le niveau AAA.

Parameters
$hex1 : string

Première couleur hexadécimale

$hex2 : string

Seconde couleur hexadécimale

Return values
float

Rapport de contraste, compris entre 1 et 21

colorimetrie_lab_delta_e_2000()

Calcule l'écart perceptuel ΔE₀₀ entre deux couleurs exprimées en CIE L*a*b*, selon la formule CIEDE2000.

colorimetrie_lab_delta_e_2000(float $l1, float $a1, float $b1, float $l2, float $a2, float $b2) : float

CIEDE2000 est la formule recommandée par la CIE depuis 2001 et normalisée par l'ISO/CIE 11664-6. Elle corrige les défauts les mieux documentés du ΔE*ab de 1976, qui surestime les écarts dans les bleus saturés et les sous-estime près des neutres — précisément les régions où se situent la plupart des palettes cartographiques.

Elle pondère les trois composantes de l'écart par des facteurs dépendant de la position dans l'espace, et ajoute un terme de rotation qui rend compte de l'inclinaison des ellipses de discrimination dans les bleus.

Parameters
$l1 : float

Clarté de la première couleur

$a1 : float

Coordonnée a* de la première couleur

$b1 : float

Coordonnée b* de la première couleur

$l2 : float

Clarté de la seconde couleur

$a2 : float

Coordonnée a* de la seconde couleur

$b2 : float

Coordonnée b* de la seconde couleur

Tags
note

L'implémentation suit les notes de Sharma, Wu et Dalal (2005), qui recensent les pièges de cette formule : convention de teinte pour les couleurs achromatiques, moyenne d'angles à cheval sur l'origine, signe du terme de rotation. Elle est vérifiée contre leurs 34 paires de référence, conçues pour débusquer ces erreurs.

Return values
float

Écart perceptuel, nul si les deux couleurs sont identiques

colorimetrie_delta_e_2000()

Calcule l'écart perceptuel ΔE₀₀ entre deux couleurs hexadécimales, selon la formule CIEDE2000.

colorimetrie_delta_e_2000(string $hex1, string $hex2) : float

Ordres de grandeur usuels : en deçà de 1 l'écart n'est pas perceptible, autour de 2,3 il correspond au seuil de discrimination, au-delà de 5 les deux couleurs se distinguent au premier coup d'œil.

Parameters
$hex1 : string

Première couleur hexadécimale

$hex2 : string

Seconde couleur hexadécimale

Return values
float

Écart perceptuel, nul si les deux couleurs sont identiques


        
On this page

Search results