【问题标题】:PHP HSV to RGB formula comprehensionPHP HSV转RGB公式理解
【发布时间】:2011-04-05 13:47:15
【问题描述】:

我可以使用以下代码将 RGB 值转换为 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;


 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;
 }

但是如何在PHP中将HSV RGB???

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

我猜这很明显

【问题讨论】:

标签: php colors rgb hsv


【解决方案1】:

这适用于[0,1] 范围内的 HSV 值(并给出[0,1] 范围内的 RGB 值,而不是 {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);
}

【讨论】:

  • 这是什么意思这是针对 [0,1] 范围内的 HSV 值(并给出 [0,1] 范围内的 RGB 值,而不是 {0, 1, . .., 255} 请解释一下
  • 我的意思是值必须在 0 和 1 之间。
  • 哦,所以应该是 h:0 s:1 v:1 而不是 h:0, s:100 和 v:100
  • 迄今为止我见过的最简单的方法。
  • 像你习惯的那样从 Deg/Perc/Perc 转换为 [0,1],将色调除以 60,饱和度和亮度除以 100。
【解决方案2】:

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

【讨论】:

  • 查看this answer 了解此功能的反面和新增功能。
【解决方案3】:

发现这篇文章太晚了,我的替代方案:

hsv2rgb 函数 PHP

色调:0-360,饱和度:0-100,颜色: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;
  }

【讨论】:

    【解决方案4】:
    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;
        }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        当然可以,只需将函数定义更改为 php 样式,更改所有变量等,但保持核心代码不变,您不会花费超过 30 分钟的时间来完成并测试它。

        【讨论】:

        • 试一试,你遇到的问题问我们,我以前从未真正做过 php。
        • 我一开始就卡住了,但这是一个很好的例子!我会支持它
        • 有什么特别的东西让你不快吗?我可以试着为你解释一下。
        猜你喜欢
        • 2020-11-28
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 2018-10-31
        • 2011-01-24
        • 1970-01-01
        相关资源
        最近更新 更多