如何以编程方式将色环分成几个部分,以及如何在此部分中获取所有RGB颜色?
我想通过RGB颜色的输入参数返回颜色部分的fce。
int getColorSection(RGB color);
答案 0 :(得分:2)
使用HSL色彩空间。 H是色调,色环上的颜色角度。您可以直接从System.Drawing.Color.GetHue()方法获取它。
答案 1 :(得分:2)
我不知道我是否正确理解了这个问题,但我想你问的颜色是更绿,更蓝或蓝红? 这将为您提供有关哪个部分(红色,绿色或蓝色)的信息。
为此,在不考虑人类对颜色的感知的情况下,您可以这样做:
public enum ColorSection
{
Red,
Green,
Blue
}
public ColorSection GetColorSection(int rgb)
{
int r = rgb & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 16) & 0xFF;
return (r > g && r > b) ? ColorSection.Red : ((g > b) ? ColorSection.Green : ColorSection.Blue);
}
当然,如果你的颜色有两个相等的值,那么效果不会很好,如果你有红色=绿色,它会返回红色。 如果你有白色它会返回红色,如果你有黑色,它会返回蓝色。
如果您需要更多花哨的东西,可能就像您要求的那样,那么您需要使用最近邻近似和极坐标。
您可以使用Hue计算角度,如指出的那样。 从角度来看,您只需将其转换为整数即可。
计算色调:
public static double GetHue(int rgb)
{
double result = 0.0;
int r = rgb & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 16) & 0xFF;
if (r != g && g != b)
{
double red = r / 255.0;
double green = g / 255.0;
double blue = b / 255.0;
double max = Math.Max(Math.Max(red, green), blue);
double min = Math.Min(Math.Min(red, green), blue);
double delta = max - min;
if (delta != 0)
{
if (red == max)
result = (green - blue) / delta;
else if (green == max)
result = 2 + ((blue - red) / delta);
else if (blue == max)
result = 4 + ((red - green) / delta);
result *= 60.0;
if (result < 0)
result += 360.0;
}
}
return result;
}
它返回角度,以度为单位,从0到360,您在色轮中的位置。 您可以使用neirest neighbor计算部分。
例如:
const int NumberOfSections = 10;
int section = (int)(GetHue() * NumberOfSections / 360.0);
然而,您的车轮似乎相对于C#色轮旋转。 您可能需要减去一个确切差异的恒定角度。
如果我没错,差异是180°。
public static double GetMyHue(int rgb)
{
return (GetHue(rgb) + 180.0) % 360.0;
}