Zaintrygowało mnie to od dłuższego czasu.
Czy ktoś zna algorytm, którego używa Windows 7 Aero do określania koloru, który ma być podświetleniem aktywowanym na gorąco na przyciskach paska zadań w aktualnie uruchomionych aplikacjach?
Jest to zdecydowanie oparte na ikonie aplikacji, ale nie widzę konkretnego wzoru, z którego pochodzi wartość koloru.
Wydaje się, że nie jest to żaden z poniższych:
- Średnia wartość koloru z całej ikony, w przeciwnym razie
cały czasstałbyś się brązowy z wielobarwnymi ikonami, takimi jak Chrome. - Kolor najczęściej używany w obrazie, w przeciwnym razie uzyskasz żółty kolor dla ikony SQL Server Management Studio (6. od lewej). Ikona Chrome używała w równym stopniu czerwonego, zielonego i żółtego.
- Kolor znajduje się na niektórych współrzędnych piksela w ikonie, ponieważ Chrome jest czerwony - co wskazuje na górę ikony - a Notepad ++ (drugi od prawej) jest zielony - co wskazuje na dół ikony.
Zadałem to pytanie na stronie ux.stackoverflow.com i zostało ono zamknięte jako nie na temat, ale ktoś odpowiedział następująco:
Jak opisał Raymond Chen w tym artykule na blogu MSDN :
Niektórzy pytają, jak to się robi. To naprawdę nic specjalnego. Kod po prostu szuka dominującego koloru na ikonie. (A ponieważ projektanci wizualni są trupami dla tego rodzaju rzeczy, czarny, biały i odcienie szarości nie są uważane za „kolory” do celów tego obliczenia.)
Jednak nie byłem zadowolony z tej odpowiedzi, ponieważ nie wyjaśnia ona, w jaki sposób obliczany jest „dominujący” kolor. Z pewnością na ikonie SQL Management Studio dominującym kolorem, przynajmniej dla mnie, jest żółty. Najważniejsze jest jednak zielone. Chcę wiedzieć, w szczególności, jaki jest algorytm.
An average colour value from the entire icon, otherwise you would get brown all the time.
To nie ma sensu. Na przykład, w jaki sposób ikony Skype'a , wiersza polecenia lub µTorrent zmieniają się w brązowe? ಠ_ ఠ (Ostatnim razem, kiedy po raz ostatni przeprojektowałem jeden z algorytmów obliczania kolorów w systemie Windows, zajęło mi to kilka lat uwagi i wielu różnych prac, aby w końcu to rozgryźć. Wygląda na to, że w końcu mogę to zhakować jeden w pewnym momencie.)Odpowiedzi:
Z Witaj na pulpicie Windows 7 dokładnie w 35 minut w:
Jestem całkiem pewien, że mówca chciał powiedzieć „RGB”, ponieważ „RGBV” nie wydaje się niczym. Część „znormalizowana” nie ma tak naprawdę znaczenia; skutecznie liczy, ile pikseli przypada na każde „wiadro”. Dlatego każdy piksel jest umieszczany w jednym z 27 segmentów (ułożonych w trójwymiarowym układzie; pierwiastek sześcianu z 27 wynosi 3) w zależności od położenia wartości każdego z kanałów. System Windows określa dla każdego kanału kolorów, czy intensywność tego koloru mieści się w dolnej, środkowej czy górnej części zakresu. Wydaje się, że zakresy wynoszą około 0–60, 60–200 i 200–255. Całkowicie przezroczyste piksele w ogóle nie są uwzględniane.
Następnie system Windows wyszukuje, który segment ma najwięcej pikseli, ignorując czarny, biały i szary (segmenty, w których wszystkie trzy kanały znajdowały się w tej samej trzeciej części zakresu). To wyjaśnia ikonę SQL Server Management Studio - duża część tego, co wydaje się nam żółte, faktycznie zostaje zrzucona do „białego” segmentu i jest ignorowana.
Jeśli w żadnym z dopuszczalnych segmentów nie ma pikseli, program otrzymuje jasnoniebieską nakładkę niezależnie od systemowej kolorystyki. (Zobacz wiersz polecenia.) Jeśli program nie ma ikony, otrzymuje białą / półprzezroczystą nakładkę, nawet jeśli domyślna ikona systemu Windows tworzyłaby nakładkę niebieską lub zieloną.
Nic nie stoi na przeszkodzie, aby wiele programów miało ten sam kolor podświetlenia. Na przykład najnowsza ikona Chrome ma taki sam żółty kolor jak Eksplorator Windows 8.
Jeśli istnieją powiązania, istnieje z góry określona kolejność, która nie zależy od kolejności kolorów na obrazie. Jest to prawdopodobnie tylko wynik sposobu znalezienia maksimum - wiadra, które są sprawdzane wcześniej, będą nadal maksymalne, nawet jeśli później zostanie powiązane. Wygląda na to, że żółty jest jednym z pierwszych sprawdzonych wiader.
Po odkryciu zwycięskiego wiadra kolor podświetlenia wydaje się być ustawiony na kolor gdzieś pośrodku zakresu wiadra.
Przypadki testowe (podane liczby są wartością RGB):
(255, 247, 209) → domyślne podświetlenie
(47, 0, 0) → domyślne podświetlenie
(60, 0, 0) → ciemnoczerwony
(66, 0, 0) → ciemnoczerwony
(165, 0, 0) → czerwony
( 128, 128, 128) → domyślne podświetlenie
(0, 148, 255) i (255, 0, 0) → czerwony
(0, 255, 0) i (255, 216, 0) z tym samym obszarem → żółty
sam ale odwrócony → żółty
(255, 180, 180) → jasnoczerwony
(255, 210, 210) → domyślne wyróżnienie
czysty niebieski, czysty żółty, czysty czerwony i czysty zielony z tym samym obszarem → żółty
(255, 61, 61) → czerwony
(82, 0, 0) → ciemnoczerwony
źródło
Domyślam się, że dla każdego koloru, zaczynając od góry, otrzymujesz wartości R, G i B, a od nich bierzesz najwyższą i najniższą z trzech i porównujesz je. Kolor z największą przerwą między najwyższą a najniższą wartością byłby najjaśniejszym kolorem obrazu. W przypadku, powiedzmy, ikony Chrome, może być powiązanych kilka kolorów dla największej luki, ale czerwony jest na górze, więc napotyka się go jako pierwszy, a więc to właśnie dominuje w tym obrazie. (Przypuszczam, że możesz to przetestować, projektując własną ikonę, na przykład obróć logo Chrome o 120 stopni i sprawdź, czy zamiast tego dominuje zielony lub żółty).
źródło
Z tego, co rozumiem - system operacyjny bierze pod uwagę więcej niż kilka czynników przy określaniu koloru.
Może to być bardzo błędne i jest to głównie spekulacja, ale daje to łatwą do zrozumienia metodę, którą system operacyjny może z powodzeniem stosować do określania kolorów. Wyjaśnia również, w jaki sposób program bez wstępnie zdefiniowanego koloru i ikony używającej równych kolorów, nie ma przypisanego białego / brązowego / czarnego i dlaczego nigdy nie przypisano czarnego, białego i szarego. Należy również zauważyć, że programy, które nie mają ikon (niektóre są nadal), pokazują przezroczysty kolor śledzenia na gorąco, co po prostu powoduje, że ikona jest „jaśniejsza” po najechaniu myszką.
źródło
Oto kod VB, który uśrednia kolory RGB obrazu:
Nie jest tak naprawdę zoptymalizowany do użycia w systemie operacyjnym, ale powinien dać ci podstawowy pomysł - źródło
źródło