PHP HSV转RGB公式理解

Posted

技术标签:

【中文标题】PHP HSV转RGB公式理解【英文标题】:PHP HSV to RGB formula comprehension 【发布时间】: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???

以下是***,但我不明白,

我猜这很明显

【问题讨论】:

这里有公式:en.wikipedia.org/wiki/… 我知道,但谁能解释一下公式 这个公式真的适合你吗?因为你重新引入了 $r 变量(不像动态语言......)。 这能回答你的问题吗? php function to convert HSL to RGB or Hex 【参考方案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。 我一开始就卡住了,但这是一个很好的例子!我会支持它 有什么特别的东西让你不快吗?我可以试着为你解释一下。

以上是关于PHP HSV转RGB公式理解的主要内容,如果未能解决你的问题,请参考以下文章

由RGB到HSV颜色空间的理解

rgb转化到hsv图像外观会变吗opencv

RGB与HSV之间的转换公式及颜色表

Atitit  从 RGB 到 HSL 或 HSV 的转换

颜色空间模型(HSVLABRGBCMYK)

delphi RGB 转 HSV