Php colorsys

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 / Exemple :


<?php
/**



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'); } /** *
  • $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.

Codes Sources

A voir également

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.