Como o Windows 7 calcula a cor a ser usada na barra de tarefas "rastreamento a cores"?


20

Isso me intrigou por algum tempo.

Alguém conhece o algoritmo que o Windows 7 Aero usa para determinar a cor a ser usada como destaque do cursor de controle quente nos botões da barra de tarefas dos aplicativos em execução no momento?

Cores flutuantes da barra de tarefas do Windows 7

Definitivamente, é baseado no ícone do aplicativo, mas não consigo ver um padrão específico de onde está obtendo o valor da cor.

Ele não parece ser qualquer um dos seguintes:

  1. Um valor médio de cor de todo o ícone; caso contrário, você ficará marrom o tempo todo com ícones multicoloridos como o Chrome.
  2. A cor mais utilizada na imagem; caso contrário, você ficará amarelo para o ícone do SQL Server Management Studio (6º da esquerda). Além disso, o ícone do Chrome usou vermelho, verde e amarelo na mesma medida.
  3. Uma cor localizada em determinadas coordenadas de pixel dentro do ícone, porque o Chrome é vermelho - indicando a parte superior do ícone - e o Notepad ++ (2º da direita) é verde - indicando a parte inferior do ícone.

Fiz essa pergunta no ux.stackoverflow.com e ela foi fechada como off-topic, mas alguém respondeu com o seguinte:


Conforme descrito por Raymond Chen neste artigo de blog do MSDN :

Algumas pessoas perguntam como é feito. Não é realmente nada de especial. O código procura apenas a cor predominante no ícone. (E, como os designers visuais são atrativos para esse tipo de coisa, preto, branco e tons de cinza não são considerados "cores" para a finalidade deste cálculo.)


No entanto, eu não estava realmente satisfeito com essa resposta, porque não explica como a cor "predominante" é calculada. Certamente, no ícone do SQL Management Studio, a cor predominante, pelo menos para os meus olhos, é amarela. No entanto, o destaque é verde. Quero saber, especificamente, qual é o algoritmo.


An average colour value from the entire icon, otherwise you would get brown all the time.Isso não faz sentido. Por exemplo, como os ícones do Skype , do prompt de comando ou do µTorrent ficam na cor marrom? The_ ఠ (A última vez que fiz a engenharia reversa de um dos algoritmos de cálculo de cores do Windows, foram necessários vários anos de atenção e desatenção e muitos tipos diferentes de trabalho para finalmente descobrir. Parece que eu posso acabar invadindo esse um em algum momento.)
Synetech 2/14/14

@ Synetech, você está certo - eu estava pensando sobre a grande variedade de ícones disponíveis e muitos deles que contêm várias cores. Por exemplo, o ícone do Chrome ou o IIS contém vermelho, verde amarelo e azul e verde, amarelo e azul, respectivamente. Eu preguiçosamente imaginei que isso teria uma cor marrom escura, mas você está certo que isso não se aplica a muitos ícones monocromáticos mais ou menos.
theyetiman

A publicação da ONT tem um comentário que tem um link para uma pergunta sobre a versão do Chrome e a página vinculada explica isso examinando o código-fonte do Chrome. A explicação (pelo menos para isso) não é exatamente um algoritmo simples.
Synetech

@ Nice encontrar Synetech - agora estamos chegando a algum lugar. Isso é o que eu estava procurando. Agora, se ao menos pudéssemos obter o código-fonte do Win7 ...;)
theyetiman

Eu estou supondo, mas todos os pixels estão no espaço tridimensional (1 valor para cada cor). Divida-os em grupos / cubos de, por exemplo, 10x10x10, para que a cor RGB (12,56,97) fique no grupo / cubo (10-20,50-60,90-100). Ao dividir os pixels sobre esses grupos, você controla qual é o maior. Finalmente, você determina a cor predominante calculando a média do grupo com mais pixels. O tamanho dos grupos é então uma troca de desempenho / precisão.
precisa saber é o seguinte

Respostas:


14

De Bem-vindo à área de trabalho do Windows 7 em exatamente 35 minutos em:

É um histograma de cores normalizado em 27 intervalos diferentes, e extraímos pretos, brancos, canais alfa e cinzas e usamos o valor RGBV [sic] mais dominante ...

Estou bastante certo de que o falante quis dizer "RGB", já que "RGBV" não parece ser uma coisa. A parte "normalizada" realmente não importa; está efetivamente contando quantos pixels caem em cada "bloco". Cada pixel, portanto, é colocado em um dos 27 depósitos (organizados em uma matriz tridimensional; a raiz do cubo de 27 é 3) com base na posição do valor de cada canal. O Windows determina para cada canal de cores se a intensidade dessa cor está na parte inferior, média ou superior do intervalo. Parece que os intervalos são de 0 a 60, 60 a 200 e 200 a 255. Pixels completamente transparentes não estão incluídos.

O Windows encontra então o balde com mais pixels, ignorando os pretos, brancos e cinza (os baldes em que os três canais estavam no mesmo terço do intervalo). Isso explica o ícone do SQL Server Management Studio - muito do que parece amarelo para nós, na verdade, é despejado no balde "branco" e é ignorado.

Se não houver pixels em nenhum dos depósitos aceitáveis, o programa obtém uma sobreposição azul clara, independentemente do esquema de cores do sistema. (Consulte o prompt de comando.) Se um programa não tiver um ícone, ele receberá uma sobreposição branca / translúcida, mesmo que o ícone padrão do Windows produza uma sobreposição azul ou verde.

Não há nada para impedir que vários programas tenham a mesma cor de destaque. O mais novo ícone do Chrome, por exemplo, fica com o mesmo amarelo do Explorer do Windows 8.

Se houver gravatas, há uma ordem predeterminada que não depende da ordem das cores na imagem. Provavelmente, isso é apenas o resultado da maneira como o máximo é encontrado - os baldes verificados anteriormente continuarão sendo o máximo, mesmo se um empate posterior. Parece que o amarelo é um dos primeiros baldes verificados.

Depois que o balde vencedor é descoberto, a cor de destaque parece ser definida como uma cor em algum lugar no meio do intervalo do balde.

Casos de teste (números fornecidos são valor RGB):

amarelo brilhante(255, 247, 209) → destaque padrão
vermelho 47(47, 0, 0) → destaque padrão
vermelho 60(60, 0, 0) → vermelho escuro
vermelho 66(66, 0, 0) → vermelho escuro
vermelho escuro(165, 0, 0) → vermelho
cinza 128( 128, 128, 128) → destaque padrão
halfs(0, 148, 255) e (255, 0, 0) → vermelho
mais metades(0, 255, 0) e (255, 216, 0) com a mesma área → amarelo
mesmo invertidomesmo, mas invertido → amarelo
branco vermelho 180(255, 180, 180) → vermelho claro
branco vermelho 210(255, 210, 210) → realce padrão
quartosazul puro, amarelo puro, vermelho puro e verde puro com a mesma área → amarelo
branco vermelho 61(255, 61, 61) → vermelho
vermelho 82(82, 0, 0) → vermelho escuro


Esta é a resposta mais deliciosa ainda. Obrigado. Explica tudo com o qual tive problemas e também entra em intensa profundidade. Bravo.
theyetiman

@ Ben NI sabe que isso parece uma pergunta idiota, mas ainda assim. Por que 27 baldes? Eu sei que é 3 ^ 3, e acho que os 3 primeiros são as cores R, G e B, mas o que os 3 segundos representam?
Aexl

@TheSexiestManinJamaica Eu acho que é apenas arbitrário; talvez a Microsoft tenha gostado da elegância de 3 ^ 3. É um bom equilíbrio entre haver muito poucas cores possíveis (3 ^ 2 é apenas 9) e muitas cores possíveis (3 ^ 4 é 81).
Ben N

0

Meu palpite seria que, para cada cor, começando do topo, você obtenha os valores R, G e B, e deles você pegue o maior e o menor dos três e os compare. A cor com a maior lacuna entre a mais alta e a mais baixa seria a cor mais brilhante da imagem. Agora, no caso do ícone do Chrome, por exemplo, pode haver várias cores associadas à maior lacuna, mas o vermelho está no topo, então é encontrado primeiro e, portanto, é isso que domina a imagem. (Suponho que você possa testar isso criando seu próprio ícone, como girar o logotipo do Chrome em 120 graus e ver se o verde ou o amarelo dominam).


0

Pelo que entendi - o sistema operacional leva mais do que alguns fatores em consideração ao determinar a cor.

  1. Uma cor já foi atribuída pelo sistema operacional a este aplicativo? Nesse caso, pule para 7.
  2. Essa cor está definida no código do programa? Nesse caso, use a cor predefinida do programa. (Sim, existe uma configuração variável para programas do Windows que controla isso, não, não sei o nome exato da variável)
  3. se 1 = falso (significando sem cor predefinida), defina a cor dominante do ícone usado. (Para isso, as cores Preto, branco e cinza são ignoradas)
  4. Se 2 não puder definir uma única cor usada e mais dominante que as outras cores usadas, defina o valor médio de RBG do ícone. Se uma cor definida for alcançada, use isso. Para isso, as cores Branco, Preto, Cinza e Marrom são completamente ignoradas.
  5. Se 3 resultar em uma das cores da lista negra (branco preto ou cinza), atribua aleatoriamente uma cor que represente mais de perto o valor médio de RBG, sem violar as cores da lista negra.
  6. Após a conclusão bem-sucedida da atribuição de cores, armazene as informações de cores no registro para atribuir cores mais rapidamente posteriormente.
  7. Se a cor atribuída corresponder a uma cor já usada por outro aplicativo aberto no momento, desloque a cor por uma quantidade de matiz aleatória dentro de 15% da cor atribuída.
  8. Exibir cor.

Isso pode muito bem estar errado e é principalmente especulação, mas isso fornece um método fácil de entender que o sistema operacional pode muito bem estar usando para determinar as cores. Ele também explica como um programa sem uma cor predefinida e um ícone usando quantidades iguais de cores não recebe branco / marrom / preto e por que preto, branco e cinza nunca são atribuídos. Além disso, você deve observar que os programas que não têm um ícone (ainda existem alguns) mostram uma cor transparente de rastreamento a quente, o que simplesmente faz com que o ícone fique mais brilhante quando passa o mouse.


Não há como os aplicativos definirem sua própria cor. Também não parece haver nenhuma regra contra dois programas da mesma cor. Idéias interessantes, no entanto.
187 Ben Ben N

-2

Aqui está um código VB que calcula a média das cores RGB de uma imagem:

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

Não é realmente otimizado para uso em um sistema operacional, mas deve fornecer uma idéia básica - Fonte


3
Ele já explicou que não é uma média simples / básica. Execute o ícone do Chrome pelo código e você verá isso por si mesmo.
#
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.