如何检查HSL颜色的色调是否在给定范围内?



我正在使用HSL颜色空间。色调因子为0到360度,从0到360意味着在色圈上绕一整圈。所以0接近360(或者它们是相同的)。这意味着要进行一些范围检查,需要使用模函数。

我需要检查值HueX是否在Hue的距离RangeH内:因此,如果Hue = 20RangeH = 50,则如果HueX = 350,则350的值在范围内。

我一直在尝试一些数学组合,但没有得到我所希望的结果,因为我认为这可以写成布尔函数的一行。

我使用此方法处理色调值:

public static double HueDifference(double hue1, double hue2)
{
    return Math.Min(Math.Abs(hue1 - hue2), 360 - Math.Abs(hue1- hue2));
}

然后你可以检查该值是否在给定的范围内,如下所示:

if (HueDifference(HueX, Hue) <= RangeH)
    // ...

基于Taw4,我编写了一个包含HSL色调数学的函数。这不是在线检查,我认为这是使用mod计算存在的。我确实在找那个,但我不记得了。我从Taw4改写了链接的逻辑。

我写这篇文章是作为我的函数的一部分,该函数检查RGB颜色在HSL范围内,S和L因素很容易,但H让我很困扰。我只是把整件事都贴在这里,以防有人需要。

        private Boolean RGBInHSLRange
          (int r, int g, int b,
           int h,int s,int l,
           int RH, int RS, int RL)   
    {   // r,g,b colors
        // h,s,l colors
        // ranges for HSL in RH,RS,RL
        // note color math is usually done in floats not integers
        // if you need floats do a float conversion instead of int
        // for me int ewas enough 
        Color myColor = Color.FromArgb(r, g, b);
        int HSLhue = (int)myColor.GetHue(); 
        int HSLsat = (int)(myColor.GetSaturation() * 100);
        int HSLlight = (int)(myColor.GetBrightness() * 100);

        if (( HSLlight < h -RL) ^ ( HSLlight > h +RL)) return false;
        if (( HSLsat < s - RS) ^ ( HSLsat > s + RS)) return false;
        int distance = Math.Abs(h - HSLhue);
        if (distance > 180) distance = 360 - distance;
        if (distance > RH) return false;
        return true;           
    }

最新更新