Générer une couleur de police compatible avec une couleur de fond donnée

Contenu du snippet

La fonction getFontColor() reçoit en paramètre d'entrée une couleur de fond et renvoie en sortie la couleur de police la plus appropriée pour ce fond.

C'est utile dans le cas où un utilisateur peut choisir n'importe quel couleur de fond pour une page ou un élément, il faut donc changer la couleur de police afin que le texte reste lisible quel que soit la couleur de fond.

Au cas où vous souhaiteriez juger l'efficacité (ou éventuellement améliorer le réglage des seuils), j'ai rajouté du code qui permet de tester la fonction en affichant aléatoirement des dizaines de couleurs de fond aléatoires et les polices correspondantes.

N'hésitez pas à me faire part de vos réflexions ;)

Source / Exemple :


<?php

	/* auteur: Benjamin Poly
	contact: benjamin.poly88@gmail.com */

	function getFontColor($b_color) {
		
		$white = '#FFFFFF'; //couleur blanc
		$black = '#000000'; //couleur noir
		$seuilCouleur = 165;//seuil qui détermine l'intensité de couleur
		$opposite_red = '#FFFF00';//couleur de police pour fond rouge
		$opposite_yellow = '#000CFF';//couleur de police pour fond jaune
		$opposite_green = '#0000FF';//couleur de police pour fond vert
		$opposite_clear_blue = '#1900FF';//couleur de police pour fond bleu clair
		$opposite_dark_blue = '#EEFF00';//couleur de police pour fond bleu foncé
		$opposite_purple = '#FFFF00';//couleur de police pour fond violet
		$tmp = 0;
		
		$r = hexdec(substr($b_color, 1, 2));
		$g = hexdec(substr($b_color, 3, 2));
		$b = hexdec(substr($b_color, 5, 2));
		
		$ecart1 = $r - $g;
		$ecart2 = $g - $b;
		$ecart3 = $r - $b;
		$limite_ecart = 120; 
		$total = $r + $g + $b;
		
		//on peut determiner si une couleur est essentiellement composée de noir ou blanc en regardant si l'écart entre les nombres est faible
		if(abs($ecart1) < $limite_ecart && abs($ecart2) < $limite_ecart && abs($ecart3) < $limite_ecart) {
			
			$limite = 420;//seuil qui détermine le niveau de noir ou blanc
			if($total < $limite) {
				$f_color = $white;
			}
			else {
				$f_color = $black;
			}
		}
		else { //si une couleur domine plus que le noir et blanc
	
			
			$color = array();
			$color[0] = $r;
			$color[1] = $g;
			$color[2] = $b;
			
			foreach ($color as $val) {
				if ($val > $seuilCouleur) {
					$tmp++;
				}
				else {
					$f_color = $white;
				}
			}
	
			//si la couleur rouge, vert ou bleu foncé domine
			if ($tmp == 1) {
				if ($r > $seuilCouleur) {//on determine si la couleur est rouge
						$f_color = $opposite_red;
				}
				if ($g > $seuilCouleur) {//on determine si la couleur est verte
						$f_color = $opposite_green;
				}
				if ($b > $seuilCouleur) {//on determine si la couleur est bleu foncée
						$f_color = $opposite_dark_blue;
				}
			}
			
			//si la couleur jaune, bleu clair ou violet domine
	 		if ($tmp == 2) {
				if ($r > $seuilCouleur && $g > $seuilCouleur) {//on determine si la couleur est jaune
						$f_color = $opposite_yellow;
				}
				if ($g > $seuilCouleur && $b > $seuilCouleur) {//on determine si la couleur est bleu claire
						$f_color = $opposite_clear_blue;
				}
				if ($r > $seuilCouleur && $b > $seuilCouleur) {//on determine si la couleur est violet
						$f_color = $opposite_purple;
				}
			}
		}
		return $f_color; //on retourne la couleur de police appropriée
	}

	
	//cette fonction génère une couleur aléatoire, elle est utile seulement pour tester getFontColor()
	function genRandomColor()
	{
		$color = dechex(mt_rand(0,16777215));
		$color = str_pad($color,6,'0');
		return '#'.$color;
	}
	
	
	//cette partie sert à tester la fonction getFontColor() en générant plusieurs couleurs de fond aléatoires avec la couleur de police qui leur est associée
	$cases = 20;//nombre de cases de couleur
	for ($i=0;$i<10;$i++) {
		for ($j=0; $j<$cases; $j++) {
			$b_color = genRandomColor();
			echo '<div style="background-color:'.$b_color.'; color:'.getFontColor($b_color).';padding:10px;width:120px;diplay:inline;float:left;">abcdefghijkl</div>';
		}
	}
	

?>

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.