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.

theyetiman
fonte
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

Ben N
fonte
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).

Darrel Hoffman
fonte
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.

Josh Raymond
fonte
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


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.
#