Як Windows 7 обчислює колір, який потрібно використовувати на панелі завдань «кольоровий гарячий слід»?


20

Це мене заінтригувало досить довгий час.

Хтось знає алгоритм, який Windows 7 Aero використовує для визначення кольору, який слід використовувати як підсвічування курсору гарячого відстеження на кнопках панелі завдань для запущених додатків?

На панелі завдань Windows 7 наведіть курсор кольорів

Це, безумовно, базується на піктограмі програми, але я не бачу конкретного шаблону, звідки отримує значення кольору.

Здається, це не таке:

  1. Середнє значення кольору від усієї іконки, інакше ви б увесь час отримували коричневий колір з різнокольоровими значками, як Chrome.
  2. На зображенні найбільше використовується колір, інакше ви отримаєте жовтий колір для піктограми студії управління SQL Server (6-й зліва). Також піктограма Chrome в рівній мірі використовувала червоний, зелений та жовтий кольори.
  3. Колір, розташований у певних координатах пікселя в межах піктограми, оскільки Chrome червоний - вказує на верхню частину піктограми - а Notepad ++ (2-й справа) - зелений - позначає нижню частину піктограми.

Я задав це запитання на ux.stackoverflow.com, і він закрився як поза темою, але хтось відповів таким чином:


Як описав Реймонд Чен у цій статті блогу MSDN :

Деякі запитують, як це робиться. Це насправді нічого особливого. Код просто шукає переважаючий колір у значку. (Оскільки візуальні дизайнери є стикерами для подібних речей, чорний, білий і відтінки сірого не розглядаються як "кольори" для цілей цього розрахунку.)


Однак я не дуже задоволений цією відповіддю, оскільки це не пояснює, як розраховується "переважний" колір. Напевно на піктограмі SQL Management Studio переважаючий колір, як мені здається, жовтий. І все ж родзинка - зелена. Я хочу конкретно знати, що таке алгоритм.


An average colour value from the entire icon, otherwise you would get brown all the time.Це не має сенсу. Наприклад, як середні значки Skype , командного рядка або µTorrent мають коричневий колір? ಠ_ ఠ (Востаннє, коли я здійснив зворотну розробку одного з алгоритмів розрахунку кольорів Windows, потрібно було кілька років уваги та вимикань, і багато різних видів роботи, щоб остаточно розібратися. Схоже, я можу в кінцевому підсумку зламати це один у якийсь момент.)
Synetech

@Synetech ви маєте рацію - я просто думав про широкий спектр наявних значків і безліч їх, що містять кілька кольорів. Наприклад, значок Chrome або значок IIS містять червоний, зелений жовтий і синій та зелений, жовтий і синій відповідно. Я ліниво подумав, що це буде в середньому до темно-коричневого кольору, але ти маєш рацію, що це не стосується багатьох більш-менш монохромних іконок.
onietiman

У публікації ONT є коментар, який посилається на питання про версію цієї версії Chrome, а пов’язана сторінка пояснює це, вивчаючи вихідний код Chrome. Пояснення (як мінімум) не є простим алгоритмом.
Synetech

@Synetech приємна знахідка - тепер ми кудись потрапляємо. Це уздовж того, що я шукав. Тепер, якби тільки ми могли отримати вихідний код Win7 ...;)
onietiman

Я здогадуюсь, але всі пікселі знаходяться в тривимірному просторі (1 значення для кожного кольору). Розділіть їх на групи / кубики, наприклад, 10x10x10, так що колір RGB (12,56,97) потрапить у групу / куб (10-20,50-60,90-100). Ділячи пікселі на ці групи, ви відстежуєте, яка з них найбільша. Нарешті ви визначаєте переважаючий колір, усереднюючи групу з найбільшою кількістю пікселів. Розмір груп - це торгівля продуктивності / точності.
mxt3

Відповіді:


14

Від Ласкаво просимо до робочого столу Windows 7 рівно за 35 хвилин:

Це нормалізована гістограма кольорів у 27 різних відрах, і ми витягуємо чорношкірі, білі, альфа-канали та сірі кольори та використовуємо найбільш домінуюче значення RGBV [sic] ...

Я досить впевнений, що оратор мав намір сказати "RGB", оскільки "RGBV" - це не річ. "Нормалізована" частина насправді не має значення; це ефективно підраховувати, скільки пікселів потрапляє в кожне "відро". Кожен піксель, таким чином, розміщується в одному з 27 відер (розміщених у тривимірному масиві; корінь куба 27 - 3), виходячи з положення значення кожного з його каналів. Windows визначає для кожного кольорового каналу, чи інтенсивність цього кольору знаходиться в нижній, середній або верхній частині діапазону. Здається, діапазони становлять приблизно 0-60, 60-200 та 200-255. Повністю прозорі пікселі взагалі не включені.

Потім Windows виявляє, яке відро має найбільше пікселів, ігноруючи чорні, білі та сірі (відра, де всі три канали були в одній третині діапазону). Це пояснює піктограму студії управління SQL Server - значна частина того, що нам здається жовтим, насправді потрапляє у «біле» відро і ігнорується.

Якщо в жодному з прийнятних відер немає пікселів, програма отримує накладення світло-синього кольору незалежно від колірної гами системи. (Див. Командний рядок.) Якщо програма не має піктограми, вона отримує білу / напівпрозору накладку, навіть якщо піктограма Windows за замовчуванням інакше створює синю або зелену накладку.

Ніщо не може перешкодити декільком програмам мати однаковий колір виділення. Наприклад, найновіша піктограма Chrome набуває такий же жовтий колір, як і Провідник Windows 8.

Якщо є зв’язки, є заздалегідь визначений порядок, який не залежить від порядку кольорів на зображенні. Це, мабуть, лише результат того, як знайдеться максимум - відра, які перевіряються раніше, і надалі будуть максимумом навіть у тому випадку, якщо пізніший зв’язується. Здається, що жовте - одне з перших перевірених відер.

Як тільки виграшне відро буде виявлено, колір виділення, здається, задається кольором десь посередині діапазону відра.

Тестові випадки (надані цифри - значення RGB):

яскраво-жовтий(255, 247, 209) → підсвітка за замовчуванням
червоний 47(47, 0, 0) → підсвітка за замовчуванням
червоний 60(60, 0, 0) → темно-червона
червоний 66(66, 0, 0) → темно-червона
темно-червоний(165, 0, 0) → червона
сірий 128( 128, 128, 128) → підсвітка за замовчуванням
половинки(0, 148, 255) та (255, 0, 0) → червона
більше половинок(0, 255, 0) та (255, 216, 0) з однаковою площею → жовта
той же перевернутийоднакова, але перевернута → жовтий
білий червоний 180(255, 180, 180) → світло-червоний
білий червоний 210(255, 210, 210) → підсвічування за замовчуванням
чвертічисто-синій, чисто-жовтий, чисто-червоний та чисто-зелений з однаковою площею → жовтий
білий червоний 61(255, 61, 61) → червоний
червоний 82(82, 0, 0) → темно-червоний


Це найсмачніша відповідь поки. Дякую. Це пояснює все, з чим у мене виникли проблеми, а також йде в глибоку глибину. Браво.
onietiman

@Ben NI знаю, це виглядає як німе питання, але все ж. Чому 27 відер? Я знаю, що це 3 ^ 3, і я думаю, що перші 3 - це кольори R, G і B, але на чому позначається другий 3?
aexl

@TheSexiestManinJamaica Я думаю, що це просто довільно; можливо, Microsoft сподобалась елегантність 3 ^ 3. Приємно балансувати між тим, що існує дуже мало можливих кольорів (3 ^ 2 - це лише 9) та безлічі можливих кольорів (3 ^ 4 - 81).
Бен N

0

Я можу здогадатися, що для кожного кольору, починаючи з верху, ви отримуєте значення R, G і B, а з них ви берете найвище і нижнє з трьох і порівнюєте їх. Колір з найбільшим розривом між найвищим і найнижчим був би найяскравішим кольором у зображенні. Зараз у випадку, скажімо, піктограми Chrome, може бути кілька кольорів, пов’язаних для найбільшого розриву, але червоний знаходиться вгорі, тому він зустрічається спочатку, і, отже, саме це домінує для цього зображення. (Я припускаю, що ви можете перевірити це, створивши власну піктограму, наприклад, повернути логотип Chrome на 120 градусів і побачити, чи замість цього домінує зелений або жовтий.)


0

З того, як я це розумію - ОС визначає більше кількох факторів при визначенні кольору.

  1. Чи ОС вже призначив ОС цій програмі? Якщо так, перейдіть до 7.
  2. Чи визначений цей колір у програмному коді? Якщо так, використовуйте заздалегідь заданий колір із програми. (Так, є змінна настройка для програм Windows, яка керує цим, ні, я не знаю точної назви змінної)
  3. якщо 1 = false (означає, що немає попередньо визначеного кольору), визначте домінуючий колір використовуваної піктограми. (Для цього кольори Чорний, білий і сірий ігноруються)
  4. Якщо 2 не може визначити один колір, який використовується, і є більш домінуючим за інші кольори, визначте середнє значення значка RBG. Якщо досягнуто визначеного кольору, використовуйте це. З цією метою кольори Білий, Чорний, Сірий та Коричневий повністю ігноруються.
  5. Якщо 3 призводять до одного з чорних кольорів (Чорний білий або сірий), випадковим чином призначте колір, який найбільше відповідає середньому значенню RBG, не впливаючи на кольори чорного списку.
  6. Після успішного присвоєння кольору завершено, збережіть інформацію про колір у реєстрі для швидшого призначення кольорів пізніше.
  7. Якщо призначений колір збігається з кольором, який вже використовує інша програма, яка зараз відкрита, змістіть колір випадковим відтінком у межах 15% від призначеного кольору.
  8. Колір відображення

Це може бути неправильним, і це в основному припущення, але це дає вам зрозумілий метод, який ОС може дуже добре використовувати для визначення кольорів. Він також пояснює, як програмі без заздалегідь заданого кольору та значку, що використовує рівну кількість кольорів, не призначається білий / коричневий / чорний, і чому чорний, білий та сірий ніколи не призначаються. Також слід зауважити, що програми, які не мають Icon (ще є деякі), демонструють прозорий колір гарячого відстеження, який просто призводить до того, що піктограма стає яскравішою при наведенні на неї.


Немає способів програми визначити свій колір. Також, здається, немає жодного правила щодо двох програм, що мають однаковий колір. Хоча цікаві ідеї.
Бен N

-2

Ось код VB, який в середньому містить кольори RGB зображення:

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

Він не дуже оптимізований для використання в ОС, але він повинен дати вам основне уявлення - Джерело


3
Він уже пояснив, що це не просте / базове середнє. Запустіть піктограму Chrome через код, і ви побачите це на собі.
Synetech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.