【问题标题】:Sort System.Media.Colors according to position in visible spectrum根据可见光谱中的位置对 System.Media.Colors 进行排序
【发布时间】:2011-07-22 18:36:35
【问题描述】:

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

编辑:

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

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

【问题讨论】:

  • 不可能在一维序列中连续表示一个三维(颜色)空间。你到底想达到什么目的?
  • 谢谢。这正是我需要知道的。我不这么认为。

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


【解决方案1】:

您似乎想按色调对颜色进行排序。为此,您需要计算颜色的色调,而 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() 这样的东西就足够了——又好又短!但是,这确实意味着您将处理两个具有相同名称的结构,并且您当然需要 ro 引用 System.Drawing.dll 程序集。这类方法往往速度较慢,并且会进行大量的健全性检查,因此如果性能很关键,那么它的吸引力可能会降低。

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

【讨论】:

  • 我会补充一点,他可以“简单地”从 Mono 中借用 GetHue 的代码并创建一个扩展方法。他所做的唯一问题是他在计算列上进行排序(是的,这是过早的优化)。
  • 这行得通,但并不完全。将其“取消标记”作为答案。
  • 这确实回答了我的问题。虽然我在尝试一些不可能的事情!
  • 嗯,为了数学上的精确,你不需要保持“其他”维度不变,只要连续 - 所以如果你放宽看起来像可见光谱图像的要求,你可以得到一些东西合理的。特别是,您可以使用space-filling curve。如果您正在处理一个固定的、有限尺寸的集合,您可以来回曲折以连续覆盖所有颜色。
  • 我会使用 LSHuv 中的 H,而不是 HSL,这样更准确。
【解决方案2】:

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 扩展做了一个完美的排序,一对一,唷!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2015-12-09
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多