Это заинтриговало меня довольно давно.
Кто-нибудь знает алгоритм, который Windows 7 Aero использует для определения цвета, который будет использоваться в качестве выделения при наведении курсора на горячие кнопки на кнопках панели задач для работающих в данный момент приложений?
Это определенно основано на значке приложения, но я не могу видеть определенный образец того, откуда он получает значение цвета.
Похоже, что это не одно из следующих:
- Среднее значение цвета для всей иконки, в противном случае вы бы
все времястановились коричневыми с разноцветными значками, такими как Chrome. - В изображении используется больше всего цвета, в противном случае вы получите желтый значок SQL Server Management Studio (6-й слева). Кроме того, значок Chrome использовал красный, зеленый и желтый в равной степени.
- Цвет, расположенный в определенных пиксельных координатах на значке, потому что 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, потребовалось несколько лет внимания и много разных видов работы, чтобы наконец понять это. Похоже, что я могу в итоге взломать это один в какой-то момент.)Ответы:
От Добро пожаловать на рабочий стол Windows 7 ровно за 35 минут:
Я вполне уверен, что спикер хотел сказать «RGB», поскольку «RGBV», кажется, не вещь. «Нормализованная» часть на самом деле не имеет значения; он эффективно подсчитывает, сколько пикселей попадает в каждое «ведро». Поэтому каждый пиксель помещается в одно из 27 сегментов (расположенных в трехмерном массиве; корень куба из 27 равен 3) в зависимости от положения каждого из его каналов. Windows определяет для каждого цветового канала, находится ли интенсивность этого цвета в нижней, средней или верхней части диапазона. Похоже, что диапазоны составляют около 0-60, 60-200 и 200-255. Полностью прозрачные пиксели вообще не включены.
Затем Windows находит, какой сегмент имеет наибольшее количество пикселей, игнорируя черный, белый и серый (сегменты, где все три канала находились в одной трети диапазона). Это объясняет значок SQL Server Management Studio - большая часть того, что нам кажется желтым, на самом деле сбрасывается в «белое» поле и игнорируется.
Если ни в одном из допустимых сегментов нет пикселей, программа получает светло-синее наложение независимо от цветовой схемы системы. (См. Командную строку.) Если у программы нет значка, она получает белое / полупрозрачное наложение, даже если значок Windows по умолчанию в противном случае приведет к наложению синего или зеленого цвета.
Ничто не мешает нескольким программам иметь одинаковый цвет подсветки. Например, новейшая иконка Chrome становится такой же желтой, как проводник Windows 8.
Если есть связи, существует заранее определенный порядок, который не зависит от порядка цветов в изображении. Вероятно, это всего лишь результат определения максимума - проверенные ранее сегменты будут оставаться максимальными, даже если последующее связывается. Похоже, что желтый - одно из первых проверенных ведер.
Как только выигрышное ведро обнаружено, цвет выделения, кажется, устанавливается на цвет где-то в середине диапазона ведра.
Тестовые случаи (предоставленные значения являются значениями RGB):
(255, 247, 209) → выделение по умолчанию
(47, 0, 0) → выделение по умолчанию
(60, 0, 0) → темно-красный
(66, 0, 0) → темно-красный
(165, 0, 0) → красный
( 128, 128, 128) → выделение по умолчанию
(0, 148, 255) и (255, 0, 0) → красный
(0, 255, 0) и (255, 216, 0) с той же областью → желтый
такой же, но перевернутый → желтый
(255, 180, 180) → светло-красный
(255, 210, 210) → выделение по умолчанию:
чисто-синий, чисто-желтый, чисто-красный и чисто-зеленый с той же площадью → желтый
(255, 61, 61) → красный
(82, 0, 0) → темно-красный
источник
Я предполагаю, что для каждого цвета, начиная сверху, вы получаете значения R, G и B, а из них вы берете самое высокое и самое низкое из трех и сравниваете их. Цвет с наибольшим зазором между самым высоким и самым низким будет самым ярким цветом на изображении. Теперь в случае, скажем, значка Chrome, может быть несколько цветов, связанных для наибольшего промежутка, но красный сверху, поэтому он встречается первым, и поэтому это то, что доминирует для этого изображения. (Я полагаю, вы можете проверить это, разработав собственную иконку, например, повернуть логотип Chrome на 120 градусов и посмотреть, доминирует ли зеленый или желтый вместо этого.)
источник
Насколько я понимаю - ОС принимает во внимание более чем несколько факторов при определении цвета.
Вполне возможно, что это неправильно, и в основном это спекуляция, но это дает вам простой для понимания метод, который ОС вполне может использовать для определения цветов. Также объясняется, как программе без предопределенного цвета и значку, использующему равное количество цветов, не назначается белый / коричневый / черный, и почему черный, белый и серый никогда не назначаются. Также вы должны отметить, что программы, у которых нет иконки (есть еще некоторые), показывают прозрачный цвет горячего отслеживания, который просто делает иконку «ярче» при наведении курсора.
источник
Вот некоторый код VB, который усредняет цвета RGB изображения:
Он не оптимизирован для использования в ОС, но должен дать вам основную идею - Source
источник