Como o Windows 7 calcula a cor a ser usada na barra de tarefas “color hot-tracking”?

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 o destaque instantâneo de rastreamento a quente nos botões da barra de tarefas para aplicativos em execução no momento?

Édefinitivamentebaseadonoíconedoaplicativo,masnãoconsigoverumpadrãoespecíficodeondeeleestáobtendoovalordecor.

nãopareceserumdosseguintes:

  1. Umvalordecormédiodetodooícone,casocontrário,vocêobteriaotempotodocomíconesmulticoloridos,comooChrome.
  2. Acormaisusadanaimagem,casocontráriovocêficariaamarelonoíconedoSQLServerManagementStudio(6ºdaesquerda).Alémdisso,oíconedoChromeusouvermelho,verdeeamareloemigualmedida.
  3. Umacorlocalizadaemdeterminadascoordenadasdepixelnoícone,porqueoChromeévermelho-indicandoapartesuperiordoícone-eoNotepad++(2ºdadireita)éverde-indicandoaparteinferiordoícone.

Eufizestaperguntanoux.stackoverflow.comeelafoiencerradacomoforadotópico,masalguémrespondeucomoseguinte:

ConformedescritoporRaymondChenno artigo do blog do MSDN :

Some people ask how it's done. It's really nothing special. The code just looks for the predominant color in the icon. (And, since visual designers are sticklers for this sort of thing, black, white, and shades of gray are not considered "colors" for the purpose of this calculation.)

No entanto não fiquei muito 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 aos meus olhos, é amarela. No entanto, o destaque é verde. Eu quero saber, especificamente, qual é o algoritmo.

    
por theyetiman 19.03.2014 / 10:21

4 respostas

14

De Bem-vindo ao Windows 7 Desktop exatamente em 35 minutos em:

It's a normalized color histogram across 27 different buckets, and we extract blacks, whites, alpha channels, and grays, and use the most dominant RGBV [sic] value...

Tenho quase certeza de que o orador quis dizer "RGB", já que "RGBV" não parece ser uma coisa. A parte "normalizada" não importa realmente; está efetivamente contando quantos pixels caem em cada "bucket". Cada pixel, portanto, é colocado em um dos 27 blocos (dispostos em uma matriz tridimensional; a raiz cúbica de 27 é 3) com base na posição de cada valor de seus canais. O Windows determina para cada canal de cor se a intensidade dessa cor está no bloco inferior, médio 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 são incluídos.

O Windows descobre qual bucket tem a maioria dos pixels, ignorando os pixels preto, branco e cinza (os buckets em que todos 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, é descartado no bucket "branco" e é ignorado.

Se não houver pixels em nenhum dos intervalos aceitáveis, o programa obterá 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 obterá uma sobreposição branca / translúcida, embora o ícone padrão do Windows produza uma sobreposição azul ou verde.

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

Se houver empates, há uma ordem predeterminada que não depende da ordem das cores na imagem. Isso é provavelmente apenas um resultado da maneira como o máximo é encontrado - os intervalos que são verificados anteriormente continuarão sendo o máximo, mesmo que um posterior seja vinculado. Parece que o amarelo é um dos primeiros baldes verificados.

Quando o bloco vencedor for descoberto, a cor de destaque parece estar definida para uma cor em algum lugar no meio do intervalo do intervalo.

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

(255,247,209)→destaquepadrão (47, 0, 0) → destaque padrão (60,0,0)→vermelhoescuro
(66, 0, 0) → vermelho escuro
(165,0,0)→vermelho
(128,128,128)→destaquepadrão (0, 148, 255) e (255, 0, 0) → vermelho
(0, 255, 0) e (255, 216, 0) com a mesma área → amarelo
mesmo mas invertido → amarelo
(255,180,180)→vermelhoclaro
(255,210,210)→destaquepadrão puro azul, amarelo puro, vermelho puro e verde puro com a mesma área → amarelo
(255, 61, 61) → vermelho
(82, 0, 0) → vermelho escuro

    
por 13.02.2016 / 20:02
0

Meu palpite seria que para cada cor, começando do topo, você obtém os valores R, G e B, e deles você pega o maior e o menor dos três e os compara. A cor com a maior diferença entre o maior e o menor seria a cor mais brilhante da imagem. Agora, no caso do, digamos, ícone do Chrome, pode haver várias cores empatadas para a maior lacuna, mas o vermelho está no topo, por isso é encontrado primeiro e, portanto, é o que domina essa imagem. (Suponho que você poderia 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).

    
por 28.05.2015 / 19:34
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 esse aplicativo? Se sim, pule para 7.
  2. Esta cor é definida no código do programa? Em caso afirmativo, use a cor predefinida do programa. (Sim, existe uma configuração de variável para programas do Windows que controla isso, não, eu não sei o nome exato da variável)
  3. se 1 = falso (não significa nenhuma 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 obtida, use isso. Para o propósito disto, as cores Branco, Preto, Cinza e Marrom são completamente ignoradas.
  5. Se 3 resultar em uma das cores da lista negra (preto branco ou cinza), atribua aleatoriamente uma cor que represente mais de perto o valor médio da RBG, sem infringir as cores da lista negra.
  6. Após a conclusão da atribuição bem-sucedida da cor, armazene as informações de cor no registro para uma atribuição de cores mais rápida posteriormente.
  7. Se a cor atribuída corresponder a uma cor já usada por outro aplicativo atualmente aberto, compense a cor por um valor de matiz aleatório dentro de 15% da cor atribuída.
  8. Exibir cor.

Isso pode muito bem estar errado, e é principalmente especulação, mas, isso dá a você um método fácil de entender que o sistema operacional poderia 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 é atribuído 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, que simplesmente faz com que o ícone fique "mais brilhante" ao passar o mouse.

    
por 08.10.2015 / 07:49
-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 lhe dar uma idéia básica - Origem

    
por 19.03.2014 / 13:39