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

8
什么是按照可见光谱(红色到蓝色或蓝色到红色都可以)在 System.Media.Colors 中颜色排序的最快/最简单方法?
编辑:
这是排序结果(色相->饱和度->亮度): enter image description here 这可能在技术上是正确的,但视觉效果仍然不对。有人能解释问题出在哪里吗?

无法在一维序列中连续表示三维(彩色)空间。您究竟想要实现什么? - Eamon Nerbonne
好的,谢谢。这正是我需要知道的。我之前想错了。 - NVM
2个回答

4
你想按色调对颜色进行排序。要做到这一点,你需要计算出颜色的色调,而Wpf System.Media.Color结构体并没有包含为此计算的属性。

你有两个选项:

  • 您可以手动计算色调。这不是很难,但很麻烦:需要大量的if-then语句。可以在devx上找到执行此操作的示例代码。这种方法更费力且不易读懂,但可能更快。
  • 您可以使用System.Drawing.Color.GetHue。旧版winforms时代的System.Drawing颜色结构确实支持计算色调。这使得代码非常简单;像System.Drawing.Color.FromArgb(col.R, col.G, col.B).GetHue()这样的代码就足够了 - 简洁明了!然而,这意味着您将处理两个具有相同名称的结构,并且您当然需要引用System.Drawing.dll程序集。这种方法往往速度较慢并进行许多检查,因此如果性能至关重要,则可能不太吸引人。
颜色空间是三维的。虽然您可以沿一个方向进行排序(例如这里的色调),但如果保持其他两个方向不变(在HSB模型中是饱和度和亮度),则得到的颜色序列只会连续显示。这就是为什么大多数选色器选择二维表示的原因,但即使如此,在给定的选色器中仍必须保持一个维度恒定以维护连续的渐变。

我想要补充一点,他可以“简单地”从Mono中借用GetHue的代码并创建一个扩展方法。他正在做的唯一问题是在计算列上进行排序(是的,这是过早的优化)。 - xanatos
这个可以工作,但不完全。将其“取消标记”为答案。 - NVM
这确实回答了我的问题。尽管我试图做一些不可能的事情! - NVM
嗯,数学上讲,你不需要保持“其他”维度恒定,只需要连续 - 因此,如果你放宽了看起来像可见光谱图像的要求,你可以得到合理的结果。特别是,你可以使用填充空间曲线。如果你处理的是一个固定的、有限大小的集合,你可以沿着连续的线来回地走动,以覆盖所有颜色。 - Eamon Nerbonne
我会使用LSHuv中的H,而不是HSL,因为它更准确。 - Cory Nelson

0
NVM提到了单色作为可能的解决方案,但事实并非如此。问题在于当前的显示技术。单色强调了这个问题。在彩色中看起来很好的东西,在单色中会散开,反之亦然。这并不意味着排序是不可能的。它只能通过数学方法完成。
更让排序变得复杂的是,我们都是色盲,而且每个人的色盲程度都有很大的差异。数学可以得出正确的排序,但没有人能预测每个人会看到什么。
光谱≡音调≈色调(((≡视觉皮层,≈内分泌代偿)))
蓝色››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(w-b)...而这种RGB的nCol扩展可以完美地进行一对一的排序,太棒了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接