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

标签 c# .net wpf colors color-space

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

编辑:

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

enter image description here

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

最佳答案

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

你有两个选择:

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

色彩空间是三维的。尽管您可以沿一个方向(例如此处的色调)排序,但只有在保持其他两个方向(HSB 模型中的饱和度和亮度)不变的情况下,生成的颜色序列才会显得连续。这就是大多数颜色选择器选择二维表示的原因,但即便如此,您也必须在给定的颜色选择器中保持一维不变,以保持连续的渐变。

关于c# - 根据可见光谱中的位置对 System.Media.Colors 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5430468/

相关文章:

javascript - Request.QueryString 不接收值

c# - VS2017调试: Unable to access members of COM object

c# - .Net 程序集安全 - 防止黑客攻击/逆向工程

c# - 如何在 XAML WPF 中创建强制依赖属性

c# - 我可以使用点符号来访问字典值吗?

c# - 具有未定义字符数的字符串格式c#

.net - 数据源名称的大小写敏感性

c# - 访问列表框中的数据

c# - 如何调试Unity分辨率?

c# - WPF 中的数据绑定(bind)?