Я могу преобразовать значения 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; }
Но как вы конвертируете HSV в RGB в PHP ???
В Википедии есть следующее: я этого не понимаю,
Я предполагаю, что это довольно очевидно
Это относится к значениям 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); }
Перевод рулонов ответов для 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); }
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; }
ColorJizz позволяет конвертировать из / во многие форматы. Также есть версия PHP.
конечно, вы можете просто изменить определения функций на php-стиль, изменить все переменные и т. д., но сохраните код ядра одинаково, не нужно занять более 30 минут, чтобы это сделать и протестировать.