这让我好奇了很长一段时间。
是否有人知道 Windows 7 Aero 使用什么算法来确定当前正在运行的应用程序的任务栏按钮上的热跟踪悬停突出显示的颜色?
它确实基于应用程序的图标,但我看不到它从哪里获取颜色值的具体模式。
它没有似乎是以下任何一种情况:
- 整个图标的平均颜色值,否则您会一直看到棕色的
图标,例如 Chrome。 - 图像中使用最多的颜色,否则 SQL Server Management Studio 图标(左起第 6 个)会变成黄色。此外,Chrome 图标使用了同等比例的红色、绿色和黄色。
- 位于图标内特定像素坐标的颜色,因为 Chrome 是红色 - 表示图标的顶部 - 而 Notepad++(右边第二个)是绿色 - 表示图标的底部。
我在 ux.stackoverflow.com 上问了这个问题,但由于题外话而被关闭了,但有人回答如下:
正如 Raymond Chen 在这篇 MSDN 博客文章:
有些人会问这是怎么做到的。其实没什么特别的。代码只是寻找主色调在图标中。(并且,由于视觉设计师对这类事情非常挑剔,因此黑色、白色和灰色阴影不被视为此计算中的“颜色”。)
然而我对这个答案并不满意,因为它没有解释如何计算“主要”颜色。当然,在 SQL Management Studio 图标上,至少在我看来,主要颜色是黄色。但突出显示的是绿色。 我想要知道具体算法是什么。
答案1
从欢迎使用 Windows 7 桌面恰好 35 分钟后:
它是跨 27 个不同桶的标准化颜色直方图,我们提取黑色、白色、alpha 通道和灰色,并使用最主要的 RGBV [原文如此] 值...
我相当肯定演讲者想说的是“RGB”,因为“RGBV”似乎并不存在。“标准化”部分其实并不重要;它实际上计算了每个“桶”中有多少像素。因此,每个像素都会根据其每个通道值的位置放入 27 个桶中的一个(排列成三维数组;27 的立方根是 3)。Windows 会确定每个颜色通道的颜色强度是位于范围的底部、中间还是顶部。范围似乎约为 0-60、60-200 和 200-255。完全透明的像素根本不包括在内。
然后,Windows 会找出像素最多的桶,忽略黑色、白色和灰色(即所有三个通道都在同一范围的三分之一内的桶)。这解释了 SQL Server Management Studio 图标 - 在我们看来黄色的大部分内容实际上被丢弃到“白色”桶中并被忽略。
如果任何可接受的存储桶中都没有像素,则无论系统颜色方案如何,程序都会获得浅蓝色覆盖。(请参阅命令提示符。)如果程序没有图标,它会获得白色/半透明覆盖,即使 Windows 默认图标会产生蓝色或绿色覆盖。
没有什么可以阻止多个程序使用相同的高亮颜色。例如,最新的 Chrome 图标与 Windows 8 的 Explorer 一样是黄色。
如果存在平局,则存在一个预先确定的顺序,该顺序与图像中颜色的顺序无关。这可能只是最大值的查找方式的结果 - 即使较晚的桶平局,较早检查的桶仍将是最大值。看来黄色是第一个检查的桶之一。
一旦发现获胜的桶,突出显示颜色似乎会被设置为桶范围中间某处的颜色。
测试用例(提供的数字是 RGB 值):
(255,247,209)→默认高亮
(47,0,0)→默认高亮
(60, 0, 0)→深红色
(66, 0, 0)→ 深红色
(165, 0, 0)→红色
(128,128,128)→默认高亮
(0, 148, 255)和(255, 0, 0)→红色
面积相同的 (0, 255, 0) 和 (255, 216, 0) → 黄色
相同但翻转→黄色
(255, 180, 180)→浅红色
(255,210,210)→默认高亮
纯蓝色、纯黄色、纯红色和纯绿色的面积相同→黄色
(255, 61, 61)→红色
(82, 0, 0)→深红色
答案2
我的猜测是,对于每种颜色,从顶部开始,获取 R、G 和 B 值,然后从中取出最高值和最低值并进行比较。最高值和最低值之间差距最大的颜色将是图像中最亮的颜色。现在,以 Chrome 图标为例,可能有几种颜色的差距最大,但红色位于顶部,因此最先遇到,因此红色是该图像的主导颜色。(我想您可以通过设计自己的图标来测试这一点,例如将 Chrome 徽标旋转 120 度,看看绿色还是黄色占主导地位。)
答案3
据我了解 - 操作系统在确定颜色时会考虑很多因素。
- 操作系统是否已为该应用程序分配颜色?如果是,请跳至 7。
- 此颜色是否在程序代码中定义?如果是,请使用程序中预定义的颜色。(是的,Windows 程序有一个控制此功能的变量设置,不,我不知道确切的变量名称)
- 如果 1=false(表示没有预定义颜色),则定义所用图标的主色。(为此,黑色、白色和灰色将被忽略)
- 如果 2 无法定义所使用的单一颜色,并且比使用的其他颜色更占主导地位,则定义图标的平均 RBG 值。如果实现了定义的颜色,则使用此颜色。为此,白色、黑色、灰色和棕色被完全忽略。
- 如果 3 的结果是黑名单颜色之一(黑白或灰色),则随机分配一种最接近代表平均 RBG 值的颜色,但不侵犯黑名单颜色。
- 成功分配颜色后,将颜色信息存储在注册表中,以便以后更快地分配颜色。
- 如果指定的颜色与当前打开的另一个应用程序已使用的颜色相匹配,则将颜色偏移指定颜色 15% 以内的随机色调量。
- 显示颜色。
这很可能是错误的,而且主要是猜测,但是,这为您提供了一种易于理解的方法,操作系统很可能使用它来确定颜色。它还解释了为什么没有预定义颜色的程序和使用相同数量颜色的图标没有被分配白色/棕色/黑色,以及为什么从未分配黑色、白色和灰色。您还应该注意,没有图标的程序(仍有一些)显示透明的热跟踪颜色,这只会导致图标在悬停时“更亮”。
答案4
下面是一些对图像的 RGB 颜色进行平均的 VB 代码:
Function AverageRGB(ByRef P As PictureBox) As Long
Dim Count As Long
Dim Red As Long
Dim Green As Long
Dim Blue As Long
Dim Hexed As String
Dim X As Long
Dim Y As Long
Count = 0
For X = 0 To P.Width Step P.Width \ 32
For Y = 0 To P.Height Step P.Height \ 32
Hexed = Right("00000" & Hex(P.Point(X, Y)), 6)
Red = Red + CLng("&h" & Right(Hexed, 2))
Green = Green + CLng("&h" & Mid(Hexed, 3, 2))
Blue = Blue + CLng("&h" & Left(Hexed, 2))
Count = Count + 1
Next
Next
AverageRGB = RGB(Red \ Count, Green \ Count, Blue \ Count)
End Function
它并没有真正针对操作系统进行优化,但它应该能给你一个基本的概念 -来源