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

NVM*_*NVM 8 .net c# wpf colors color-space

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

编辑:

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

在此输入图像描述

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

Eam*_*nne 4

看来您想按色调对颜色进行排序。为此,您需要计算颜色的色调,而 WpfSystem.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 模型中的饱和度和亮度)不变,所得的颜色序列才会显得连续。这就是大多数颜色选择器选择二维表示的原因,但即便如此,您也必须在给定颜色选择器中保持一维不变,以保持连续的渐变。