Wie berechnet Windows 7 die Farbe, die für das „Color Hot-Tracking“ in der Taskleiste verwendet werden soll?

20

Das hat mich schon länger fasziniert.

Kennt jemand den Algorithmus, den Windows 7 Aero verwendet, um die Farbe zu bestimmen, die als Hot-Tracking-Hover-Highlight auf den Taskleistenschaltflächen für derzeit ausgeführte Apps verwendet werden soll?

Windows 7 Taskleiste Schwebefarben

Es basiert definitiv auf dem Symbol der App, aber ich kann kein bestimmtes Muster erkennen, von dem der Farbwert stammt.

Es nicht scheint eine der folgenden zu sein:

  1. Ein durchschnittlicher Farbwert des gesamten Symbols, ansonsten würden Sie mit mehrfarbigen Symbolen wie Chrome die ganze Zeit über braun .
  2. Die Farbe, die im Bild am häufigsten verwendet wird, andernfalls wird das SQL Server Management Studio-Symbol gelb (6. von links). Auch das Chrome-Symbol verwendete Rot, Grün und Gelb gleichermaßen.
  3. Eine Farbe, die sich an bestimmten Pixelkoordinaten innerhalb des Symbols befindet, da Chrome rot ist - was auf den oberen Rand des Symbols hinweist - und Notepad ++ (2. von rechts) grün ist - was auf den unteren Rand des Symbols hinweist.

Ich habe diese Frage auf ux.stackoverflow.com gestellt und sie wurde als Off-Topic geschlossen, aber jemand antwortete mit:


Wie von Raymond Chen in diesem MSDN-Blogartikel beschrieben :

Einige Leute fragen, wie es gemacht wird. Es ist wirklich nichts Besonderes. Der Code sucht nur nach der vorherrschenden Farbe im Symbol. (Und da visuelle Designer für diese Art von Dingen ein Problem sind, werden Schwarz, Weiß und Graustufen für die Zwecke dieser Berechnung nicht als "Farben" betrachtet.)


Mit dieser Antwort war ich jedoch nicht wirklich zufrieden, da sie nicht erklärt, wie die "vorherrschende" Farbe berechnet wird. Auf dem SQL Management Studio-Symbol ist die vorherrschende Farbe, zumindest für meine Augen, gelb. Das Highlight ist jedoch grün. Ich möchte speziell wissen, was der Algorithmus ist.

derTiman
quelle
An average colour value from the entire icon, otherwise you would get brown all the time.Das ergibt keinen Sinn. Wie würden sich beispielsweise die Symbole für Skype , Eingabeaufforderung oder µTorrent im Durchschnitt zu braun entwickeln? ಠ_ ఠ (Als ich das letzte Mal einen der Farbberechnungsalgorithmen von Windows rückentwickelt habe, hat es einige Jahre gedauert, bis ich ihn herausgefunden habe. Es sieht so aus, als würde ich ihn vielleicht hacken.) eines irgendwann.)
Synetech
@Synetech Sie haben Recht - ich dachte nur an die große Auswahl an verfügbaren Symbolen und viele von ihnen, die mehrere Farben enthalten. Das Chrome-Symbol oder das IIS-Symbol enthält beispielsweise Rot, Grün, Gelb und Blau bzw. Grün, Gelb und Blau. Ich dachte mir träge, dass dies eine dunkelbraune Farbe sein würde, aber Sie haben Recht, dass dies nicht für viele mehr oder weniger einfarbige Symbole gilt.
theyetiman
Der ONT-Beitrag enthält einen Kommentar, der auf eine Frage zur Chrome-Version dieses Artikels verweist , und die verlinkte Seite erläutert dies anhand des Chrome-Quellcodes. Die Erklärung (zumindest dafür) ist nicht gerade ein einfacher Algorithmus.
Synetech
@Synetech nice find - jetzt kommen wir weiter. Das entspricht genau dem, wonach ich gesucht habe. Nun, wenn wir nur den Win7-Quellcode bekommen könnten ...;)
haben den
Ich vermute, aber alle Pixel befinden sich im dreidimensionalen Raum (1 Wert für jede Farbe). Teilen Sie sie in Gruppen / Würfel von zum Beispiel 10x10x10 auf, damit die Farbe RGB (12,56,97) in die Gruppe / Würfel (10-20,50-60,90-100) kommt. Wenn Sie die Pixel auf diese Gruppen aufteilen, behalten Sie den Überblick, welche die größte ist. Schließlich bestimmen Sie die vorherrschende Farbe, indem Sie den Durchschnitt der Gruppe mit den meisten Pixeln bilden. Die Gruppengröße ist dann ein Kompromiss zwischen Leistung und Genauigkeit.
mxt3

Antworten:

14

Von Willkommen auf dem Windows 7-Desktop in genau 35 Minuten in:

Es ist ein normalisiertes Farbhistogramm über 27 verschiedene Bereiche, und wir extrahieren Schwarz, Weiß, Alphakanäle und Grautöne und verwenden den dominantesten RGBV-Wert ...

Ich bin mir ziemlich sicher, dass der Sprecher "RGB" sagen wollte, da "RGBV" keine Sache zu sein scheint. Der "normalisierte" Teil spielt eigentlich keine Rolle; Es zählt effektiv, wie viele Pixel in jeden "Eimer" fallen. Jedes Pixel wird daher in einen der 27 Buckets (angeordnet in einem dreidimensionalen Array; die Kubikwurzel von 27 ist 3) basierend auf der Position jedes Werts seiner Kanäle gelegt. Windows bestimmt für jeden Farbkanal, ob die Intensität dieser Farbe im unteren, mittleren oder oberen Bereich des Bereichs liegt. Es scheint, dass die Bereiche zwischen 0 und 60, zwischen 60 und 200 und zwischen 255 liegen. Vollständig transparente Pixel sind überhaupt nicht enthalten.

Windows findet dann, welcher Bucket die meisten Pixel hat, wobei der schwarze, der weiße und der graue Bucket ignoriert werden (die Buckets, in denen sich alle drei Kanäle im selben Drittel des Bereichs befanden). Das erklärt das SQL Server Management Studio-Symbol - vieles, was uns gelb erscheint, wird tatsächlich in den "weißen" Eimer geworfen und ignoriert.

Wenn sich in keinem der zulässigen Bereiche Pixel befinden, erhält das Programm unabhängig vom Systemfarbschema eine hellblaue Überlagerung. (Siehe Eingabeaufforderung.) Wenn ein Programm kein Symbol hat, wird eine weiß / durchscheinende Überlagerung angezeigt, obwohl das Windows-Standardsymbol andernfalls eine blaue oder grüne Überlagerung erzeugen würde.

Es gibt nichts, was mehrere Programme daran hindert, dieselbe Markierungsfarbe zu haben. Das neueste Chrome-Symbol wird beispielsweise genauso gelb wie der Windows 8-Explorer.

Wenn es Bindungen gibt, gibt es eine vorgegebene Reihenfolge, die nicht von der Reihenfolge der Farben im Bild abhängt. Dies ist wahrscheinlich nur eine Folge der Art und Weise, wie das Maximum gefunden wird - Eimer, die früher überprüft wurden, bleiben weiterhin das Maximum, selbst wenn ein späterer bindet. Es scheint, dass Gelb einer der ersten überprüften Eimer ist.

Sobald der Gewinner gefunden wurde, scheint die Hervorhebungsfarbe auf eine Farbe in der Mitte des Bereichs des Eimers eingestellt zu sein.

Testfälle (Zahlen sind RGB-Werte):

helles Gelb(255, 247, 209) → Standardmarkierung
rot 47(47, 0, 0) → Standardmarkierung
rot 60(60, 0, 0) → Dunkelrot
rot 66(66, 0, 0) → Dunkelrot
Dunkelrot(165, 0, 0) → Rot
grau 128( 128, 128, 128) → Standardmarkierung
Hälften(0, 148, 255) und (255, 0, 0) → Rot
mehr halfs(0, 255, 0) und (255, 216, 0) mit gleichem Bereich → Gelb
gleich umgekehrtgleich, aber gespiegelt → Gelb
weiß rot 180(255, 180, 180) → Hellrot
weiß rot 210(255, 210, 210) → Standard-Hervorhebung
ViertelReines Blau, Reines Gelb, Reines Rot und Reines Grün mit derselben Fläche → Gelb
weiß rot 61(255, 61, 61) → Rot
rot 82(82, 0, 0) → dunkelrot

Ben N
quelle
Dies ist die bisher köstlichste Antwort. Vielen Dank. Es erklärt alles, womit ich Probleme hatte und geht auch in die Tiefe. Bravo.
Theyetiman
@Ben NIch weiß, das sieht nach einer blöden Frage aus, aber immer noch. Warum 27 Eimer? Ich weiß, dass es 3 ^ 3 ist, und ich denke, die ersten 3 sind die Farben R, G und B, aber wofür steht die zweite 3?
Aexl
@TheSexiestManinJamaica Ich denke, es ist nur willkürlich; Vielleicht mochte Microsoft die Eleganz von 3 ^ 3. Es ist eine gute Balance zwischen sehr wenigen möglichen Farben (3 ^ 2 ist nur 9) und vielen möglichen Farben (3 ^ 4 ist 81).
Ben N
0

Ich würde sagen, dass Sie für jede Farbe, beginnend von oben, die R-, G- und B-Werte erhalten und von diesen den höchsten und niedrigsten der drei Werte nehmen und vergleichen. Die Farbe mit der größten Lücke zwischen der höchsten und der niedrigsten Farbe ist die hellste Farbe im Bild. Im Fall des Chrome-Symbols gibt es möglicherweise mehrere Farben für die größte Lücke, aber das Rot befindet sich oben, sodass es zuerst angetroffen wird. Daher dominiert dies für dieses Bild. (Ich nehme an, Sie können dies testen, indem Sie Ihr eigenes Symbol entwerfen, z. B. das Chrome-Logo um 120 Grad drehen und prüfen, ob stattdessen das Grün oder Gelb dominiert.)

Darrel Hoffman
quelle
0

So wie ich es verstehe - Das Betriebssystem berücksichtigt nicht nur einige Faktoren bei der Bestimmung der Farbe.

  1. Wurde dieser Anwendung vom Betriebssystem bereits eine Farbe zugewiesen? Wenn ja, fahren Sie mit 7 fort.
  2. Ist diese Farbe im Programmcode definiert? Verwenden Sie in diesem Fall die vordefinierte Farbe aus dem Programm. (Ja, es gibt eine Variableneinstellung für Windows-Programme, die dies steuert. Nein, ich kenne den genauen Variablennamen nicht.)
  3. Wenn 1 = false (dh keine vordefinierte Farbe), definieren Sie die dominante Farbe des verwendeten Symbols. (Dabei werden die Farben Schwarz, Weiß und Grau ignoriert)
  4. Wenn 2 keine einzige Farbe definieren kann, die verwendet wird und dominanter als die anderen Farben ist, definieren Sie den durchschnittlichen RBG-Wert des Symbols. Wird eine definierte Farbe erreicht, verwenden Sie diese. Zu diesem Zweck werden die Farben Weiß, Schwarz, Grau und Braun vollständig ignoriert.
  5. Wenn 3 zu einer der Farben der schwarzen Liste führt (Schwarzweiß oder Grau), weisen Sie nach dem Zufallsprinzip eine Farbe zu, die dem durchschnittlichen RBG-Wert am nächsten kommt, ohne die Farben der schwarzen Liste zu beeinträchtigen.
  6. Speichern Sie nach erfolgreicher Zuweisung der Farbe die Farbinformationen in der Registrierung, um sie später schneller zuweisen zu können.
  7. Wenn die zugewiesene Farbe mit einer Farbe übereinstimmt, die bereits von einer anderen derzeit geöffneten Anwendung verwendet wird, versetzen Sie die Farbe um einen zufälligen Farbtonbetrag innerhalb von 15% der zugewiesenen Farbe.
  8. Anzeigefarbe.

Dies kann sehr gut falsch sein und ist meistens eine Spekulation, aber dies gibt Ihnen eine leicht verständliche Methode, die das Betriebssystem sehr gut verwenden könnte, um die Farben zu bestimmen. Außerdem wird erläutert, wie ein Programm ohne vordefinierte Farbe und ein Symbol mit gleichen Farbmengen nicht weiß / braun / schwarz zugewiesen wird und warum Schwarz, Weiß und Grau niemals zugewiesen werden. Außerdem sollten Sie beachten, dass Programme, die kein Icon haben (es gibt noch welche), eine transparente Hot-Tracking-Farbe aufweisen, wodurch das Icon einfach "heller" wird, wenn Sie den Mauszeiger darüber halten.

Josh Raymond
quelle
Es gibt keine Möglichkeit für Anwendungen, ihre eigene Farbe zu definieren. Es scheint auch keine Regel gegen zwei Programme mit der gleichen Farbe zu geben. Interessante Ideen.
Ben N
-2

Hier ist ein VB-Code, der die RGB-Farben eines Bildes mittelt:

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

Es ist nicht wirklich für die Verwendung in einem Betriebssystem optimiert, aber es sollte Ihnen eine grundlegende Idee geben - Source


quelle
3
Er hat bereits erklärt, dass es sich nicht um einen einfachen Durchschnitt handelt. Führen Sie das Chrome-Symbol durch den Code und Sie werden es selbst sehen.
Synetech