Comment Windows 7 calcule-t-il la couleur à utiliser pour le «suivi à chaud des couleurs» de la barre des tâches?

20

Cela m'intrigue depuis un certain temps.

Quelqu'un connaît-il l'algorithme que Windows 7 Aero utilise pour déterminer la couleur à utiliser comme surbrillance du survol à chaud sur les boutons de la barre des tâches pour les applications en cours d'exécution?

Couleurs de survol de la barre des tâches de Windows 7

Il est certainement basé sur l'icône de l'application, mais je ne vois pas de motif spécifique d'où il tire la valeur de la couleur.

Il ne semble pas être l'un des éléments suivants:

  1. Une valeur de couleur moyenne de l'icône entière, sinon vous obtiendrez tout le temps du brun avec des icônes multicolores comme Chrome.
  2. La couleur la plus utilisée dans l'image, sinon vous obtiendrez le jaune pour l'icône SQL Server Management Studio (6e à partir de la gauche). De plus, l'icône Chrome utilisait le rouge, le vert et le jaune dans une égale mesure.
  3. Une couleur située à certaines coordonnées de pixels dans l'icône, car Chrome est rouge - indiquant le haut de l'icône - et Notepad ++ (2e à droite) est vert - indiquant le bas de l'icône.

J'ai posé cette question sur ux.stackoverflow.com et elle a été fermée comme hors sujet, mais quelqu'un a répondu par ce qui suit:


Comme décrit par Raymond Chen dans cet article de blog MSDN :

Certaines personnes demandent comment c'est fait. Ce n'est vraiment rien de spécial. Le code recherche simplement la couleur prédominante dans l'icône. (Et, puisque les concepteurs visuels sont tenaces pour ce genre de chose, le noir, le blanc et les nuances de gris ne sont pas considérés comme des "couleurs" aux fins de ce calcul.)


Cependant je n'étais pas vraiment satisfait de cette réponse car elle n'explique pas comment la couleur "prédominante" est calculée. Sûrement sur l'icône SQL Management Studio, la couleur prédominante, à mes yeux au moins, est le jaune. Pourtant, le point culminant est vert. Je veux savoir précisément ce qu'est l'algorithme.

theyétiman
la source
An average colour value from the entire icon, otherwise you would get brown all the time.Cela n'a aucun sens. Par exemple, comment les icônes Skype , invite de commande ou µTorrent pourraient -elles brunir en moyenne? ಠ_ ఠ (La dernière fois que j'ai procédé à une ingénierie inverse d'un des algorithmes de calcul des couleurs de Windows, il a fallu plusieurs années d'attention et de beaucoup de différents types de travail pour finalement le comprendre. Il semble que je puisse finir par pirater ce un à un moment donné.)
Synetech
@Synetech vous avez raison - je pensais juste au large éventail d'icônes disponibles et à beaucoup d'entre elles qui contiennent plusieurs couleurs. Par exemple, l'icône Chrome ou l'icône IIS contient respectivement rouge, vert jaune et bleu et vert, jaune et bleu. J'ai paresseusement pensé que cela donnerait une couleur brun sombre, mais vous avez raison, cela ne s'applique pas à beaucoup d'icônes plus ou moins monochromes.
theyetiman
Le post ONT a un commentaire qui renvoie à une question sur la version de Chrome de cela et la page liée l' explique en examinant le code source de Chrome. L'explication (pour cela au moins) n'est pas exactement un algorithme simple.
Synetech
@Synetech nice find - maintenant nous allons quelque part. C'est dans le sens de ce que je cherchais. Maintenant, si seulement nous pouvions obtenir le code source de Win7 ...;)
theyetiman
Je suppose, mais tous les pixels sont dans un espace en 3 dimensions (1 valeur pour chaque couleur). Divisez-les en groupes / cubes de par exemple 10x10x10, de sorte que la couleur RVB (12,56,97) soit dans le groupe / cube (10-20,50-60,90-100). Lorsque vous divisez les pixels sur ces groupes, vous gardez la trace du plus grand. Enfin, vous déterminez la couleur prédominante en faisant la moyenne du groupe avec le plus de pixels. La taille des groupes est alors un échange de performance / précision.
mxt3

Réponses:

14

De Bienvenue sur le bureau Windows 7 à exactement 35 minutes en:

Il s'agit d'un histogramme de couleurs normalisé sur 27 compartiments différents, et nous extrayons les noirs, les blancs, les canaux alpha et les gris, et utilisons la valeur RGBV [sic] la plus dominante ...

Je suis assez certain que le haut-parleur voulait dire "RGB", car "RGBV" ne semble pas être une chose. La partie "normalisée" n'a pas vraiment d'importance; il compte effectivement le nombre de pixels qui tombent dans chaque "compartiment". Par conséquent, chaque pixel est placé dans l'un des 27 compartiments (disposés dans un tableau tridimensionnel; la racine cubique de 27 est 3) en fonction de la position de la valeur de chacun de ses canaux. Windows détermine pour chaque canal de couleur si l'intensité de cette couleur se situe dans la partie inférieure, moyenne ou supérieure de la plage. Il semblerait que les plages soient d'environ 0-60, 60-200 et 200-255. Les pixels complètement transparents ne sont pas du tout inclus.

Windows trouve ensuite quel compartiment a le plus de pixels, en ignorant les noirs, blancs et gris (les compartiments où les trois canaux étaient dans le même tiers de la plage). Cela explique l'icône de SQL Server Management Studio - une grande partie de ce qui nous apparaît jaune est en fait vidé dans le compartiment "blanc" et est ignoré.

S'il n'y a pas de pixels dans l'un des compartiments acceptables, le programme obtient une superposition bleu clair quel que soit le jeu de couleurs du système. (Voir l'invite de commande.) Si un programme n'a pas d'icône, il obtient une superposition blanche / translucide même si l'icône par défaut de Windows produirait sinon une superposition bleue ou verte.

Rien n'empêche plusieurs programmes d'avoir la même couleur de surbrillance. La dernière icône Chrome, par exemple, a le même jaune que l'Explorateur de Windows 8.

S'il y a des liens, il y a un ordre prédéterminé qui ne dépend pas de l'ordre des couleurs dans l'image. C'est probablement juste un résultat de la façon dont le maximum est trouvé - les compartiments qui sont vérifiés plus tôt continueront d'être le maximum même si un plus tard est lié. Il semble que le jaune soit l'un des premiers godets vérifiés.

Une fois le seau gagnant découvert, la couleur de surbrillance semble être définie sur une couleur quelque part au milieu de la plage du seau.

Cas de test (les nombres fournis sont des valeurs RVB):

jaune vif(255, 247, 209) → surbrillance par défaut
rouge 47(47, 0, 0) → surbrillance par défaut
rouge 60(60, 0, 0) → rouge foncé
rouge 66(66, 0, 0) → rouge foncé
rouge foncé(165, 0, 0) → rouge
gris 128( 128, 128, 128) → surbrillance par défaut
les moitiés(0, 148, 255) et (255, 0, 0) → rouge
plus de moitiés(0, 255, 0) et (255, 216, 0) avec la même zone → jaune
même inverséidentique mais inversé → jaune
blanc rouge 180(255, 180, 180) → rouge clair
blanc rouge 210(255, 210, 210) → surbrillance par défaut
trimestresbleu pur, jaune pur, rouge pur et vert pur avec la même zone → jaune
blanc rouge 61(255, 61, 61) → rouge
rouge 82(82, 0, 0) → rouge foncé

Ben N
la source
C'est la réponse la plus délicieuse à ce jour. Merci. Cela explique tout ce avec quoi j'ai eu du mal et va aussi en profondeur. Bravo.
theyetiman
@Ben NI sait que cela ressemble à une question stupide, mais quand même. Pourquoi 27 seaux? Je sais que c'est 3 ^ 3, et je suppose que les 3 premiers sont les couleurs R, G et B, mais que représentent les 3 premiers?
aexl
@TheSexiestManinJamaica Je pense que c'est juste arbitraire; peut-être que Microsoft a aimé l'élégance de 3 ^ 3. C'est un bel équilibre entre le fait qu'il y a très peu de couleurs possibles (3 ^ 2 n'est que 9) et beaucoup de couleurs possibles (3 ^ 4 est 81).
Ben N
0

Je suppose que pour chaque couleur, en commençant par le haut, vous obtenez les valeurs R, G et B, et à partir de celles-ci, vous prenez les plus hautes et les plus basses des trois et les comparez. La couleur avec le plus grand écart entre le plus haut et le plus bas serait la couleur la plus lumineuse de l'image. Maintenant, dans le cas, par exemple, de l'icône Chrome, il peut y avoir plusieurs couleurs liées pour le plus grand écart, mais le rouge est en haut, donc il est rencontré en premier, et c'est donc ce qui domine pour cette image. (Je suppose que vous pouvez tester cela en concevant votre propre icône, comme faire pivoter le logo Chrome de 120 degrés et voir si le vert ou le jaune domine à la place.)

Darrel Hoffman
la source
0

D'après ce que je comprends, le système d'exploitation prend en compte plusieurs facteurs lors de la détermination de la couleur.

  1. Une couleur a-t-elle déjà été attribuée par le système d'exploitation à cette application? Si oui, passez à 7.
  2. Cette couleur est-elle définie dans le code du programme? Si c'est le cas, utilisez la couleur prédéfinie du programme. (Oui, il existe un paramètre de variable pour les programmes Windows qui contrôle cela, non, je ne connais pas le nom exact de la variable)
  3. si 1 = faux (signifiant pas de couleur prédéfinie), définissez la couleur dominante de l'icône utilisée. (Pour cela, les couleurs Noir, blanc et gris sont ignorées)
  4. Si 2 ne peut pas définir une seule couleur utilisée et plus dominante que les autres couleurs utilisées, définissez la valeur RBG moyenne de l'icône. Si une couleur définie est obtenue, utilisez-la. Pour cela, les couleurs Blanc, Noir, Gris et Marron sont complètement ignorées.
  5. Si 3 donne une des couleurs de la liste noire (noir blanc ou gris), attribuez au hasard une couleur qui représente le plus fidèlement la valeur RBG moyenne, sans enfreindre les couleurs de la liste noire.
  6. Une fois l'attribution de la couleur réussie, enregistrez les informations de couleur dans le registre pour une attribution plus rapide des couleurs plus tard.
  7. Si la couleur attribuée correspond à une couleur déjà utilisée par une autre application actuellement ouverte, décalez la couleur d'une quantité de teinte aléatoire dans les 15% de la couleur attribuée.
  8. Couleur d'affichage.

Cela peut très bien être faux, et c'est principalement de la spéculation, mais cela vous donne une méthode facile à comprendre que le système d'exploitation pourrait très bien utiliser pour déterminer les couleurs. Il explique également comment un programme sans couleur prédéfinie et une icône utilisant des quantités égales de couleurs ne sont pas affectés blanc / brun / noir et pourquoi le noir, le blanc et le gris ne sont jamais attribués. Vous devez également noter que les programmes qui n'ont pas d'icône (il y en a encore) affichent une couleur transparente de suivi à chaud, ce qui rend simplement l'icône plus `` lumineuse '' lorsqu'elle survole.

Josh Raymond
la source
Il n'y a aucun moyen pour les applications de définir leur propre couleur. Il ne semble pas non plus y avoir de règle contre deux programmes ayant la même couleur. Des idées intéressantes, cependant.
Ben N
-2

Voici un code VB qui fait la moyenne des couleurs RVB d'une image:

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

Ce n'est pas vraiment optimisé pour une utilisation dans un système d'exploitation, mais cela devrait vous donner une idée de base - Source


la source
3
Il a déjà expliqué qu'il ne s'agit pas d'une moyenne simple / basique. Exécutez l'icône Chrome dans le code et vous le verrez par vous-même.
Synetech