Color test = Color.FromArgb(255,0,0);
Color known = (
from prop in typeof(Color)
.GetProperties(BindingFlags.Public | BindingFlags.Static)
where prop.PropertyType == typeof(Color)
let color = (Color)prop.GetValue(null, null)
where color.A == test.A && color.R == test.R
&& color.G == test.G && color.B == test.B
select color)
.FirstOrDefault();
Console.WriteLine(known.Name);
6条答案
按热度按时间n9vozmp41#
如果你有一个已知颜色的列表,你可以看到给定的目标颜色是“最接近”的那些已知颜色,使用一个“接近度”函数沿着如下所示(F#代码):
无论哪种已知颜色与要命名的目标颜色的差异最小,都使用该名称。
ztyzrc3y2#
你可以试试这个代码
7fyelxc53#
我个人觉得用hue/saturation/brightness来考虑颜色比用RGB值来考虑颜色更自然,我认为在这种情况下,这会很适合你。
给光谱的某个范围指定一个你认为合适的颜色名称。例如,红色是0-39,橙子是40-79,等等。(这些都是任意的数字--我不知道它们是否适合任何一种尺度)。然后从你的RGB值计算色调(你可以在这里找到一个公式,尽管可能还有其他公式)。一旦你知道了色调,你就知道了它在光谱的哪个范围,你就可以给予它一个名字。
neekobn84#
下面是使用两个限定符和一个颜色名称的简单命名方案:
你可以很容易地适应它,如果你想蓝调更有区别等。
tp5buhyn5#
嗯,红/绿色/蓝是很容易通过检查来识别的;您需要支持哪些范围的值?
问题是,除非你从一个命名的颜色开始,否则很难把它变回原来的颜色;即使您通过FromArgb创建了明显的颜色,
IsNamedColor
也将返回false。如果你只需要实际期望的标准颜色,你可以通过反射枚举已知的颜色?
您还可以将此方法用作更复杂算法的已知颜色源。
93ze6v8z6#
下面的内容可能会有所帮助:
其思想是将描述符与hue范围相关联。
为了涵盖黑色、白色和灰色的情况,还需要考虑饱和度和亮度(可能需要对限值进行一些调整)。