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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 135 fois - Téléchargée 15 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

BURAK77
Messages postés
6
Date d'inscription
dimanche 29 juin 2008
Statut
Membre
Dernière intervention
12 juin 2012
-
Merci beaucoup, j'adore :D
cs_MrBoubou
Messages postés
18
Date d'inscription
dimanche 3 novembre 2002
Statut
Membre
Dernière intervention
16 novembre 2006
-
J'ai tester tes fonctions et ça fonctionne correctement. Bien joué.
cs_BenSigmund
Messages postés
1
Date d'inscription
lundi 11 juin 2012
Statut
Membre
Dernière intervention
28 juin 2012
-
Merci ^^
cs_benoitdu69
Messages postés
21
Date d'inscription
mercredi 22 février 2012
Statut
Membre
Dernière intervention
30 novembre 2012
-
ça fonctionne !
cs_Astalavista
Messages postés
194
Date d'inscription
lundi 24 décembre 2001
Statut
Membre
Dernière intervention
3 février 2010
-
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);

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.