In che modo Windows 7 calcola il colore da utilizzare per la "hot-tracking" della barra delle applicazioni?


20

Questo mi ha incuriosito per un bel po 'di tempo.

Qualcuno sa che l'algoritmo utilizzato da Windows 7 Aero per determinare il colore da utilizzare come evidenziatore di hot tracking sui pulsanti della barra delle applicazioni per le app attualmente in esecuzione?

Colori al passaggio del mouse sulla barra delle applicazioni di Windows 7

È sicuramente basato sull'icona dell'app, ma non riesco a vedere uno schema specifico da dove ottenga il valore del colore.

Essa non sembra essere uno dei seguenti:

  1. Un valore medio di colore dall'intero icona, altrimenti si otterrebbe marrone per tutto il tempo con icone multicolore come Chrome.
  2. Il colore utilizzato maggiormente nell'immagine, altrimenti si otterrebbe il giallo per l'icona di SQL Server Management Studio (6 ° da sinistra). Inoltre, l'icona di Chrome ha usato rosso, verde e giallo in egual misura.
  3. Un colore situato a determinate coordinate pixel all'interno dell'icona, perché Chrome è rosso - indica la parte superiore dell'icona - e Notepad ++ (2 ° da destra) è verde - indica la parte inferiore dell'icona.

Ho fatto questa domanda su ux.stackoverflow.com ed è stata chiusa come off-topic, ma qualcuno ha risposto con il seguente:


Come descritto da Raymond Chen in questo articolo del blog MSDN :

Alcune persone chiedono come sia fatto. Non è davvero niente di speciale. Il codice cerca solo il colore predominante nell'icona. (E poiché i visual designer sono pignoli per questo genere di cose, il nero, il bianco e le sfumature di grigio non sono considerati "colori" ai fini di questo calcolo.)


Tuttavia non ero davvero soddisfatto di quella risposta perché non spiega come viene calcolato il colore "predominante". Sicuramente sull'icona di SQL Management Studio, il colore predominante, almeno ai miei occhi, è il giallo. Tuttavia il momento clou è verde. Voglio sapere, in particolare, qual è l'algoritmo.


An average colour value from the entire icon, otherwise you would get brown all the time.Non ha senso. Ad esempio, in che modo le icone di Skype , prompt dei comandi o µTorrent diventano in marrone? ಠ_ ఠ (L'ultima volta che ho retroingegnerizzato uno degli algoritmi di calcolo del colore di Windows, ci sono voluti diversi anni di attenzione on e off e molti tipi diversi di lavoro per capirlo finalmente. Sembra che potrei finire per hackerare questo uno ad un certo punto.)
Synetech,

@Synetech hai ragione: stavo solo pensando alla vasta gamma di icone disponibili e molte che contengono più colori. Ad esempio, l'icona di Chrome o l'icona di IIS contiene rispettivamente rosso, verde giallo e blu e verde, giallo e blu. Ho immaginato pigramente che questi sarebbero in media a un colore marrone scuro, ma hai ragione che non si applica a molte icone monocromatiche più o meno.
theyetiman,

Il post ONT ha un commento che rimanda a una domanda sulla versione di Chrome di questo e la pagina collegata lo spiega esaminando il codice sorgente di Chrome. La spiegazione (almeno per quello) non è esattamente un semplice algoritmo.
Synetech,

@Synetech bella scoperta - ora stiamo arrivando da qualche parte. Questo è in linea con quello che stavo cercando. Ora, se solo potessimo ottenere il codice sorgente di Win7 ...;)
theyetiman il

Suppongo che tutti i pixel siano nello spazio tridimensionale (1 valore per ogni colore). Dividili in gruppi / cubi, ad esempio 10x10x10, in modo che il colore RGB (12,56,97) venga inserito nel gruppo / cubo (10-20,50-60,90-100). Quando si dividono i pixel su questi gruppi, si tiene traccia di quale è il più grande. Infine, si determina il colore predominante calcolando la media del gruppo con il maggior numero di pixel. La dimensione dei gruppi è quindi uno scambio di prestazioni / precisione.
mxt3,

Risposte:


14

Da Benvenuti sul desktop di Windows 7 esattamente 35 minuti in:

È un istogramma di colore normalizzato su 27 secchi diversi, estraiamo neri, bianchi, canali alfa e grigi e utilizziamo il valore RGBV [sic] più dominante ...

Sono abbastanza certo che l'altoparlante intendesse dire "RGB", dal momento che "RGBV" non sembra essere una cosa. La parte "normalizzata" non ha molta importanza; sta effettivamente contando quanti pixel cadono in ciascun "secchio". Ogni pixel, quindi, viene inserito in uno dei 27 bucket (disposti in una matrice tridimensionale; la radice del cubo di 27 è 3) in base alla posizione di ciascuno dei valori dei suoi canali. Windows determina per ciascun canale di colore se l'intensità di quel colore è nella parte inferiore, centrale o superiore dell'intervallo. Sembrerebbe che gli intervalli siano circa 0-60, 60-200 e 200-255. I pixel completamente trasparenti non sono inclusi affatto.

Windows trova quindi quale bucket ha il maggior numero di pixel, ignorando quelli neri, bianchi e grigi (i bucket in cui tutti e tre i canali erano nello stesso terzo dell'intervallo). Ciò spiega l'icona di SQL Server Management Studio: gran parte di ciò che ci appare giallo viene effettivamente scaricato nel bucket "bianco" e viene ignorato.

Se non ci sono pixel in nessuno dei bucket accettabili, il programma ottiene una sovrapposizione di azzurro a prescindere dalla combinazione di colori del sistema. (Vedi il prompt dei comandi.) Se un programma non ha un'icona, ottiene una sovrapposizione bianca / traslucida anche se l'icona predefinita di Windows produrrebbe altrimenti una sovrapposizione blu o verde.

Non c'è nulla che impedisca a più programmi di avere lo stesso colore di evidenziazione. L'icona di Chrome più recente, ad esempio, diventa gialla come Esplora risorse di Windows 8.

Se ci sono legami, c'è un ordine predeterminato che non dipende dall'ordine dei colori nell'immagine. Questo è probabilmente solo il risultato del modo in cui viene trovato il massimo: i bucket che sono stati controllati in precedenza continueranno ad essere il massimo anche se uno successivo si lega. Sembra che il giallo sia uno dei primi secchi controllati.

Una volta scoperto il secchio vincente, il colore di evidenziazione sembra essere impostato su un colore da qualche parte nel mezzo della gamma del secchio.

Casi di prova (i numeri forniti sono valori RGB):

giallo acceso(255, 247, 209) → evidenziazione predefinita
rosso 47(47, 0, 0) → evidenziazione predefinita
rosso 60(60, 0, 0) → rosso scuro
rosso 66(66, 0, 0) → rosso scuro
rosso scuro(165, 0, 0) → rosso
grigio 128( 128, 128, 128) → evidenziazione predefinita
halfs(0, 148, 255) e (255, 0, 0) → rosso
più metà(0, 255, 0) e (255, 216, 0) con la stessa area → giallo
stesso invertitouguale ma capovolto → giallo
bianco rosso 180(255, 180, 180) → rosso chiaro
bianco rosso 210(255, 210, 210) → evidenziazione predefinita
alloggioblu puro, giallo puro, rosso puro e verde puro con la stessa area → giallo
bianco rosso 61(255, 61, 61) → rosso
rosso 82(82, 0, 0) → rosso scuro


Questa è la risposta più delizia ancora. Grazie. Spiega tutto ciò di cui ho avuto problemi e va anche in profondità. Bravo.
theyetiman,

@ Ben N So che sembra una domanda stupida, ma comunque. Perché 27 secchi? So che è 3 ^ 3, e immagino che il primo 3 sia i colori R, G e B, ma che cosa rappresenta il secondo 3?
aexl

@TheSexiestManinJamaica Penso che sia solo arbitrario; forse a Microsoft è piaciuta l'eleganza di 3 ^ 3. È un buon equilibrio tra il fatto che ci sono pochissimi colori possibili (3 ^ 2 è solo 9) e molti colori possibili (3 ^ 4 è 81).
Ben N

0

La mia ipotesi sarebbe che per ogni colore, a partire dall'alto, ottieni i valori R, G e B, e da loro prendi il più alto e il più basso dei tre e confrontali. Il colore con il divario più grande tra il più alto e il più basso sarebbe il colore più luminoso nell'immagine. Ora, nel caso, diciamo, dell'icona di Chrome, potrebbero esserci diversi colori legati per il divario più grande, ma il rosso è in alto, quindi si incontra per primo, e quindi questo è ciò che domina per quell'immagine. (Suppongo che potresti provarlo progettando la tua icona, come ruotare il logo Chrome di 120 gradi e vedere se il verde o il giallo domina invece.)


0

Dal mio punto di vista, il sistema operativo prende in considerazione più di alcuni fattori nel determinare il colore.

  1. Un colore è già stato assegnato dal sistema operativo a questa applicazione? In tal caso, passa a 7.
  2. Questo colore è definito nel codice del programma? In tal caso, utilizzare il colore predefinito dal programma. (Sì, esiste un'impostazione variabile per i programmi Windows che controlla questo, no, non conosco il nome esatto della variabile)
  3. se 1 = false (senza significato colore predefinito), definire il colore dominante dell'icona utilizzata. (Per questo, i colori Nero, Bianco e Grigio vengono ignorati)
  4. Se 2 non è in grado di definire un singolo colore utilizzato e più dominante rispetto agli altri colori utilizzati, definire il valore RBG medio dell'icona. Se si ottiene un colore definito, utilizzare questo. A tale scopo, i colori Bianco, Nero, Grigio e Marrone sono completamente ignorati.
  5. Se 3 risulta in uno dei colori nella lista nera (bianco nero o grigio), assegnare in modo casuale un colore che rappresenti più da vicino il valore medio RBG, senza violare i colori della lista nera.
  6. Una volta completata correttamente l'assegnazione del colore, archiviare le informazioni sul colore nel registro per un'assegnazione più rapida dei colori in un secondo momento.
  7. Se il colore assegnato corrisponde a un colore già utilizzato da un'altra applicazione attualmente aperta, sfalsare il colore di una quantità di tonalità casuale entro il 15% del colore assegnato.
  8. Display a colori.

Questo potrebbe benissimo essere sbagliato, ed è principalmente una speculazione, ma questo ti dà un metodo di facile comprensione che il sistema operativo potrebbe benissimo usare per determinare i colori. Spiega anche come un programma senza un colore predefinito e un'icona che usa la stessa quantità di colori non viene assegnato bianco / marrone / nero e perché non vengono mai assegnati nero, bianco e grigio. Inoltre, dovresti notare che i programmi che non hanno un'icona (ce ne sono ancora alcuni) mostrano un colore di tracciamento a caldo trasparente, che semplicemente fa apparire l'icona più "luminosa" quando passa il mouse sopra.


Non esiste un modo per le applicazioni di definire il proprio colore. Inoltre, non sembra esserci alcuna regola contro due programmi dello stesso colore. Idee interessanti, comunque.
Ben N,

-2

Ecco un po 'di codice VB che calcola la media dei colori RGB di un'immagine:

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

Non è davvero ottimizzato per l'uso in un sistema operativo, ma dovrebbe darti un'idea di base - Fonte


3
Ha già spiegato che non è una media semplice / base. Esegui l'icona di Chrome attraverso il codice e lo vedrai da solo.
Synetech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.