Windows 7如何计算用于任务栏“颜色热跟踪”的颜色?


20

这让我很感兴趣。

有谁知道Windows 7 Aero用于确定颜色的算法,该颜色用作当前正在运行的应用程序的任务栏按钮上的热跟踪悬停突出显示吗?

Windows 7任务栏悬停颜色

它绝对基于应用程序的图标,但是我看不到从中获取颜色值的特定模式。

并不似乎是以下任意的:

  1. 整个图标的平均颜色值,否则,Chrome等多色图标始终会变成棕色。
  2. 颜色在图像中使用最多,否则,SQL Server Management Studio图标将变为黄色(从左数第六)。另外,Chrome图标使用的红色,绿色和黄色均等。
  3. 位于图标内某些像素坐标处的颜色,因为Chrome是红色的-表示图标的顶部-而Notepad ++(从右数第二个)是绿色的-表示图标的底部。

我在ux.stackoverflow.com上问了这个问题,它被关闭为题外话,但有人回答如下:


如Raymond Chen在此MSDN博客文章中所述

有人问它是如何完成的。真的没什么特别的。该代码仅在图标中查找主要颜色。(并且,由于视觉设计师是这类事情的坚持者,因此,出于计算目的,黑色,白色和灰色阴影不被视为“颜色”。)


但是我对这个答案不是很满意,因为它没有解释“主要”颜色是如何计算的。当然,在SQL Management Studio图标上,至少在我看来,主要的颜色是黄色。然而亮点是绿色。 我想知道具体是什么算法。


An average colour value from the entire icon, otherwise you would get brown all the time.那没有道理。例如,Skype命令提示符µTorrent图标如何平均变成棕色?ಠ_ఠ(上一次我对Windows的颜色计算算法进行逆向工程时,花了几年的时间才花心思,而且还花了很多不同的工作才能弄清楚。一个在某一点)。
Synetech

@Synetech,您是对的-我只是在考虑可用的图标种类繁多,其中许多包含多种颜色。例如,Chrome图标或IIS图标分别包含红色,绿色,黄色和蓝色以及绿色,黄色和蓝色。我懒洋洋地想着,这些平均会变成暗淡的棕色,但是您说对了,它不适用于许多或多或少的单色图标。
theyetiman 2014年

ONT后一个评论它链接到一个关于Chrome的版本,这和问题链接页面通过检查Chrome的源代码解释它。解释(至少对此)并不是一个简单的算法。
Synetech 2014年

@Synetech很不错的发现-现在我们到了。这是我一直在寻找的路线。现在,如果我们能获得Win7源代码...;)
theyetiman 2014年

我正在猜测,但是,所有像素都在3维空间中(每种颜色1个值)。将它们划分为例如10x10x10的组/多维数据集,因此颜色RGB(12,56,97)归入组/多维数据集(10-20,50-60,90-100)。将像素划分为这些组时,您可以跟踪哪一个最大。最后,通过平均像素数最多的组来确定主要颜色。这样,组的大小就是性能/准确性的交换。
mxt3 2014年

Answers:


14

在35分钟内从“ 欢迎使用”进入Windows 7桌面

这是跨27个不同存储桶的归一化颜色直方图,我们提取黑色,白色,alpha通道和灰色,并使用最主要的RGBV [sic]值...

我可以肯定地说,说话者的意思是说“ RGB”,因为“ RGBV”似乎不是问题。“标准化”部分并不重要;它有效地计算了每个“桶”中有多少像素掉落。因此,根据每个像素的每个通道值的位置,将每个像素放入27个存储桶(按三维阵列排列; 27的立方根为3)之一中。Windows将为每个颜色通道确定该颜色的强度是在范围的底部,中间还是顶部。看起来范围大约是0-60、60-200和200-255。完全不包括完全透明的像素。

然后,Windows查找哪个存储桶具有最多的像素,而忽略了黑色,白色和灰色的像素(所有三个通道位于同一范围的存储桶)。这就解释了SQL Server Management Studio图标-对我们来说黄色的实际上实际上是被丢弃在“白色”存储桶中而被忽略了。

如果任何可接受的存储桶中没有像素,则无论系统颜色如何,程序都会获得浅蓝色覆盖。(请参阅命令提示符。)如果程序没有图标,则即使Windows默认图标会产生蓝色或绿色的覆盖,它也会获得白色/半透明的覆盖。

没有什么可以阻止多个程序具有相同的突出显示颜色。例如,最新的Chrome图标与Windows 8的资源管理器使用相同的黄色。

如果存在联系,则存在不依赖于图像中颜色顺序的预定顺序。这可能只是发现最大值的方式的结果-早先检查的存储区将继续保持最大值,即使稍后的并列也是如此。似乎黄色是最早检查的桶之一。

一旦发现获胜的桶,突出显示的颜色似乎设置为桶范围中间的某个颜色。

测试用例(提供的数字是RGB值):

亮黄的(255、247、209)→默认高光
红色47(47、0、0)→默认高光(60、0、0
红色60)→深红色
红色66(66、0、0)→深红色
深红(165、0、0)→红色
灰色128( 128、128、128)→默认高亮显示
半身(0、148、255)和(255、0、0)→红色
一半以上(0、255、0)和(255、216、0)具有相同的面积→黄色
同样倒转相同但被翻转→黄色
白红180(255、180、180)→浅红色
白红210(255、210、210)→默认突出显示
宿舍具有相同面积的纯蓝色,纯黄色,纯红色和纯绿色→黄色
白色红色61(255、61、61)→红色
红色82(82, 0,0)→深红色


这是迄今为止最精致的答案。谢谢。它解释了我遇到的所有问题,并且深入人心。太棒了
theyetiman '02

@Ben NI知道这看起来像一个愚蠢的问题,但仍然如此。为什么要27个桶?我知道它是3 ^ 3,我猜前3个是R,G和B颜色,但是后3个代表什么?
aexl

@TheSexiestManinJamaica我认为这是任意的;也许微软喜欢3 ^ 3的优雅。在几乎没有可能的颜色(3 ^ 2仅是9)和很多可能的颜色(3 ^ 4为81)之间取得了很好的平衡。
本N

0

我的猜测是,对于每种颜色,从顶部开始,您将获得R,G和B值,并从中获得三个值中的最高和最低值并进行比较。最高与最低之间的最大差异的颜色是图像中最亮的颜色。现在,例如在Chrome图标的情况下,可能会有几种颜色并列,以最大的差距,但是红色在顶部,因此首先遇到它,因此这就是该图像的主要来源。(我想您可以通过设计自己的图标来进行测试,例如将Chrome徽标旋转120度,然后看看绿色还是黄色占主导地位。)


0

从我的理解来看-操作系统在确定颜色时会考虑多个因素。

  1. 操作系统已经为该应用程序分配了颜色吗?如果是,请跳至7。
  2. 程序代码中定义了这种颜色吗?如果是这样,请使用程序中的预定义颜色。(是的,有用于控制此功能的Windows程序的变量设置,不,我不知道确切的变量名)
  3. 如果1 = false(表示没有预定义的颜色),则定义所使用图标的主色。(为此,将忽略黑色,白色和灰色)
  4. 如果2无法定义使用的一种颜色,并且比使用的其他颜色更占主导地位,请定义该图标的平均RBG值。如果实现了定义的颜色,请使用此颜色。为此,完全忽略了白色,黑色,灰色和棕色。
  5. 如果3导致黑名单中的一种颜色(黑白色或灰色),请随机分配最接近代表平均RBG值的颜色,而不会侵犯黑名单的颜色。
  6. 成功完成颜色分配后,将颜色信息存储在注册表中,以便以后更快地进行颜色分配。
  7. 如果分配的颜色与当前打开的另一个应用程序已经使用的颜色匹配,请在分配的颜色的15%之内将颜色偏移随机的色相量。
  8. 显示颜色。

这很可能是错误的,并且主要是猜测,但是,这为您提供了一种易于理解的方法,操作系统很可能会使用该方法来确定颜色。它还说明了如何不为没有预定义颜色的程序以及使用等量颜色的图标分配白,棕,黑,以及为什么从未分配黑,白,灰。还要注意的是,没有图标(仍然有一些图标)的程序会显示透明的热跟踪颜色,这会使图标悬停在图标上时会变得“更亮”。


应用程序无法定义自己的颜色。对于两个具有相同颜色的程序似乎也没有任何规定。有趣的想法。
本N

-2

以下是一些VB代码,用于平均图像的RGB颜色:

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

它并不是为在操作系统中使用而真正优化的,但是它应该给您一个基本的想法- 来源


3
他已经解释说这不是一个简单/基本的平均值。通过代码运行Chrome图标,您将自己看到它。
Synetech 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.