begin process at 2012 05 27 17:54:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > PHP COLORSYS

PHP COLORSYS


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :couleurs, colorsys, hsv, rgb, couleur Niveau :Initié Date de création :12/09/2009 Date de mise à jour :14/09/2009 12:26:12 Vu / téléchargé :2 707 / 108

Auteur : Jayadeva

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note


 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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source avec Zip PHPMUDNAMES - GÉNÉRATEUR DE NOMS
Source avec Zip DÉSINSCRIPTION DE MEMBRES
MÉLANGE DE LETTRES
Source avec Zip MAEMISE: LIVRE D'OR (1.0)
Source avec Zip SOUHAIT D'ANNIVERSAIRE, DE BONNE PAQUE ET BONNE ANNÉE

 Sources de la même categorie

Source avec une capture MODULE JOOMLA 1.5 NOW LISTENING par Alcantornet
Source avec Zip Source avec une capture UPLOAD CENTER par basssem81
Source avec Zip COMPTEUR DE CLIQUE PHP AVEC JQUERY par devgoneti
Source avec Zip LIVRE D'OR SIMPLE (POUR DÉBUTANT) par devgoneti
Source avec Zip SCRIPT TRAVAUX POUR VOTRE SITE par FleuryK

 Sources en rapport avec celle ci

GESTION DE COULEUR par manuche
Source avec Zip Source avec une capture CARTE DE L'EUROPE EN FONCTION DES VISITEURS par GillesWebmaster
Source avec Zip Source avec une capture POO - GESTION DES COULEURS par DiGhan
LIB - MANIPULATION DES COULEURS (RGB-HEXA) par DiGhan
Source avec Zip CLASS DE COULEUR par audayls

Commentaires et avis

Commentaire de neigedhiver le 13/09/2009 00:31:58

Salut,

Je n'ai regardé que la structure du code, de manière très sommaire : je n'ai fait que défiler la page de haut en bas, en regardant vite fait l'apparence...

Donc aucun commentaire constructif sur le code en lui-même.
Hé ouais, je commente quand même, parce qu'il est important pour moi de te remercier de faire du code objet, qui a l'air aussi propre, parce que dans les dernières 3 sources publiées à l'heure de la rédaction de ce "commentaire", c'est la seule qui soit aussi propre et qui (me) donne autant envie de s'en servir, même si je ne sais pas ce que c'est hsv.
Merci donc, ça fait plaisir de voir des sources propres.

Commentaire de Jayadeva le 13/09/2009 03:11:21

HSV : Hue, Saturation, Value : http://en.wikipedia.org/wiki/HSL_and_HSV

Et de rien, quand je me relis, j'aime pas quand ça pique les yeux :p

Commentaire de bubuze le 14/09/2009 10:20:21

la fonction random retourne l'array(
'r' => substr($color,0,2),
'b' => substr($color,2,2),
'r' => substr($color,-2));
ce serait pas rgb au lieu de rbr ?

Commentaire de Jayadeva le 14/09/2009 12:15:48

Ha ha, ouais. Bien vu, je corrige ça.

 Ajouter un commentaire


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, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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&#233;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!!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dans mon formulaire je d&#233;clare un tableau qui renvoie le r&#233;sultat d'uen requete


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales