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?
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:
- Um valor médio de cor de todo o ícone; caso contrário, você ficará marrom
o tempo todocom ícones multicoloridos como o Chrome. - 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.
- 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.)Respostas:
De Bem-vindo à área de trabalho do Windows 7 em exatamente 35 minutos em:
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):
(255, 247, 209) → destaque padrão
(47, 0, 0) → destaque padrão
(60, 0, 0) → vermelho escuro
(66, 0, 0) → vermelho escuro
(165, 0, 0) → vermelho
( 128, 128, 128) → destaque padrã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) → vermelho claro
(255, 210, 210) → realce padrão
azul puro, amarelo puro, vermelho puro e verde puro com a mesma área → amarelo
(255, 61, 61) → vermelho
(82, 0, 0) → vermelho escuro
fonte
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).
fonte
Pelo que entendi - o sistema operacional leva mais do que alguns fatores em consideração ao determinar a 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.
fonte
Aqui está um código VB que calcula a média das cores RGB de uma imagem:
Não é realmente otimizado para uso em um sistema operacional, mas deve fornecer uma idéia básica - Fonte
fonte