Dur Comme Faire

Aller au contenu | Aller au menu | Aller à la recherche

Problème de couleur de texte - Amélioration

Après quelques recherches sur Internet, j'ai découvert un article expliquant une manière de déterminer la luminosité d'une couleur. Je me suis donc empressé d'améliorer ma fonction qui permet de déterminer la couleur d'un texte en fonction de celle du fond.

Le principe est simple : on donne un poids différent à chacune des composantes de la couleur selon l'importance qu'elle a dans la perception que nous avons de la luminosité. La formule suivante retourne une valeur comprise entre 0 et 255. 0 étant la plus faible luminosité possible et 255 la plus forte.

luminosité = ((rouge x 299) + (vert x 587) + (bleu x 114))
                  / 1000

Ma fonction devient donc :

function couleurTexte($couleur)
{
    $rouge      = hexdec(substr($couleur, 1, 2));
    $vert       = hexdec(substr($couleur, 3, 2));
    $bleu       = hexdec(substr($couleur, 5, 2));
    $luminosite = (($rouge * 299) + ($vert * 587) + ($bleu * 114))
                      / 1000;
    return ($luminosite > 127) ? '#000000' : '#FFFFFF';
}

Tandis que mon plugin Smarty devient ceci :

<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {text_color} function plugin
*
* Type:     function<br>
* Name:     text_color<br>
* Date:     April 15, 2005<br>
* Purpose:  determinate the text color depending on the
                 background color<br>
* Input:
*         - bkg   = color of the background
*         - light = color for the light text (optional,
                       white is default)
*         - dark  = color for the dark text (optional,
                        black is default)
*
* Examples:<br>
* <pre>
* {text_color bkg=#FF0000}
* {text_color bkg=#FF00DE light=#CCCCCC dark=#333333}
* </pre>
*
* @link http://smarty.php.net/manual/en/language.function.
         text_color.php {text_color}
*       (Smarty online manual)
* @author Jean-Marc Fontaine <jmf at durcommefaire dot net>
* @version  1.1
* @param array
* @param Smarty
* @return string
*/
function smarty_function_text_color($params, &$smarty)
{
    if (substr($params['bkg'], 0, 1) != '#') {
        return 'inherit';
    }
   
    $red          = hexdec(substr($params['bkg'], 1, 2));
    $green        = hexdec(substr($params['bkg'], 3, 2));
    $blue         = hexdec(substr($params['bkg'], 5, 2));
    $brightness   = (($red * 299) + ($green * 587) + ($blue * 114))
                         / 1000;
    $dark_color   = isset($params['dark']) ? $params['dark'] :
                                '#000000';
    $ligth_color  = isset($params['light']) ? $params['light'] :
                               '#FFFFFF';
    return ($brightness > 127) ? $dark_color : $ligth_color;
}
/* vim: set expandtab: */
?>

Un comparatif montre que dans certains cas, la nouvelle méthode améliore grandement la lisibilité du texte.

vendredi 15 avril 2005 à 17h52 - PHP Fil de syndication

Rétroliens

Aucun rétrolien pour le moment.

Les rétroliens pour ce billet sont fermés.

Commentaires

Gravatar de Vincent

La formule de calcul de la luminosité que tu utilises semble être celle utilisée par les standards NTSC et PAL.

Il semble qu'il y en ait une plus récente qui soit :
r * 0.2125 + v * 0.7154 + b * 0.0721


Il existe apparement plusieurs autres formules, voici quelques liens que j'ai trouvé en effectuant des recherches sur le sujet :
- astronomy.swin.edu.au/~pb...
- express.colorcom.com/bull...

Tout ce que je peux dire actuellement, c'est qu'il ne semble pas y avoir de solution parfaite pour le moment.

Vincent le jeudi 3 novembre 2005 à 12h06 Icone du permalien

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.

XHTML - CSS - DotClear - Technorati

Les billets de ce blog sont sous licence Creative Commons