根据可见光谱中的位置对System.Media.Colors进行排序

时间:2011-03-25 09:10:06

标签: c# .net wpf colors color-space

最快/最简单的方法是根据系统在可见光谱中的位置对System.Media.Colors中的颜色进行排序(红色到蓝色或蓝色到红色无关紧要)?

编辑:

以下是排序结果(色调 - >饱和度 - >亮度):

enter image description here

这可能在技术上是正确的,但在视觉上它仍然不是。有人可以说明问题是什么吗?

2 个答案:

答案 0 :(得分:4)

您希望按色调对颜色进行排序。为此,您需要计算颜色的色调,而Wpf System.Media.Color结构不包含为您执行此操作的属性。

您有两种选择:

  • 您可以手动计算色调。这不是很难,但它很混乱:许多if-then语句。执行此操作的示例代码can be found on devx。这是更多的工作,不太可读,但可能是更快的选择。
  • 您可以使用System.Drawing.Color.GetHue。较旧的winforms-era System.Drawing颜色结构确实支持计算色调。这使得代码非常简单;像System.Drawing.Color.FromArgb(col.R, col.G, col.B).GetHue()这样的东西就足够了 - 好又短!但是,它确实意味着你将处理两个具有相同名称的结构,你当然需要引用System.Drawing.dll程序集。这种方法往往很慢并且需要进行大量的理智检查,因此如果性能至关重要,那么这种方法的吸引力就会降低。

色彩空间是三维的。虽然您可以沿一个方向排序(例如色调,此处),但如果您保持另外两个方向(HSB模型中的饱和度和亮度)不变,则生成的颜色序列将仅显示为连续。这就是为什么大多数拾色器选择二维表示的原因,但即使这样,你必须在给定的颜色选择器中保持一个维度不变,以保持连续的渐变。

答案 1 :(得分:0)

NVM提到了mono作为可能的解决方案,事实并非如此。问题是当前的显示技术。单声道强调了这个问题。看起来很棒的颜色,单色散布,反之亦然。这并不意味着不可能。只能在数学上完成。

使分类更加复杂,我们所有人都是色盲的,每个人之间的盲目性差异很大。数学将获取正确的排序,但是没有人能预言我们每个人都会看到的东西。

频谱≡音≈色相(((≡视觉皮层,≈内分泌补偿))

蓝色›› rgb(0,0,255)›› nCol B0,0%,0%

Ncol an,w%,b%›› a |(n +((((w + b)/ 2)/ cos((w + b)/ 2)

a |(((n + 1.w%)-(n + 1.b%))/ cos(wb)...而RGB的nCol扩展名是一种完美的,一对一的!