W jaki sposób system Windows 7 oblicza kolor, który ma być użyty do „śledzenia kolorów” na pasku zadań?

20

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?

Pasek zadań Windows 7 naświetla kolory

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:

  1. Średnia wartość koloru z całej ikony, w przeciwnym razie cały czas stałbyś się brązowy z wielobarwnymi ikonami, takimi jak Chrome.
  2. 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.
  3. 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.

Eteriman
źródło
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.)
Synetech
@ Synetech masz rację - myślałem właśnie o szerokiej gamie dostępnych ikon i wielu z nich, które zawierają wiele kolorów. Na przykład ikona Chrome lub ikona IIS zawiera odpowiednio czerwony, zielony żółty i niebieski oraz zielony, żółty i niebieski. Leniwie doszedłem do wniosku, że będą one średnio ciemne, brązowe, ale masz rację, że nie dotyczy to wielu mniej lub bardziej monochromatycznych ikon.
theyetiman
W poście ONT znajduje się komentarz, który prowadzi do pytania o wersję tego Chrome, a link do strony wyjaśnia to, analizując kod źródłowy Chrome. Wyjaśnienie (przynajmniej dla tego) nie jest do końca prostym algorytmem.
Synetech,
@Synetech fajne znalezisko - teraz gdzieś się znajdujemy. Jest to zgodne z tym, czego szukałem. Teraz, gdybyśmy tylko mogli uzyskać kod źródłowy Win7 ...;)
pracują
Zgaduję, ale wszystkie piksele znajdują się w trójwymiarowej przestrzeni (1 wartość dla każdego koloru). Podziel je na grupy / kostki, na przykład 10x10x10, aby kolor RGB (12,56,97) dostał się do grupy / kostki (10-20,50-60,90-100). Dzieląc piksele na te grupy, śledzisz, który z nich jest największy. Na koniec określasz dominujący kolor, uśredniając grupę z największą liczbą pikseli. Wielkość grup jest więc kompromisem wydajności / dokładności.
mxt3

Odpowiedzi:

14

Z Witaj na pulpicie Windows 7 dokładnie w 35 minut w:

Jest to znormalizowany histogram kolorów dla 27 różnych segmentów. Wydobywamy czerń, biel, kanały alfa i szarości i używamy najbardziej dominującej wartości RGBV [sic] ...

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):

jasny żółty(255, 247, 209) → domyślne podświetlenie
czerwony 47(47, 0, 0) → domyślne podświetlenie
czerwony 60(60, 0, 0) → ciemnoczerwony
czerwony 66(66, 0, 0) → ciemnoczerwony
ciemno czerwony(165, 0, 0) → czerwony
szary 128( 128, 128, 128) → domyślne podświetlenie
połówki(0, 148, 255) i (255, 0, 0) → czerwony
więcej połówek(0, 255, 0) i (255, 216, 0) z tym samym obszarem → żółty
to samo odwróconesam ale odwrócony → żółty
biało czerwony 180(255, 180, 180) → jasnoczerwony
biało czerwony 210(255, 210, 210) → domyślne wyróżnienie
mieszkanieczysty niebieski, czysty żółty, czysty czerwony i czysty zielony z tym samym obszarem → żółty
biało czerwony 61(255, 61, 61) → czerwony
czerwony 82(82, 0, 0) → ciemnoczerwony

Ben N.
źródło
To jak dotąd najsmaczniejsza odpowiedź. Dziękuję Ci. Wyjaśnia wszystko, z czym miałem problemy, a także idzie w głęboką głębię. Brawo.
theyetiman
@Ben NI wiem, że to wygląda na głupie pytanie, ale nadal. Dlaczego 27 wiader? Wiem, że to 3 ^ 3 i myślę, że pierwsze 3 to kolory R, ​​G i B, ale co oznacza druga 3?
aexl
@TheSexiestManinJamaica Myślę, że to tylko arbitralne; może Microsoft lubił elegancję 3 ^ 3. Jest to dobra równowaga między tym, że jest bardzo mało możliwych kolorów (3 ^ 2 to tylko 9) i dużą ilością możliwych kolorów (3 ^ 4 to 81).
Ben N
0

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).

Darrel Hoffman
źródło
0

Z tego, co rozumiem - system operacyjny bierze pod uwagę więcej niż kilka czynników przy określaniu koloru.

  1. Czy system operacyjny ma już przypisany kolor do tej aplikacji? Jeśli tak, przejdź do 7.
  2. Czy ten kolor jest zdefiniowany w kodzie programu? Jeśli tak, użyj predefiniowanego koloru z programu. (Tak, istnieje zmienne ustawienie dla programów Windows, które to kontroluje, nie, nie znam dokładnej nazwy zmiennej)
  3. jeśli 1 = fałsz (co oznacza brak predefiniowanego koloru), zdefiniuj dominujący kolor użytej ikony. (W tym celu kolory Czarny, biały i szary są ignorowane)
  4. Jeśli 2 nie może zdefiniować jednego używanego koloru, który jest bardziej dominujący niż inne użyte kolory, zdefiniuj średnią wartość RBG ikony. Jeśli zostanie osiągnięty określony kolor, użyj tego. W tym celu kolory Biały, Czarny, Szary i Brązowy są całkowicie ignorowane.
  5. Jeśli 3 spowoduje jeden z czarnych kolorów (czarny biały lub szary), losowo przypisz kolor, który najbardziej odpowiada średniej wartości RBG, bez naruszania kolorów czarnej listy.
  6. Po pomyślnym przypisaniu koloru zapisz informacje o kolorze w rejestrze, aby później szybciej przypisać kolor.
  7. Jeśli przypisany kolor odpowiada kolorowi już używanemu przez aktualnie otwartą inną aplikację, należy przesunąć kolor losowo o odcień w granicach 15% przypisanego koloru.
  8. Kolor wyświetlacza

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ą.

Josh Raymond
źródło
Aplikacje nie mogą zdefiniować własnego koloru. Wydaje się również, że nie ma żadnej reguły przeciwko dwóm programom o tym samym kolorze. Jednak ciekawe pomysły.
Ben N
-2

Oto kod VB, który uśrednia kolory RGB obrazu:

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

Nie jest tak naprawdę zoptymalizowany do użycia w systemie operacyjnym, ale powinien dać ci podstawowy pomysł - źródło


źródło
3
Wyjaśnił już, że nie jest to prosta / podstawowa średnia. Uruchom ikonę Chrome w kodzie, a zobaczysz to na własne oczy.
Synetech