RGB到HSL,色调计算是错误的 [英] RGB to HSL, hue calculation is wrong

查看:211
本文介绍了RGB到HSL,色调计算是错误的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想一个RGB32值转换为HSL,因为我想用色相组件。



我已经用一些例子,我在网上找到创建此类:

 公共类HSLColor 
{
公共双色调;
公共双饱和度;
公共双亮度;

公共HSLColor(双H,双S,双L)
{
色相= H;
饱和= S;
亮度= L;
}

公共静态HSLColor FromRGB(彩色CLR)
{
返回FromRGB(Clr.R,Clr.G,CLR.B);
}

公共静态HSLColor FromRGB(字节R,字节G,字节B)
{
双击_R =(R / 255D);
双_G =(G / 255D);
双击_B =(B / 255D);

双击_min = Math.Min(Math.Min(_R,_G),_B);
双击_MAX = Math.Max(Math.Max(_R,_G),_B);
双击_Delta = _MAX - _min;

双击H = 0;
双S = 0;
双L =(浮点)((_ MAX + _min)/ 2.0F);

如果(_Delta!= 0)如果
{
(L< 0.5D)
{
S =(浮点)(_△/( _MAX + _min));
}
,否则
{
S =(浮点)(_△/(2.0F - _MAX - _min));
}


如果(_R == _MAX)
{
H =(_G - _B)/ _Delta;
}
,否则如果(_G == _MAX)
{
H = 2F +(_B - _R)/ _Delta;
}
,否则如果(_B == _MAX)
{
H = 4F +(_R - _G)/ _Delta;
}
}

//转换为度
H = H * 60D;
如果(H&小于0)H + = 360;
//转换为百分比
S * = 100D;
L * = 100D;

返回新HSLColor(H,S,L)
}

私人双Hue_2_RGB(双人间V1,V2双人间,双人间VH)
{
如果(VH℃下)VH + = 1;
如果(VH→1)VH - = 1;
如果((6.0D * VH)。1)收益率(V1 +(V2 - V1)* 6 * VH);
如果((2.0D * VH)。1)收益率(V2);
如果((3.0D * VH)2)回报(V1 +(V2 - V1)*((2.0D / 3.0D) - VH)* 6.0D);
回报率(V1);
}

众彩ToRGB()
{
颜色CLR =新的色彩();
双击VAR_1,VAR_2;

如果(饱和度== 0)
{
Clr.R =(字节)(光亮* 255);
Clr.G =(字节)(光亮* 255);
CLR.B =(字节)(光亮* 255);
}
,否则
{
如果(光度小于0.5)VAR_2 =光度*(1+饱和度);
,否则VAR_2 =(亮度+饱和度) - (饱和度*光亮);

VAR_1 = 2 *光度 - VAR_2;

Clr.R =(字节)(255 * Hue_2_RGB(VAR_1,VAR_2,色调+(1/3)));
Clr.G =(字节)(255 * Hue_2_RGB(VAR_1,VAR_2,色调));
CLR.B =(字节)(255 * Hue_2_RGB(VAR_1,VAR_2,顺化 - (1/3)));
}



返回CLR;
}
}



但它似乎并没有正常工作,



如果我用(R 0,G 255,b 193)例如输入颜色:
口获得色相= 0
,而在Photoshop中,如果我选择了完全相同的RGB值,我得到:
色相= 165
是正确的值。



我要的色相是从0到360或0到240 <值/ p>

这是什么问题。



参考:
EasyRGB RGB-> HSL


解决方案

Drupal的+一些程序员的各种的下面是开放源代码的混合做工混合成一个单一的功能吹嘘RGB> HSL和背部。它完美的作品

 < PHP 
###的RGB>> HSL
功能_color_rgb2hsl($ RGB){
$ R = $ RGB [0]; $ G = $ RGB [1]; $ B = $ RGB [2];
$ MIN =分钟($ R,分($克,$ B)); $最大值= MAX($ R,MAX($克,$ B));
$三角洲= $最大值 - $分钟; $ L =($ MIN + $最大值)/ 2; $ S = 0;
如果($ L大于0&放大器;&放大器; $ L&所述; 1){
$ S = $增量/($ L小于0.5(2 * $ 1):?(2 - 2 * $ 1));
}
$ H = 0;
如果($增量大于0){
如果($最大== $ R&放大器;&安培;!$最大= $ G)$ H + =($ G - $ B)/ $三角洲;
如果($最大== $ G&放大器;&安培; $最大= $ B!)$ H + =(2 +($ B - $ R)/ $三角形);
如果($最大== $ B和;&安培; $最大= $ R!)$ H + =(4 +($ R - $ G)/ $三角形);
$ H / = 6;
}返回数组($ H,$ S,$ L);
}

### HSL>> RGB
功能_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 - $平方米;
返回阵列(_color_hue2rgb($ M 1,$ 2,$ H + 0.33333),
_color_hue2rgb($ M 1,$ 2,$ H),
_color_hue2rgb($ M 1,$ 2,$ ħ - 0.33333));
}

###为_color_hsl2rgb辅助功能()。
功能_color_hue2rgb($ M1,$ 2,$ H){
$ H =($ H&小于0)? $ H + 1:(($ h取代; 1)$ H - 1:$ H);
如果($ H * 6。1)返回$ M1 +($ 2 - $ M1)* $ H * 6;
如果($ H * 2; 1)返回$平方米;
如果($ H * 3 2)返回$ M1 +($ 2 - $ M1)*(0.66666 - $ H)* 6;
$返回M1;
}

###转换为十六进制的颜色到RGB三元。
功能_color_unpack($进制,$正常化=假){
如果(strlen的($十六进制)== 4){
$十六进制= $进制[1]。 $六角[1]。 $六角[2]。 $六角[2]。 $六角[3]。 $六角[3];
} $ C = hexdec($十六进制);
为($ I = 16; $ I> = 0; $ I - = 8){
$出[] =(($ C>> $ I)及为0xFF)/ ($ 255正常化:1);
} $返回了;
}

###的转换RGB三元为十六进制的颜色。
功能_color_pack($ RGB,$正常化= FALSE){
的foreach($ RGB为$ K => $ V){
$出来| =(($ V *($正常化?255:1))≤;≤(16 - $ K * 8));
}回报'#'。 str_pad(dechex($出),6,0,STR_PAD_LEFT);
}

打印十六进制;

$ testhex =#b7b700
$打印testhex;

$ testhex2rgb = _color_unpack($ testhex,真正的);
打印< BR /> RGB:

的var_dump($ testhex2rgb);
打印< BR /> HSL颜色模块;

$ testrgb2hsl = _color_rgb2hsl($ testhex2rgb); //转换为HSL

的var_dump($ testrgb2hsl);
打印< BR /> RGB:

$ testhsl2rgb = _color_hsl2rgb($ testrgb2hsl); //而回RGB
的var_dump($ testhsl2rgb);
打印< BR />十六进制:;

$ testrgb2hex = _color_pack($ testhsl2rgb,真正的);
的var_dump($ testrgb2hex);

>?;


I'm trying to convert a RGB32 value to HSL because I want to use the Hue component.

I have used some examples that I found online to create this class:

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

However it doesn't seem to work correctly,

If I use an input color of (R 0, G 255, B 193) for example: I get Hue = 0 while in photoshop if I choose the exact same RGB values I get: Hue = 165 which is the correct value.

I want the Hue to be a value ranging from 0 to 360 or 0 to 240

What is the problem?..

Reference: EasyRGB RGB->HSL

解决方案

The below is open source mixture of Drupal + some various programmers work mixed into one single function boasting RGB > HSL and back. It works flawlessly.

<?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);

?>

这篇关于RGB到HSL,色调计算是错误的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆