[RESOLU] couleurs & espaces colorimétriques

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] couleurs & espaces colorimétriques

Re: couleurs & espaces colorimétriques

par drBouvierLeduc » 23 oct. 2012, 13:49

Un peu de lecture théorique sur les couleurs m'a aidé : la roue qui m'intéressait s'appelle la roue RYB (RJB en français : rouge jaune bleu) et correspond à la synthèse soustractive des couleurs (par opposition à la rouge RGB -> synthèse additive).
Bref, j'ai trouvé une fonction écrite en java qui fait exactement ce que je cherchais : modifier une teinte sur la roue RYB.
Elle se trouve dans librairie ColorLib pour processing (au passage, merci l'open source !) : https://code.google.com/p/colorlib/sour ... h.java#260.
Il suffit de la transposer en PHP et le tour est joué.

Voilà ce que ça donne si ça intéresse des gens :
/**
 * Modifie une teinte selon la roue RYB (rouge jaune bleu).
 * Adapte de ColorLib / licence MIT
 * https://code.google.com/p/colorlib/
 * 
 * @param $h int
 *		teinte a modifier
 *		0 < $h < 1
 * @param $angle int
 *		angle a parcourir sur la roue chromatique
 *		0 < $angle < 360
 * @return int
 *		nouvelle teinte
 *		0 < $h < 1
 */
function rotation_ryb($h, $angle=30){

	$h *= 360;
	$angle %= 360;
	$angle_ref = 0;
	$roue = array(
			array( 0, 0 ), array( 15, 8 ), array( 30, 17 ), array( 45, 26 ),
			array( 60, 34 ), array( 75, 41 ), array( 90, 48 ), array( 105, 54 ), array( 120, 60 ),
			array( 135, 81 ), array( 150, 103 ), array( 165, 123 ), array( 180, 138 ),
			array( 195, 155 ), array( 210, 171 ), array( 225, 187 ), array( 240, 204 ),
			array( 255, 219 ), array( 270, 234 ), array( 285, 251 ), array( 300, 267 ),
			array( 315, 282 ), array( 330, 298 ), array( 345, 329 ), array( 360, 0 ) 
		);

	for ($i = 0; $i < count($roue) - 1; $i++) {
		$x0 = $roue[$i][0];
		$y0 = $roue[$i][1];
		$x1 = $roue[$i + 1][0];
		$y1 = $roue[$i + 1][1];
		if ($y1 < $y0) {
			$y1 += 360;
		}
		if ($y0 <= $h && $h <= $y1) {
			$angle_ref = 1 * $x0 + ($x1 - $x0) * ($h - $y0) / ($y1 - $y0);
		}
	}
	$angle_ref = ($angle_ref + $angle) % 360;

	for ($i = 0; $i < count($roue) - 1; $i++) {
		$x0 = $roue[$i][0];
		$y0 = $roue[$i][1];
		$x1 = $roue[$i + 1][0];
		$y1 = $roue[$i + 1][1];
		if ($y1 < $y0)
			$y1 += 360;
		if ($x0 <= $angle_ref && $angle_ref <= $x1) {
			$h = 1 * $y0 + ($y1 - $y0) * ($angle_ref - $x0) / ($x1 - $x0);
		}
	}

	$h %= 360;
	$h /= 360;

	return $h;
}

Re: couleurs & espaces colorimétriques

par drBouvierLeduc » 18 oct. 2012, 15:08

Merci pour le lien.
En fait mon problème n'est pas le conversion en elle-même, j'utilise les indications fournies par http://www.easyrgb.com/index.php?X=MATH et ça marche au poil.
Pour résumer, j'ai deux questions :
- Est-ce que la conversion de rgb en lab est la direction à suivre quant à mon problème de roue chromatique ?
- Et si oui, comment manipuler les composantes a et b (de lab) pour "faire glisser" la teinte d'une couleur sur le cercle chromatique ?

Re: couleurs & espaces colorimétriques

par Mazarini » 18 oct. 2012, 14:19

J'ai vu ca : http://www.developpez.net/forums/d11935 ... -couleurs/
Le code n'est pas en PHP, mais tu dois pouvoir t'en inspirer.

Pour un problème similaire, j'avais choisi une représentation en cube avec l'affichage d'une tranche selon une face.

couleurs & espaces colorimétriques

par drBouvierLeduc » 18 oct. 2012, 13:02

Bonjour,

Je souhaite, à partir d'une couleur hexa donnée, générer une palette de couleurs de la même façon que http://colorschemedesigner.com/
Pour ce faire, j'ai une fonction qui effectue les étapes suivantes :
  • * conversion hexa -> rgb -> hsv (teinte-saturation-valeur)
    * modification de la teinte (très simple : modifier $h, $h allant de 0 à 1)
    * conversion inverse hsv -> rgb -> hexa
Ca marche, pas de bug, mais les résultats ne sont pas ceux que je souhaite.

Concrètement, prenons l'exemple de la couleur rouge. Je souhaite générer sa couleur complémentaire, à l'opposé sur le cercle chromatique.
Ma fonction me renvoie la couleur Cyan (bleu clair), tandis que je souhaite avoir du vert.

L'image suivante résume bien mon problème : ma fonction semble travailler avec le cercle chromatique "B" où effectivement l'opposé du rouge est le cyan.
Moi je souhaiterais travailler avec le cercle chromatique "A", où l'opposé du rouge est le vert.
De façon générale (et subjective) les couleurs de ce cercle chromatique me semblent mieux réparties.

Image

Là je suis un peu perdu, j'ai cru comprendre que le cercle chromatique "A" correspond à l'espace de couleur Cie Lab.
Faut-il donc convertir mon hexa en lab et faire la manip de couleur dessus ?
Pour changer une teinte en hsv c'est simple, il suffit de faire varier $H, mais je je n'ai aucune idée de la façon de faire en lab.

Voilà, si d'autres personnes ont déjà été confrontées au même souci, toute aide est bienvenue.