Accueil > > > PHP COLORSYS
PHP COLORSYS
Information sur la source
Description
Cet objet rassemble quelques outils pour jouer avec les couleurs. J'en avais besoin pour choper le HSV d'une couleur et ainsi filtrer selon la saturation et la valeur. Je crois que la plupart de ces fonctions existent déjà sur phpcs, a part rgb2hsv, qui n'est qu'une traduction de la méthode utilisée sur wikipedia.
Source
- <?php
- /**
- * @copyright Copyright (c) 2009, Bellière Ludovic
- * @license http://opensource.org/licenses/mit-license.php MIT license
- */
-
- class Colorsys {
-
- const HEX = 'hex';
- const RGB = 'rgb';
-
- protected $_type;
- protected $_color = array(
- self::HEX => '',
- self::RGB => ''
- );
- protected $_current_color;
-
- /**
- * Initialise l'objet. $color peut-être une couleur au format HTML ou RGB.
- * L'idée est de pouvoir utiliser toute fonction non statique de l'objet sans avoir
- * a passer d'arguments.
- *
- * Si $color est au format RGB, cela doit-être un tableau.
- */
- function __construct($color) {
- if (!is_array($color)) {
- if ($color == 'random')
- $color = self::random('hex');
- $color = str_replace('#','',$color);
- $this->_type = self::HEX;
- } else {
- if (!is_array($color))
- throw new exception('Invalid type given for RGB. An array is expected, '.gettype($rgb).' given.');
- $this->_type = self::RGB;
- }
-
- $this->_current_color = $color;
- $this->_color[$this->_type] = $color;
- $this->_color = array(
- self::RGB => self::hex2rgb(),
- self::HEX => self::rgb2hex(),
- );
-
- }
-
- /**
- * Retourne la couleur au format RGB indexé sur les clef r,g et b.
- * @return array
- */
- function getRgb() {
- if (isset($this->_color[self::RGB])) {
- return $this->_color[self::RGB];
- } elseif ($this->_type == self::HEX) {
- $this->_color[self::RGB] = self::hex2rgb($this->_current_color);
- return $this->_color[self::RGB];
- } else {
- return $this->_current_color;
- }
- }
-
- /**
- * Retourne la couleur au format HTML sans le #
- * @return string
- */
- function getHex() {
- if (isset($this->_color[self::HEX])) {
- return $this->_color[self::HEX];
- } elseif ($this->_type == self::RGB) {
- $this->_color[self::HEX] = self::rgb2hex($this->_current_color);
- return $this->_color[self::HEX];
- } else {
- return $this->_current_color;
- }
- }
-
- /**
- * Retourne la valeur inversée d'une couleur.
- */
- function revert($hex=false,$rgb=false) {
- if (!$hex && !$rgb) {
- $type = $this->_type;
- switch ($type) {
- case self::HEX:
- return self::getRgb();
- break;
- case self::RGB:
- return self::getHex();
- break;
- }
- } else {
- if (!$hex) {
- if (!is_array($rgb)) {
- throw new exception('Invalid type given for RGB. An array is expected, '.gettype($rgb).' given.');
- }
- $type = self::RGB;
- $color = self::rgb2hex($rgb);
- } else {
- $type = self::HEX;
- $color = array(
- 'r' => substr($hex,0,2),
- 'g' => substr($hex,2,2),
- 'b' => substr($hex,-2),
- );
- }
- }
-
- $color = str_replace('#','',$color);
-
- $r = str_pad(dechex(255 - hexdec($color['r'])),2,0);
- $g = str_pad(dechex(255 - hexdec($color['g'])),2,0);
- $b = str_pad(dechex(255 - hexdec($color['b'])),2,0);
-
- return "#$r$g$b";
- }
-
- /**
- * Transforme une couleur RGB en son homologue HTML
- *
- * @param $rgb Must be an array indexed on r, g and b.
- */
- function rgb2hex($rgb=false) {
- if (!$rgb) {
- if ($this->_type == self::RGB)
- $rgb = $this->_current_color;
- else
- return $this->_current_color;
- } else {
- if (!is_array($rgb)) {
- throw new exception('Invalid type given for RGB. An array is expected, '.gettype($rgb).' given.');
- }
- }
-
- $r = dechex($rgb['r']);
- $g = dechex($rgb['g']);
- $b = dechex($rgb['b']);
-
- return compact('r','g','b');
- }
-
- /**
- * Transforme une couleur html en son homologue RGB
- */
- function hex2rgb($hex=false) {
- if (!$hex) {
- if ($this->_type == self::HEX)
- $hex = $this->_current_color;
- else
- return $this->_current_color;
- }
-
- $r = hexdec(substr($hex,0,2));
- $g = hexdec(substr($hex,2,2));
- $b = hexdec(substr($hex,-2));
-
- return compact('r', 'g', 'b');
- }
-
- /**
- * Transforme une couleur RGB en son homologue HSV http://en.wikipedia.org/wiki/HSL_and_HSV
- *
- * $r peut être un tableau regroupant les trois arguments, utile pour
- * l'utiliser en conjonction avec les autres fonctions de l'objet.
- *
- * @return array
- */
- static function rgb2hsv($r, $g=0, $b=0) {
- if (is_array($r) && count($r)==3) {
- extract($r);
- }
- $max = max($r, $g, $b);
- $min = min($r, $g, $b);
- $delta = $max-$min;
-
- // Si le maximum des 3 valeurs est 0, alors la couleur est le noir.
- if ($max == 0)
- return array('h'=>0, 's'=>0, 'v'=>0);
-
- $s = $delta / $max;
- $v = $max;
-
- switch ($max) {
- case $g:
- if ($delta != 0) {
- $h = 2 + ($b - $r) / $delta;
- } else {
- $s = 0;
- $h = 2 + $b - $r;
- }
- break;
- case $b:
- if ($delta != 0) {
- $h = 4 + ($r - $g) / $delta;
- } else {
- $s = 0;
- $h = 4 + $r - $g;
- }
- break;
- case $r:
- if ($delta != 0) {
- $h = ($g - $b) / $delta;
- } else {
- $h = $g - $b;
- }
- break;
- }
-
- $h*=60;
- if ($h<0)
- $h+=360;
- $h = round($h);
- $s = round($s*255);
-
- return compact('h','s','v');
- }
-
- /**
- * Génère une couleur aléatoire et la retourne selon $format.
- *
- * $format peut-être soit 'rgb', soit 'hex' (les valeurs de self::HEX, self::RGB)
- */
- static function random($format='rgb') {
- $color = rand(0, hexdec('ffffff'));
- if ($format=='hex') {
- return dechex($color);
- } else {
- return array(
- 'r' => substr($color,0,2),
- 'g' => substr($color,2,2),
- 'b' => substr($color,-2));
- }
- }
- }
-
- $colors = explode("\n",str_replace('#','',file_get_contents('./colors.txt')));
-
-
- $get = array();
- echo "<pre>";
- echo str_pad(' id',4,' '),str_pad('|',7,' '),str_pad('hsv',9, ' '), '|', str_pad(' html', 7, ' '), '|', str_pad(' rgb', 15, ' '),"|\n";
- foreach ($colors as $id => $codes) {
- if (empty($codes))
- break;
- $color = new Colorsys($codes);
- $hsv = implode(', ', Colorsys::rgb2hsv($color->hex2rgb()));
- $rgb = implode(', ',$color->hex2rgb());
- echo str_pad($id,4,' '),'|',
- str_pad("($hsv)",15, ' '), '|',
- str_pad("#$codes",7,' '),'|',
- str_pad("($rgb)",15,' '),'|',
- "<span style=\"background:#$codes\">____</span>\n";
- }
- echo "</pre>";
<?php
/**
* @copyright Copyright (c) 2009, Bellière Ludovic
* @license http://opensource.org/licenses/mit-license.php MIT license
*/
class Colorsys {
const HEX = 'hex';
const RGB = 'rgb';
protected $_type;
protected $_color = array(
self::HEX => '',
self::RGB => ''
);
protected $_current_color;
/**
* Initialise l'objet. $color peut-être une couleur au format HTML ou RGB.
* L'idée est de pouvoir utiliser toute fonction non statique de l'objet sans avoir
* a passer d'arguments.
*
* Si $color est au format RGB, cela doit-être un tableau.
*/
function __construct($color) {
if (!is_array($color)) {
if ($color == 'random')
$color = self::random('hex');
$color = str_replace('#','',$color);
$this->_type = self::HEX;
} else {
if (!is_array($color))
throw new exception('Invalid type given for RGB. An array is expected, '.gettype($rgb).' given.');
$this->_type = self::RGB;
}
$this->_current_color = $color;
$this->_color[$this->_type] = $color;
$this->_color = array(
self::RGB => self::hex2rgb(),
self::HEX => self::rgb2hex(),
);
}
/**
* Retourne la couleur au format RGB indexé sur les clef r,g et b.
* @return array
*/
function getRgb() {
if (isset($this->_color[self::RGB])) {
return $this->_color[self::RGB];
} elseif ($this->_type == self::HEX) {
$this->_color[self::RGB] = self::hex2rgb($this->_current_color);
return $this->_color[self::RGB];
} else {
return $this->_current_color;
}
}
/**
* Retourne la couleur au format HTML sans le #
* @return string
*/
function getHex() {
if (isset($this->_color[self::HEX])) {
return $this->_color[self::HEX];
} elseif ($this->_type == self::RGB) {
$this->_color[self::HEX] = self::rgb2hex($this->_current_color);
return $this->_color[self::HEX];
} else {
return $this->_current_color;
}
}
/**
* Retourne la valeur inversée d'une couleur.
*/
function revert($hex=false,$rgb=false) {
if (!$hex && !$rgb) {
$type = $this->_type;
switch ($type) {
case self::HEX:
return self::getRgb();
break;
case self::RGB:
return self::getHex();
break;
}
} else {
if (!$hex) {
if (!is_array($rgb)) {
throw new exception('Invalid type given for RGB. An array is expected, '.gettype($rgb).' given.');
}
$type = self::RGB;
$color = self::rgb2hex($rgb);
} else {
$type = self::HEX;
$color = array(
'r' => substr($hex,0,2),
'g' => substr($hex,2,2),
'b' => substr($hex,-2),
);
}
}
$color = str_replace('#','',$color);
$r = str_pad(dechex(255 - hexdec($color['r'])),2,0);
$g = str_pad(dechex(255 - hexdec($color['g'])),2,0);
$b = str_pad(dechex(255 - hexdec($color['b'])),2,0);
return "#$r$g$b";
}
/**
* Transforme une couleur RGB en son homologue HTML
*
* @param $rgb Must be an array indexed on r, g and b.
*/
function rgb2hex($rgb=false) {
if (!$rgb) {
if ($this->_type == self::RGB)
$rgb = $this->_current_color;
else
return $this->_current_color;
} else {
if (!is_array($rgb)) {
throw new exception('Invalid type given for RGB. An array is expected, '.gettype($rgb).' given.');
}
}
$r = dechex($rgb['r']);
$g = dechex($rgb['g']);
$b = dechex($rgb['b']);
return compact('r','g','b');
}
/**
* Transforme une couleur html en son homologue RGB
*/
function hex2rgb($hex=false) {
if (!$hex) {
if ($this->_type == self::HEX)
$hex = $this->_current_color;
else
return $this->_current_color;
}
$r = hexdec(substr($hex,0,2));
$g = hexdec(substr($hex,2,2));
$b = hexdec(substr($hex,-2));
return compact('r', 'g', 'b');
}
/**
* Transforme une couleur RGB en son homologue HSV http://en.wikipedia.org/wiki/HSL_and_HSV
*
* $r peut être un tableau regroupant les trois arguments, utile pour
* l'utiliser en conjonction avec les autres fonctions de l'objet.
*
* @return array
*/
static function rgb2hsv($r, $g=0, $b=0) {
if (is_array($r) && count($r)==3) {
extract($r);
}
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$delta = $max-$min;
// Si le maximum des 3 valeurs est 0, alors la couleur est le noir.
if ($max == 0)
return array('h'=>0, 's'=>0, 'v'=>0);
$s = $delta / $max;
$v = $max;
switch ($max) {
case $g:
if ($delta != 0) {
$h = 2 + ($b - $r) / $delta;
} else {
$s = 0;
$h = 2 + $b - $r;
}
break;
case $b:
if ($delta != 0) {
$h = 4 + ($r - $g) / $delta;
} else {
$s = 0;
$h = 4 + $r - $g;
}
break;
case $r:
if ($delta != 0) {
$h = ($g - $b) / $delta;
} else {
$h = $g - $b;
}
break;
}
$h*=60;
if ($h<0)
$h+=360;
$h = round($h);
$s = round($s*255);
return compact('h','s','v');
}
/**
* Génère une couleur aléatoire et la retourne selon $format.
*
* $format peut-être soit 'rgb', soit 'hex' (les valeurs de self::HEX, self::RGB)
*/
static function random($format='rgb') {
$color = rand(0, hexdec('ffffff'));
if ($format=='hex') {
return dechex($color);
} else {
return array(
'r' => substr($color,0,2),
'g' => substr($color,2,2),
'b' => substr($color,-2));
}
}
}
$colors = explode("\n",str_replace('#','',file_get_contents('./colors.txt')));
$get = array();
echo "<pre>";
echo str_pad(' id',4,' '),str_pad('|',7,' '),str_pad('hsv',9, ' '), '|', str_pad(' html', 7, ' '), '|', str_pad(' rgb', 15, ' '),"|\n";
foreach ($colors as $id => $codes) {
if (empty($codes))
break;
$color = new Colorsys($codes);
$hsv = implode(', ', Colorsys::rgb2hsv($color->hex2rgb()));
$rgb = implode(', ',$color->hex2rgb());
echo str_pad($id,4,' '),'|',
str_pad("($hsv)",15, ' '), '|',
str_pad("#$codes",7,' '),'|',
str_pad("($rgb)",15,' '),'|',
"<span style=\"background:#$codes\">____</span>\n";
}
echo "</pre>";
Conclusion
J'ai écrit ça en vitesse, il peut rester quelques trucs inutiles ou erreurs de logique. (Et ça serait sympa de me les montrer ;))
Note : Les fonctions devant retourner une valeur décomposée (genre: RGB) retournent un array indexé sur l'acronyme en minuscule. Les valeurs hexadécimale (aka. 'html') sont retournées en tant que string.
L'archive contiens en plus du code, un fichier colors.txt listant quelques couleurs hexadécimales. L'archive est totalement optionnel et n'existe que pour ceux qui ont la flemme de recréer ce fichier, bien que décompresser l'archive est un processus qui devrait être plus long.
Historique
- 14 septembre 2009 12:26:14 :
- Correction d'une "faute de frappe" dans la fonction random : elle retourne maintenant un tableau correct.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
gestion de couleurs dans un menu [ par loutwice ]
salut,alors voilà je me prends la tête avec les couleurs pour un menu.je m'explique: dans un tableau j'ai une image comme fond,et quand je survole cel
palette de couleurs [ par yebs ]
salut, je suis en train de faire un site dynamique PHP/MySQL qui possède un code couleur selon les rubriques.J'aimerais permettre à l'administrateur d
Dégradé de couleurs [ par nicolas66 ]
Bonjour à tous,je dois réaliser une image en php et j'ai une échelle de couleur à faire. Je sais qu'il existe un script permettant de faire un dégradé
palette de colors [ par benstar ]
salut les gars. je voudrais bien realiser une palette de couleurs de facon a choisir une couleur et renvoyer le code ds une table. en fait j'ai fait
Récuperer code RGB d'une couleur indexé [ par drof ]
bonjour a tous,je cherche comment récupérer la valeur RGB d'une couleur indexé. Je m'explique, mon script charge une image puis avec imagecolorat(), j
Conversion image en couleurs données [ par matique ]
Bonjour, Je souaiterais convertir une image en restreignant sa palette de couleurs à une palette de couleurs que j'ai definit. Par exemple : j'ai un
Couleur php [ par twixster ]
Voila savez vous ou on peut trouver un large echantillon de couleur : exemple : #00ff00 = vert,
Comparer deux dates [ par zoiadidier ]
Je compare actuellement deux dates pour qu'un changement de couleur s'effectue quand un date depasse la limite indiquée. Ce que je voudrai faire
Probleme de groupage dans une requete SELECT [ par niko14 ]
Salut tout le monde! J'ai une question pour vous! En fait voila je voudrais fair eune requete sur 3 tables qui s'appellent : histbudget, couleur et ty
Couleur dans un tableau [ par a_sophie ]
Salut!! Dans mon formulaire je déclare un tableau qui renvoie le résultat d'uen requete
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|