Percentage to Hexcolor in PHP

前端 未结 3 1833
渐次进展
渐次进展 2021-01-23 04:11

I\'d like to make a percentage into a hexidecimal color. Kind of how HSV color degrees work...
I am using PHP.

IE: 
  0% : RED       (#FF0000)
  8% : ORANGE          


        
3条回答
  •  醉梦人生
    2021-01-23 04:58

    This is not my code and I don't remember where I found it. I've been using it for a couple of years and it works perfectly for me. It could be what your looking for (or part of it may be).

    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']);
      }
    }
    

提交回复
热议问题