用于查找基于HSL的颜色是否接近另一种颜色的布尔函数

时间:2013-01-21 19:45:29

标签: c# colors

我想编写一个可以检查颜色是否接近背景颜色的函数。

为此,我使用了HSL配色方案,让我解释一下; HSL颜色定义为色调饱和度和亮度。简而言之,Hue告诉你使用了彩虹的哪种颜色,并且它在0到360的范围内。它在我想要检查的Hue上。

因此饱和度颜色有多强,如纯色或混合灰色 或说明自己的轻盈不被比较。我只想检查顺化。 起初我写了一个这样的近函:

Private boolean Near(int background, int mycolor, int difference)
{
  if(math.abs( background - mycolor)<difference){return true;}else{return false}
}

后来我意识到这是错误的。因为HSL就像下面的图像,你会在那里看到颜色是一个圆圈,所以从红色0开始,它在360处再次变红。 所以Hue值358和4很接近,上面的函数不能反映出来。

(饱和度到达中心0..100  减轻0..100就像上涨或下跌  和顺度是从0到360度左右。 )

enter image description here

我可以用一个大的if构造重写一个函数,所以例如如果背景为红色5和允许的差异是20那么mycolor如果是&lt; 5 + 20或&gt; (360-(5-20​​))..如果Hue差异超过0或360的限制,则进行特殊构造。

那可行,但后来我想知道是否有可能用单线模数计算替换这样的“if then”结构?它让我感到疑惑 由于模数计算可用于在边界内进行检查,如果它在360的边界上,它将再次变为接近零的红色,

我认为如此,这样的行也可能包含一些AND或OR和减法或ABS函数..可以在一个比较行中写出它吗?

1 个答案:

答案 0 :(得分:0)

您需要做的是确保您比较的值尽可能接近。例如,如果background = 358mycolor = 4,则可以通过从360减去background来使它们更接近,这不会改变有效值。只要差异>>,就需要使它们更接近。 180

if (mycolor - background > 180) mycolor -= 360;
if (background - mycolor > 180) background -= 360;

通过这些转换,您的原始逻辑应该是正确的(if是不必要的):

return Math.Abs(background - mycolor) < difference;

编辑:我找到了一个似乎正确的简单表达式。

return Math.Abs(background - mycolor) % (361 - difference) < difference;