viceversa hexadecimal conversor colores color php colors hex hsv

php - hexadecimal - rgba to hex



Porcentaje de Hexcolor en PHP (3)

Este no es mi código y no recuerdo dónde lo encontré. Lo he usado durante un par de años y funciona perfectamente para mí. Podría ser lo que estás buscando (o parte de él puede ser).

<?php class colour { protected $R = 0; //Red protected $G = 0; //Green protected $B = 0; //Blue protected $H = 0; //Hue protected $S = 0; //Saturation protected $L = 0; //Luminance protected $hex = 0; protected $web; protected $complement; public function __construct($r, $g = false, $b = false) { //set up array of web colour names $this->web = array( ''black'' => ''#000000'', ''green'' => ''#008000'', ''silver'' => ''#C0C0C0'', ''lime'' => ''#00FF00'', ''gray'' => ''#808080'', ''olive'' => ''#808000'', ''white'' => ''#FFFFFF'', ''yellow'' => ''#FFFF00'', ''maroon'' => ''#800000'', ''navy'' => ''#000080'', ''red'' => ''#FF0000'', ''blue'' => ''#0000FF'', ''purple'' => ''#800080'', ''teal'' => ''#008080'', ''fuchsia'' => ''#FF00FF'' ); //accept either R,G,B or hex colour //If hex, convert to RGB //RGB? if($r && $g && $b){ //yes then save $this->R = $r; $this->G = $g; $this->B = $b; } elseif(isset($this->web[strtolower($r)])){ //named colour? $this->hex = $this->web[strtolower($r)]; $this->convertToRGB($this->hex); } else { //no - so convert if($r[0] != ''#'') $r = ''#'' . $r; $this->hex = $r; $this->convertToRGB($r); } $this->rgbTohsl(); //$this->complement = $this->getComplement(); } public function getLighter($factor) { //return colour lightened by %$factor in hex //$factor can be negative to give a darker colour if($factor > 1 || $factor < -1) $factor = $factor/100; $r = (string)round($this->R+((255 - $this->R) * $factor)); $g = (string)round($this->G+((255 - $this->G) * $factor)); $b = (string)round($this->B+((255 - $this->B) * $factor)); if($r > 255)$r = 255; if($r < 0)$r = 0; if($g > 255)$g = 255; if($g < 0)$g = 0; if($b > 255)$b = 255; if($b < 0)$b = 0; var_dump($r, $g, $b); return $this->convertToHex($r, $g, $b); } public function opposite() { $r = $this->R; $g = $this->G; $b = $this->B; $r = 255 - $r; $g = 255 - $g; $b = 255 - $b; return $this->convertToHex($r, $g, $b); } public function getRGB() { //returns an array (r, g, b) $rgb = array( ''r'' => $this->R, ''g'' => $this->G, ''b'' => $this->B); return $rgb; } public function getHex() { if($this->hex) return $this->hex; $hex = ''#'' . dechex($this->R) . dechex($this->G) . dechex($this->B); return $hex; } public static function namedToHex($name) { //return hex value of named colour $web = array( ''black'' => ''#000000'', ''green'' => ''#008000'', ''silver'' => ''#C0C0C0'', ''lime'' => ''#00FF00'', ''gray'' => ''#808080'', ''olive'' => ''#808000'', ''white'' => ''#FFFFFF'', ''yellow'' => ''#FFFF00'', ''maroon'' => ''#800000'', ''navy'' => ''#000080'', ''red'' => ''#FF0000'', ''blue'' => ''#0000FF'', ''purple'' => ''#800080'', ''teal'' => ''#008080'', ''fuchsia'' => ''#FF00FF'' ); if(isset($web[strtolower($name)])){ return $web[strtolower($name)]; } return false; } public static function contrast(colour $fg, colour $bg){ //calculate and return contrast between $fg and $bg $cont = 1; $fglum = $fg->luminance(); $bglum = $bg->luminance(); if($fglum > $bglum) $cont = ($fglum + 0.05) / ($bglum + 0.05); if($bglum > $fglum) $cont = ($bglum + 0.05) / ($fglum + 0.05); return $cont; } public static function colourDiff(colour $colour1, colour $colour2) { //returns the colour difference between two colours $rgb1 = $colour1->getRGB(); $rgb2 = $colour2->getRGB(); $r1 = $rgb1[''r'']; $r2 = $rgb2[''r'']; $g1 = $rgb1[''g'']; $g2 = $rgb2[''g'']; $b1 = $rgb1[''b'']; $b2 = $rgb2[''b'']; $diff = max($r1, $r2) - min($r1, $r2); $diff += max($g1, $g2) - min($g1, $g2); $diff += max($b1, $b2) - min($b1, $b2); return $diff; } public function brightness() { return (($this->R * 299) + ($this->G * 587) + ($this->B * 114))/1000; } public function luminance() { //returns luminence of coulour $r = $this->lumCheck($this->R/255); $g = $this->lumCheck($this->G/255); $b = $this->lumCheck($this->B/255); $lum = (0.2126 * $r) + (0.7152 * $g) + (0.0722 * $b); return $lum; } protected function lumCheck($col) { if($col <= 0.03298){ return $col/12.92; } else { return pow((($col + 0.055)/1.055), 2.4); } } protected function convertToRGB($color) { $color = (string)$color; if($color[0] == ''#''){ $color = substr($color, 1); } if(strlen($color) == 6){ list($r, $g, $b) = array($color[0].$color[1], $color[2].$color[3], $color[4].$color[5]); } elseif(strlen($color) == 3){ list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]); } else{ return false; } $r = hexdec($r); $g = hexdec($g); $b = hexdec($b); $this->R = (int)$r; $this->G = (int)$g; $this->B = (int)$b; } protected function convertToHex($r, $g, $b) { $r = dechex($r); if(strlen($r) == 1)$r = ''0'' . $r; $g = dechex($g); if(strlen($g) == 1)$g = ''0'' . $g; $b = dechex($b); if(strlen($b) == 1)$b = ''0'' . $b; $hex = ''#'' . $r . $g . $b; return $hex; } protected function rgbTohsl() { $r = ( $this->R / 255 ); //RGB from 0 to 255 $g = ( $this->G / 255 ); $b = ( $this->B / 255 ); $var_Min = min( $r, $g, $b ); //Min. value of RGB $var_Max = max( $r, $g, $b ); //Max. value of RGB $del_Max = $var_Max - $var_Min; //Delta RGB value $l = ( $var_Max + $var_Min ) / 2; $this->L = $l; if ( $del_Max == 0 ){ //This is a gray, no chroma... $this->H = 0; //HSL results from 0 to 1 $this->S = 0; } else { //Chromatic data... if ( $l < 0.5 ) { $this->S = $del_Max / ( $var_Max + $var_Min ); } else { $this->S = $del_Max / ( 2 - $var_Max - $var_Min ); $del_R = ( ( ( $var_Max - $r ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max; $del_G = ( ( ( $var_Max - $g ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max; $del_B = ( ( ( $var_Max - $b ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max; if( $r == $var_Max ){ $h = $del_B - $del_G; } elseif( $g == $var_Max ){ $h = ( 1 / 3 ) + $del_R - $del_B; } elseif( $b == $var_Max ) { $h = ( 2 / 3 ) + $del_G - $del_R; } if ( $h < 0 ) $h += 1; if ( $h > 1 ) $h -= 1; $this->H = $h; } } } protected function hslTorgb($h, $s, $l) { if ( $s == 0 ){ //HSL from 0 to 1 $r = $l * 255; //RGB results from 0 to 255 $g = $l * 255; $b = $l * 255; } else { if ( $l < 0.5 ) { $var_2 = $l * ( 1 + $s ); } else { $var_2 = ( $l + $s ) - ( $s * $l ); } $var_1 = 2 * $l - $var_2; $r = 255 * $this->hueToRGB( $var_1, $var_2, $h + ( 1 / 3 ) ); $g = 255 * $this->hueToRGB( $var_1, $var_2, $h ); $b = 255 * $this->hueToRGB( $var_1, $var_2, $h - ( 1 / 3 ) ); } return array(''r''=>$r,''g''=>$g,''b''=>$b); } protected function hueToRGB($v1, $v2, $vH) { if($vH < 0)$vH += 1; if($vH > 1)$vH -= 1; if ( ( 6 * $vH ) < 1 ) return ( $v1 + ( $v2 - $v1 ) * 6 * $vH ); if ( ( 2 * $vH ) < 1 ) return ( $v2 ); if ( ( 3 * $vH ) < 2 ) return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 ); return ( $v1 ); } public function getComplement() { $h = $this->H + 180; if($h > 360)$h -= 360; $rgb = $this->hslTorgb($h, $this->S, $this->L); return $this->convertToHex($rgb[''r''], $rgb[''g''], $rgb[''b'']); } }

Me gustaría hacer un porcentaje en un color hexadecimal. Como funcionan los grados de color HSV ...
Estoy usando PHP.

IE: 0% : RED (#FF0000) 8% : ORANGE (#FF7F00) 17% : YELLOW (#FFFF00) 25% : LIMEGREEN (#7FFF00) ... : ... 83% : MAGENTA (#FF00FF) 92% : ROSE (#FF007F) 100% : RED (#FF0000)


Este pequeño fragmento parece hacer lo que intentas lograr

http://bytes.com/topic/php/insights/890539-how-produce-first-pair-rgb-hex-color-value-percent-value

function percent2Color($value,$brightness = 255, $max = 100,$min = 0, $thirdColorHex = ''00'') { // Calculate first and second color (Inverse relationship) $first = (1-($value/$max))*$brightness; $second = ($value/$max)*$brightness; // Find the influence of the middle color (yellow if 1st and 2nd are red and green) $diff = abs($first-$second); $influence = ($brightness-$diff)/2; $first = intval($first + $influence); $second = intval($second + $influence); // Convert to HEX, format and return $firstHex = str_pad(dechex($first),2,0,STR_PAD_LEFT); $secondHex = str_pad(dechex($second),2,0,STR_PAD_LEFT); return $firstHex . $secondHex . $thirdColorHex ; // alternatives: // return $thirdColorHex . $firstHex . $secondHex; // return $firstHex . $thirdColorHex . $secondHex; }


Intente convertir el porcentaje a HSV (divida el porcentaje entre 100 para obtener el matiz y simplemente establezca la saturación y el valor en una constante arbitraria como 1) y luego use esta pregunta para convertirla a formato RGB: comprensión de la fórmula PHP HSV a RGB