代码之家  ›  专栏  ›  技术社区  ›  Mark Lalor

php hsv到rgb公式理解

  •  15
  • Mark Lalor  · 技术社区  · 14 年前

    我可以用以下代码将 rgb values转换为 hsv

    $r=$r/255;
    $g=$g/255;
    $B= $B/ 255;
    
    $H=0;
    S=0;
    $v=0;
    
    $min=min(min($r,$g),$b);
    $max=max(max($r,$g),$b);
    
    $R=$max–$min;
    $V= $max;
    
    
    如果($ r=0){
    $H=0;
    S=0;
    }
    否则{
    $s= $r/$max;
    
    $hr=(($max-$r)/6)+($r/2))/$r;
    $hg=(($max-$g)/6)+($r/2))/$r;
    $hb=(($max-$b)/6)+($r/2))/$r;
    
    如果($r=$max)$h=$hb-$hg;
    否则,如果($g=$max)$h=(1/3)+$hr-$hb;
    否则,如果($b=$max)$h=(2/3)+$hg-$hr;
    
    如果($H<0)$H+=1;
    如果($H>1)$H-=1;
    }
    < /代码> 
    
    

    但是,如何将hsv转换为rgbinphp????

    下面是维基百科,但我不明白,

    我猜很明显

    使用以下代码…

     $r = $r/255;
     $g = $g/255;
     $b = $b/255;
    
     $h = 0;
     $s = 0;
     $v = 0;
    
     $min = min(min($r, $g),$b);
     $max = max(max($r, $g),$b);
    
     $r = $max-$min;
     $v = $max;
    
    
     if($r == 0){
      $h = 0;
      $s = 0;
     }
     else {
      $s = $r / $max;
    
      $hr = ((($max - $r) / 6) + ($r / 2)) / $r;
      $hg = ((($max - $g) / 6) + ($r / 2)) / $r;
      $hb = ((($max - $b) / 6) + ($r / 2)) / $r;
    
      if ($r == $max) $h = $hb - $hg;
      else if($g == $max) $h = (1/3) + $hr - $hb;
      else if ($b == $max) $h = (2/3) + $hg - $hr;
    
      if ($h < 0)$h += 1;
      if ($h > 1)$h -= 1;
     }
    

    但是你怎么转换呢单纯疱疹病毒RGB在里面PHP????

    下面是维基百科,但我不明白,

    我猜很明显

    6 回复  |  直到 6 年前
        1
  •  15
  •   Jonathan Bredo Christensen    10 年前

    这是针对范围内的hsv值 [0,1] (并给出范围内的RGB值 [0,1] 而不是 {0, 1, ..., 255} :

    function HSVtoRGB(array $hsv) {
        list($H,$S,$V) = $hsv;
        //1
        $H *= 6;
        //2
        $I = floor($H);
        $F = $H - $I;
        //3
        $M = $V * (1 - $S);
        $N = $V * (1 - $S * $F);
        $K = $V * (1 - $S * (1 - $F));
        //4
        switch ($I) {
            case 0:
                list($R,$G,$B) = array($V,$K,$M);
                break;
            case 1:
                list($R,$G,$B) = array($N,$V,$M);
                break;
            case 2:
                list($R,$G,$B) = array($M,$V,$K);
                break;
            case 3:
                list($R,$G,$B) = array($M,$N,$V);
                break;
            case 4:
                list($R,$G,$B) = array($K,$M,$V);
                break;
            case 5:
            case 6: //for when $H=1 is given
                list($R,$G,$B) = array($V,$M,$N);
                break;
        }
        return array($R, $G, $B);
    }
    
        2
  •  5
  •   flori    12 年前

    滚动答案的翻译 HSL 从C到PHP

    function ColorHSLToRGB($h, $s, $l){
    
            $r = $l;
            $g = $l;
            $b = $l;
            $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s);
            if ($v > 0){
                  $m;
                  $sv;
                  $sextant;
                  $fract;
                  $vsf;
                  $mid1;
                  $mid2;
    
                  $m = $l + $l - $v;
                  $sv = ($v - $m ) / $v;
                  $h *= 6.0;
                  $sextant = floor($h);
                  $fract = $h - $sextant;
                  $vsf = $v * $sv * $fract;
                  $mid1 = $m + $vsf;
                  $mid2 = $v - $vsf;
    
                  switch ($sextant)
                  {
                        case 0:
                              $r = $v;
                              $g = $mid1;
                              $b = $m;
                              break;
                        case 1:
                              $r = $mid2;
                              $g = $v;
                              $b = $m;
                              break;
                        case 2:
                              $r = $m;
                              $g = $v;
                              $b = $mid1;
                              break;
                        case 3:
                              $r = $m;
                              $g = $mid2;
                              $b = $v;
                              break;
                        case 4:
                              $r = $mid1;
                              $g = $m;
                              $b = $v;
                              break;
                        case 5:
                              $r = $v;
                              $g = $m;
                              $b = $mid2;
                              break;
                  }
            }
            return array('r' => $r * 255.0, 'g' => $g * 255.0, 'b' => $b * 255.0);
    }
    
        3
  •  1
  •   NullUserException Mark Roddy    14 年前
    private class HSLPixel{
            double hue;
            double saturation;
            double lightness;
    
            .... your code
    }
    
    public Color HSLToRGB(HSLPixel pixel){
    
                double v;
                double r,g,b;
                double l = pixel.lightness;
                double h = pixel.hue;
                double s = pixel.saturation;
    
                r = l;   // default to gray
                g = l;
                b = l;
                v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s);
                if (v > 0){
                      double m;
                      double sv;
                      int sextant;
                      double fract, vsf, mid1, mid2;
    
                      m = l + l - v;
                      sv = (v - m ) / v;
                      h *= 6.0;
                      sextant = (int)h;
                      fract = h - sextant;
                      vsf = v * sv * fract;
                      mid1 = m + vsf;
                      mid2 = v - vsf;
    
                      switch (sextant)
                      {
                            case 0:
                                  r = v;
                                  g = mid1;
                                  b = m;
                                  break;
                            case 1:
                                  r = mid2;
                                  g = v;
                                  b = m;
                                  break;
                            case 2:
                                  r = m;
                                  g = v;
                                  b = mid1;
                                  break;
                            case 3:
                                  r = m;
                                  g = mid2;
                                  b = v;
                                  break;
                            case 4:
                                  r = mid1;
                                  g = m;
                                  b = v;
                                  break;
                            case 5:
                                  r = v;
                                  g = m;
                                  b = mid2;
                                  break;
                      }
                }
                Color rgb = new Color((int)(r * 255.0), (int)(g * 255.0), (int)(b * 255.0));
                return rgb;
        }
    
        4
  •  1
  •   Mikee    14 年前

    ColorJizz 允许您从/转换为多种格式。还有一个PHP版本。

        5
  •  1
  •   Teson    6 年前

    发现这篇文章太晚了,我的另一个选择是:

    hsv2rgb函数php

    色调:0-360,周六:0-100,val:0-100

      function hsv2rgb($hue,$sat,$val) {;
        $rgb = array(0,0,0);
        //calc rgb for 100% SV, go +1 for BR-range
        for($i=0;$i<4;$i++) {
          if (abs($hue - $i*120)<120) {
            $distance = max(60,abs($hue - $i*120));
            $rgb[$i % 3] = 1 - (($distance-60) / 60);
          }
        }
        //desaturate by increasing lower levels
        $max = max($rgb);
        $factor = 255 * ($val/100);
        for($i=0;$i<3;$i++) {
          //use distance between 0 and max (1) and multiply with value
          $rgb[$i] = round(($rgb[$i] + ($max - $rgb[$i]) * (1 - $sat/100)) * $factor);
        }
        $rgb['html'] = sprintf('#%02X%02X%02X', $rgb[0], $rgb[1], $rgb[2]);
        return $rgb;
      }
    
        6
  •  0
  •   rollsch    14 年前

    当然可以,只需将函数定义更改为php样式,更改所有变量等,但核心代码保持不变,这样做和测试的时间不应超过30分钟。