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

时间:2015-02-10 15:08:50

标签: c# hsl

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

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

我一直在尝试一些数学组合,但没有考虑我希望的结果,因为我认为这可以写成一个布尔函数一个班轮。

2 个答案:

答案 0 :(得分:2)

我使用此方法处理Hue值:

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)
    // ...

答案 1 :(得分:0)

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