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公式理解的主要内容,如果未能解决你的问题,请参考以下文章