2011-01-24 56 views
0

我試圖將RGB32值轉換爲HSL,因爲我想使用Hue組件。RGB到HSL,色相計算是錯誤的

我已經用一些例子,我在網上找到創建這個類:

public class HSLColor 
    { 
     public Double Hue; 
     public Double Saturation; 
     public Double Luminosity; 

     public HSLColor(Double H, Double S, Double L) 
     { 
      Hue = H; 
      Saturation = S; 
      Luminosity = L; 
     } 

     public static HSLColor FromRGB(Color Clr) 
     { 
      return FromRGB(Clr.R, Clr.G, Clr.B); 
     } 

     public static HSLColor FromRGB(Byte R, Byte G, Byte B) 
     { 
      Double _R = (R/255d); 
      Double _G = (G/255d); 
      Double _B = (B/255d); 

      Double _Min = Math.Min(Math.Min(_R, _G), _B); 
      Double _Max = Math.Max(Math.Max(_R, _G), _B); 
      Double _Delta = _Max - _Min; 

      Double H = 0; 
      Double S = 0; 
      Double L = (float)((_Max + _Min)/2.0f); 

      if (_Delta != 0) 
      { 
       if (L < 0.5d) 
       { 
        S = (float)(_Delta/(_Max + _Min)); 
       } 
       else 
       { 
        S = (float)(_Delta/(2.0f - _Max - _Min)); 
       } 


       if (_R == _Max) 
       { 
        H = (_G - _B)/_Delta; 
       } 
       else if (_G == _Max) 
       { 
        H = 2f + (_B - _R)/_Delta; 
       } 
       else if (_B == _Max) 
       { 
        H = 4f + (_R - _G)/_Delta; 
       } 
      } 

      //Convert to degrees 
      H = H * 60d; 
      if (H < 0) H += 360; 
      //Convert to percent 
      S *= 100d; 
      L *= 100d; 

      return new HSLColor(H, S, L); 
     } 

     private Double Hue_2_RGB(Double v1, Double v2, Double vH) 
     { 
      if (vH < 0) vH += 1; 
      if (vH > 1) vH -= 1; 
      if ((6.0d * vH) < 1) return (v1 + (v2 - v1) * 6 * vH); 
      if ((2.0d * vH) < 1) return (v2); 
      if ((3.0d * vH) < 2) return (v1 + (v2 - v1) * ((2.0d/3.0d) - vH) * 6.0d); 
      return (v1); 
     } 

     public Color ToRGB() 
     { 
      Color Clr = new Color(); 
      Double var_1, var_2; 

      if (Saturation == 0) 
      { 
       Clr.R = (Byte)(Luminosity * 255); 
       Clr.G = (Byte)(Luminosity * 255); 
       Clr.B = (Byte)(Luminosity * 255); 
      } 
      else 
      { 
       if (Luminosity < 0.5) var_2 = Luminosity * (1 + Saturation); 
       else var_2 = (Luminosity + Saturation) - (Saturation * Luminosity); 

       var_1 = 2 * Luminosity - var_2; 

       Clr.R = (Byte)(255 * Hue_2_RGB(var_1, var_2, Hue + (1/3))); 
       Clr.G = (Byte)(255 * Hue_2_RGB(var_1, var_2, Hue)); 
       Clr.B = (Byte)(255 * Hue_2_RGB(var_1, var_2, Hue - (1/3))); 
      } 



      return Clr; 
     } 
    } 

但是它似乎並不能正常工作,

如果我使用的(R 0, G 255, B 193)輸入顏色,例如: 我得到Hue = 0 雖然在Photoshop中,如果我選擇完全相同的RGB值,我得到: Hue = 165 這是正確的值。

我想要的色相是範圍從0到360或0至240

有什麼問題的值..

參考: EasyRGB RGB->HSL

+0

的可能重複的[RGB到HSL和背部,計算題](http://stackoverflow.com/questions/4793729/rgb-to-hsl-and-back-calculation-problems) – Mervin 2011-01-27 08:53:09

回答

2

Drupal的+一些各種程序員下面是開源混合物做工混合成一個單一的功能擁有RGB> HSL和背部。它完美無瑕。

<?php 
### RGB >> HSL 
function _color_rgb2hsl($rgb) { 
    $r = $rgb[0]; $g = $rgb[1]; $b = $rgb[2]; 
    $min = min($r, min($g, $b)); $max = max($r, max($g, $b)); 
    $delta = $max - $min; $l = ($min + $max)/2; $s = 0; 
    if ($l > 0 && $l < 1) { 
    $s = $delta/($l < 0.5 ? (2 * $l) : (2 - 2 * $l)); 
    } 
    $h = 0; 
    if ($delta > 0) { 
    if ($max == $r && $max != $g) $h += ($g - $b)/$delta; 
    if ($max == $g && $max != $b) $h += (2 + ($b - $r)/$delta); 
    if ($max == $b && $max != $r) $h += (4 + ($r - $g)/$delta); 
    $h /= 6; 
    } return array($h, $s, $l); 
} 

### HSL >> RGB 
function _color_hsl2rgb($hsl) { 
    $h = $hsl[0]; $s = $hsl[1]; $l = $hsl[2]; 
    $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l*$s; 
    $m1 = $l * 2 - $m2; 
    return array(_color_hue2rgb($m1, $m2, $h + 0.33333), 
       _color_hue2rgb($m1, $m2, $h), 
       _color_hue2rgb($m1, $m2, $h - 0.33333)); 
} 

### Helper function for _color_hsl2rgb(). 
function _color_hue2rgb($m1, $m2, $h) { 
    $h = ($h < 0) ? $h + 1 : (($h > 1) ? $h - 1 : $h); 
    if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6; 
    if ($h * 2 < 1) return $m2; 
    if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6; 
    return $m1; 
} 

### Convert a hex color into an RGB triplet. 
function _color_unpack($hex, $normalize = false) { 
    if (strlen($hex) == 4) { 
    $hex = $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3]; 
    } $c = hexdec($hex); 
    for ($i = 16; $i >= 0; $i -= 8) { 
    $out[] = (($c >> $i) & 0xFF)/($normalize ? 255 : 1); 
    } return $out; 
} 

### Convert an RGB triplet to a hex color. 
function _color_pack($rgb, $normalize = false) { 
    foreach ($rgb as $k => $v) { 
    $out |= (($v * ($normalize ? 255 : 1)) << (16 - $k * 8)); 
    }return '#'. str_pad(dechex($out), 6, 0, STR_PAD_LEFT); 
} 

    print "Hex: "; 

    $testhex = "#b7b700"; 
     print $testhex; 

    $testhex2rgb = _color_unpack($testhex,true); 
     print "<br />RGB: "; 

    var_dump($testhex2rgb); 
     print "<br />HSL color module: "; 

    $testrgb2hsl = _color_rgb2hsl($testhex2rgb); //Convert to HSL 

    var_dump($testrgb2hsl); 
     print "<br />RGB: "; 

    $testhsl2rgb = _color_hsl2rgb($testrgb2hsl); // And back to RGB  
    var_dump($testhsl2rgb); 
     print "<br />Hex: "; 

    $testrgb2hex = _color_pack($testhsl2rgb,true); 
    var_dump($testrgb2hex); 

?> 
4
R/255 

這是整數意思是你得到0或1.嘗試:

(float)R/255 

和所有其他情況。

爲常量嘗試:

(1/3) -> (1.0/3.0) 
+0

我已經加入一些更正我的帖子,我現在得到Hue = 0,3333333333而不是Hue = 165 – Mervin 2011-01-24 16:46:47