¿Cómo calcula Windows 7 el color que se utilizará para la barra de tareas "seguimiento de color"?

20

Esto me ha intrigado durante bastante tiempo.

¿Alguien sabe el algoritmo que utiliza Windows 7 Aero para determinar el color que se utilizará como el resaltado de desplazamiento rápido en los botones de la barra de tareas para las aplicaciones que se ejecutan actualmente?

Colores de desplazamiento de la barra de tareas de Windows 7

Definitivamente se basa en el ícono de la aplicación, pero no puedo ver un patrón específico de dónde está obteniendo el valor de color.

Que no parece ser algo de lo siguiente:

  1. Un valor de color promedio de todo el ícono, de lo contrario, se volvería marrón todo el tiempo con íconos multicolores como Chrome.
  2. El color que más se usa en la imagen, de lo contrario, obtendría amarillo para el ícono de SQL Server Management Studio (sexto desde la izquierda). Además, el icono de Chrome utilizaba rojo, verde y amarillo en igual medida.
  3. Un color ubicado en ciertas coordenadas de píxeles dentro del icono, porque Chrome es rojo, lo que indica la parte superior del icono, y Notepad ++ (segundo desde la derecha) es verde, lo que indica la parte inferior del icono.

Hice esta pregunta en ux.stackoverflow.com y se cerró como fuera de tema, pero alguien respondió con lo siguiente:


Como lo describe Raymond Chen en este artículo del blog de MSDN :

Algunas personas preguntan cómo se hace. Realmente no es nada especial. El código solo busca el color predominante en el icono. (Y, dado que los diseñadores visuales son fanáticos de este tipo de cosas, el negro, el blanco y los tonos de gris no se consideran "colores" a los efectos de este cálculo).


Sin embargo, no estaba realmente satisfecho con esa respuesta porque no explica cómo se calcula el color "predominante". Seguramente en el icono de SQL Management Studio, el color predominante, al menos para mis ojos, es el amarillo. Sin embargo, lo más destacado es el verde. Quiero saber, específicamente, cuál es el algoritmo.

Theyetiman
fuente
An average colour value from the entire icon, otherwise you would get brown all the time.Eso no tiene sentido. Por ejemplo, ¿cómo los iconos de Skype , símbolo del sistema o µTorrent promedian a marrón? ಠ_ ఠ (La última vez que realicé ingeniería inversa de uno de los algoritmos de cálculo de color de Windows, me tomó varios años de atención intermitente y muchos tipos diferentes de trabajo para finalmente resolverlo. Parece que podría terminar pirateando esto uno en algún momento.)
Synetech
@Synetech tienes razón: estaba pensando en la amplia gama de iconos disponibles y en muchos de ellos que contienen varios colores. Por ejemplo, el icono de Chrome o el icono de IIS contiene rojo, verde, amarillo y azul y verde, amarillo y azul, respectivamente. Perezosamente pensé que estos tendrían un color marrón oscuro, pero tienes razón en que no se aplica a muchos iconos monocromos más o menos.
theyetiman
La publicación de ONT tiene un comentario que vincula a una pregunta sobre la versión de Chrome de esto y la página vinculada lo explica al examinar el código fuente de Chrome. La explicación (al menos para eso) no es exactamente un algoritmo simple.
Synetech
@Synetech buen hallazgo, ahora estamos llegando a alguna parte. Esto está en la línea de lo que estaba buscando. Ahora, si tan solo pudiéramos obtener el código fuente de Win7 ...;)
theyetiman
Supongo que todos los píxeles están en un espacio tridimensional (1 valor para cada color). Divídalos en grupos / cubos de, por ejemplo, 10x10x10, de modo que el color RGB (12,56,97) quede en el grupo / cubo (10-20,50-60,90-100). Al dividir los píxeles sobre estos grupos, realiza un seguimiento de cuál es el más grande. Finalmente, determina el color predominante promediando el grupo con más píxeles. El tamaño de los grupos es entonces un intercambio de rendimiento / precisión.
mxt3

Respuestas:

14

Desde Bienvenido al escritorio de Windows 7 a exactamente 35 minutos en:

Es un histograma de color normalizado en 27 cubos diferentes, y extraemos negros, blancos, canales alfa y grises, y utilizamos el valor RGBV [sic] más dominante ...

Estoy bastante seguro de que el hablante quería decir "RGB", ya que "RGBV" no parece ser una cosa. La parte "normalizada" realmente no importa; efectivamente cuenta cuántos píxeles caen en cada "cubo". Cada píxel, por lo tanto, se coloca en uno de los 27 cubos (dispuestos en una matriz tridimensional; la raíz cúbica de 27 es 3) en función de la posición del valor de cada uno de sus canales. Windows determina para cada canal de color si la intensidad de ese color se encuentra en la parte inferior, media o superior del rango. Parece que los rangos son de aproximadamente 0-60, 60-200 y 200-255. Los píxeles completamente transparentes no están incluidos en absoluto.

A continuación, Windows encuentra qué segmento tiene la mayor cantidad de píxeles, ignorando los negros, blancos y grises (los depósitos donde los tres canales estaban en el mismo tercio del rango). Eso explica el ícono de SQL Server Management Studio: gran parte de lo que nos parece amarillo en realidad se tira en el cubo "blanco" y se ignora.

Si no hay píxeles en ninguno de los depósitos aceptables, el programa obtiene una superposición azul claro independientemente del esquema de color del sistema. (Consulte el símbolo del sistema). Si un programa no tiene icono, obtiene una superposición blanca / translúcida, aunque el icono predeterminado de Windows produciría una superposición azul o verde.

No hay nada que impida que varios programas tengan el mismo color de resaltado. El último icono de Chrome, por ejemplo, obtiene el mismo amarillo que el Explorador de Windows 8.

Si hay vínculos, existe un orden predeterminado que no depende del orden de los colores en la imagen. Probablemente esto sea solo el resultado de la forma en que se encuentra el máximo: los cubos que se verifican anteriormente seguirán siendo el máximo, incluso si uno posterior se vincula. Parece que el amarillo es uno de los primeros cubos marcados.

Una vez que se descubre el cubo ganador, el color de resaltado parece establecerse en un color en algún lugar en el medio del rango del cubo.

Casos de prueba (los números provistos son valores RGB):

amarillo brillante(255, 247, 209) → resaltado predeterminado
rojo 47(47, 0, 0) → resaltado predeterminado
rojo 60(60, 0, 0) → rojo oscuro
rojo 66(66, 0, 0) → rojo oscuro
rojo oscuro(165, 0, 0) → rojo
gris 128( 128, 128, 128) → resaltado predeterminado
mitades(0, 148, 255) y (255, 0, 0) → rojo
más mitades(0, 255, 0) y (255, 216, 0) con la misma área → amarillo
mismo invertidoigual pero invertido → amarillo
blanco rojo 180(255, 180, 180) → rojo claro
blanco rojo 210(255, 210, 210) → resaltado predeterminado
cuartelesazul puro, amarillo puro, rojo puro y verde puro con la misma área → amarillo
blanco rojo 61(255, 61, 61) → rojo
rojo 82(82, 0, 0) → rojo oscuro

Ben N
fuente
Esta es la respuesta más deliciosa hasta ahora. Gracias. Explica todo lo que tuve problemas y también profundiza intensamente. Bravo.
theyetiman
@Ben NI sabe que esto parece una pregunta tonta, pero aún así. ¿Por qué 27 cubos? Sé que es 3 ^ 3, y supongo que los primeros 3 son los colores R, G y B, pero ¿qué significan los segundos 3?
aexl
@TheSexiestManinJamaica Creo que es arbitrario; quizás a Microsoft le gustó la elegancia de 3 ^ 3. Es un buen equilibrio entre que haya muy pocos colores posibles (3 ^ 2 es solo 9) y muchos colores posibles (3 ^ 4 es 81).
Ben N
0

Supongo que para cada color, comenzando desde la parte superior, obtienes los valores R, G y B, y de ellos tomas el más alto y el más bajo de los tres y los comparas. El color con el mayor espacio entre el más alto y el más bajo sería el color más brillante de la imagen. Ahora, en el caso de, digamos, el ícono de Chrome, puede haber varios colores vinculados para la mayor brecha, pero el rojo está en la parte superior, por lo que se encuentra primero, y eso es lo que domina esa imagen. (Supongo que podría probar esto diseñando su propio icono, como girar el logotipo de Chrome 120 grados y ver si domina el verde o el amarillo).

Darrel Hoffman
fuente
0

Por lo que entiendo: el sistema operativo tiene en cuenta más de unos pocos factores al determinar el color.

  1. ¿El sistema operativo ya ha asignado un color a esta aplicación? Si es así, pase al 7.
  2. ¿Está este color definido en el código del programa? Si es así, use el color predefinido del programa. (Sí, hay una configuración variable para los programas de Windows que controla esto, no, no sé el nombre exacto de la variable)
  3. si 1 = falso (es decir, sin color predefinido), defina el color dominante del icono utilizado. (Para esto, se ignoran los colores negro, blanco y gris)
  4. Si 2 no puede definir un solo color que se usa, y es más dominante que los otros colores usados, defina el valor RBG promedio del icono. Si se logra un color definido, úselo. A los efectos de esto, los colores blanco, negro, gris y marrón se ignoran por completo.
  5. Si 3 da como resultado uno de los colores de la lista negra (blanco negro o gris), asigne aleatoriamente un color que represente más de cerca el valor promedio de RBG, sin infringir los colores de la lista negra.
  6. Una vez completada la asignación exitosa del color, almacene la información del color en el registro para una asignación más rápida del color más adelante.
  7. Si el color asignado coincide con un color ya utilizado por otra aplicación actualmente abierta, compensa el color con una cantidad de tono aleatorio dentro del 15% del color asignado.
  8. Color de pantalla

Esto puede estar muy mal, y es principalmente especulación, pero le brinda un método fácil de entender que el sistema operativo podría estar usando para determinar los colores. También explica cómo un programa sin un color predefinido y un icono que usa cantidades iguales de colores no se asigna blanco / marrón / negro, y por qué nunca se asignan negro, blanco y gris. También debe tener en cuenta que los programas que no tienen un ícono (todavía hay algunos) muestran un color transparente de seguimiento activo, lo que simplemente hace que el ícono sea "más brillante" al pasar el mouse sobre él.

Josh Raymond
fuente
Las aplicaciones no tienen forma de definir su propio color. Tampoco parece haber ninguna regla contra dos programas que tienen el mismo color. Sin embargo, ideas interesantes.
Ben N
-2

Aquí hay un código VB que promedia los colores RGB de una imagen:

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

Realmente no está optimizado para su uso en un sistema operativo, pero debería darle una idea básica - Fuente


fuente
3
Él ya explicó que no es un promedio simple / básico. Ejecuta el ícono de Chrome a través del código y lo verás por ti mismo.
Synetech