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

0/5 (5 avis)

Snippet vu 5 519 fois - Téléchargée 17 fois

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

Ajouter un commentaire Commentaires
cs_Astalavista Messages postés 192 Date d'inscription lundi 24 décembre 2001 Statut Membre Dernière intervention 3 février 2010
9 déc. 2012 à 14:15
Peut être utile dans certains cas spécifique, je la met de coté.
Je ne comprend pas pourquoi tu as utilisé des String plutot que des valeurs numérique pour ensuite faire un calcul à la place de valeurs spécifique.
Sinon, petite optimisation :
Ligne 43 :
$color = array($r, $g, $b);
cs_benoitdu69 Messages postés 21 Date d'inscription mercredi 22 février 2012 Statut Membre Dernière intervention 30 novembre 2012
9 juil. 2012 à 14:41
ça fonctionne !
cs_BenSigmund Messages postés 1 Date d'inscription lundi 11 juin 2012 Statut Membre Dernière intervention 28 juin 2012
28 juin 2012 à 15:44
Merci ^^
cs_MrBoubou Messages postés 18 Date d'inscription dimanche 3 novembre 2002 Statut Membre Dernière intervention 16 novembre 2006
18 juin 2012 à 12:27
J'ai tester tes fonctions et ça fonctionne correctement. Bien joué.
BURAK77 Messages postés 6 Date d'inscription dimanche 29 juin 2008 Statut Membre Dernière intervention 12 juin 2012
12 juin 2012 à 11:12
Merci beaucoup, j'adore :D

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.