2010-08-30 26 views
15

puedo convertir RGB valores a HSV con el siguiente código ...PHP VHS a RGB fórmula comprensión

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

Pero ¿cómo convertir HSVaRGB en PHP ???

El siguiente es en wikipedia pero no lo entienden,

supongo que es bastante obvio

alt text

+0

Hay fórmulas aquí: http://en.wikipedia.org/wiki/HSV_color_space#Conversion_from_RGB_to_HSL_or_HSV – NullUserException

+1

Lo sé pero alguien puede explicar las fórmulas –

+0

¿Esta fórmula ** REALMENTE ** está funcionando para usted? Porque reintrodujo $ r variable (nada como el lenguaje dinámico ...). – greenoldman

Respuesta

15

Esto es para los valores HSV en el rango [0,1] (y dar valores RGB en el rango [0,1], en lugar de {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

¿Qué quiere decir con Esto es para los valores de HSV en el rango [0,1] (y dando valores RGB en el rango [0,1], en lugar de {0, 1, ..., 255} Por favor explique –

+0

Quiero decir que los valores deben estar entre 0 y 1. – Artefacto

+1

Ohhh entonces en lugar de h: 0, s: 100 yv: 100 debería ser h: 0 s: 1 v: 1 –

1
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; 
    } 
+0

¿Se puede implementar eso en PHP? –

0

Por supuesto que puede, simplemente cambie las definiciones de las funciones al estilo php, cambie todas las variables, etc. pero mantenga el código del núcleo igual, no le tomará más de 30 minutos hacerlo y probarlo.

+0

No hablo bien C .. –

+0

pruébalo y pregúntanos por las líneas, nunca he hecho php antes. – rolls

+0

Estoy atascado desde el principio, pero este es un muy buen ejemplo. Lo renuevo –

5

Traducción de rollos para responder HSL de C a 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); 
} 
+0

Consulte [esta respuesta] (http://stackoverflow.com/a/34363975/3437608) para el reverso de esta función y capacidades adicionales. – Cullub

1

ColorJizz le permite convertir desde/hasta muchos formatos. Hay una versión de PHP también.