Windows 7, görev çubuğunda “color hot-tracking” için kullanılacak rengi nasıl hesaplar?


20

Bu beni bir süredir merak etti.

Şu anda çalışan uygulamalar için görev çubuğu düğmelerinde etkin izleme vurgusu vurgulaması olarak kullanılacak rengi belirlemek için Windows 7 Aero'nun kullandığı algoritmayı bilen var mı?

Windows 7 görev çubuğu vurgulu renkleri

Kesinlikle uygulamanın simgesine dayanıyor, ancak renk değerini nereden aldığı konusunda belirli bir kalıp göremiyorum.

O değil aşağıdakilerden herhangi biri gibi görünüyor:

  1. Simgenin tamamındaki ortalama renk değeri, aksi takdirde Chrome gibi çok renkli simgelerle her zaman kahverengi olur .
  2. Resimde en çok kullanılan renk, aksi takdirde SQL Server Management Studio ikonu (soldan 6.) sarı olur. Ayrıca, Chrome simgesi eşit ölçüde kırmızı, yeşil ve sarı kullanılır.
  3. Simgenin içindeki belirli piksel koordinatlarında bulunan bir renk, çünkü Chrome kırmızıdır - simgenin üstünü gösterir - ve Notepad ++ (sağdan 2.) yeşildir - simgenin altını gösterir.

Bu soruyu ux.stackoverflow.com'da sordum ve konu dışı olarak kapatıldı, ancak biri aşağıdakilerle cevap verdi:


Raymond Chen tarafından bu MSDN blog makalesinde açıklandığı gibi :

Bazı insanlar nasıl yapıldığını soruyor. Gerçekten özel bir şey değil. Kod sadece simge içindeki baskın rengi arar . (Ve görsel tasarımcılar bu tür şeyler için yapışkansalar, siyah, beyaz ve gri tonları bu hesaplama amacıyla "renkler" olarak kabul edilmez.)


Ancak bu cevaptan gerçekten memnun değildim çünkü "baskın" rengin nasıl hesaplandığını açıklamıyor. Elbette, SQL Management Studio ikonunda, baskın renk, gözlerime en azından sarı. Oysa vurgu yeşildir. Özellikle algoritmanın ne olduğunu bilmek istiyorum.


An average colour value from the entire icon, otherwise you would get brown all the time.Bu mantıklı değil. Örneğin, Skype , komut istemi veya µTorrent simgeleri kahverenginin ortalamaları ne kadar olur ? Windows_ ఠ (En son Windows renk hesaplama algoritmalarından birini tersine tasarladığımda, birkaç yıl boyunca dikkatimi çektim ve dikkatimi çektim ve sonunda onu bulmak için birçok farklı türde çalışma yaptım. bir noktada bir.)
Synetech

@Synetech haklısınız - Ben sadece mevcut geniş simgeler yelpazesini ve çok sayıda renk içeren birçoğunu düşünüyordum. Örneğin, Chrome simgesi veya IIS simgesi sırasıyla kırmızı, yeşil, sarı ve mavi ve yeşil, sarı ve mavi içerir. Tembelce bunların bulanık kahverengi bir renge dönüşeceğini düşünmüştüm, ancak daha fazla veya daha az tek renkli ikonlar için geçerli olmadığı konusunda haklısınız.
theyetiman

ONT sonrası vardır bir yorum Chrome'un bu sürümü ve yaklaşık bir soruya bağlantılar bağlı sayfanın Chrome kaynak kodunu inceleyerek bunu açıklıyor. Açıklama (en azından bunun için) tam olarak basit bir algoritma değil.
Synetech

@Synetech nice find - şimdi bir yerlere geliyoruz. Bu aradığım şeyin sınırları boyunca. Şimdi, eğer Win7 kaynak kodunu
öğrenebilseydik

Tahmin ediyorum, ancak tüm pikseller 3 boyutlu alandadır (her renk için 1 değer). Bunları örneğin 10x10x10'luk gruplar / küpler olarak ayırın, böylece renkli RGB (12,56,97) grup / küpte (10-20,50-60,90-100) olur. Pikselleri bu grupların üzerine bölerken hangisinin en büyüğü olduğunu takip edersiniz. Sonunda, baskın rengi, en fazla piksel içeren grubun ortalamasını alarak belirlersiniz. Grupların boyutu o zaman performans / doğrulukta bir ticarettir.
mxt3

Yanıtlar:


14

Gönderen Windows 7 Masaüstüne Welcome tam olarak 35 dakika:

27 farklı kovada normalize edilmiş bir renk histogramıdır ve siyahları, beyazları, alfa kanallarını ve grileri çıkarır ve en baskın RGBV [sic] değerini kullanırız ...

Konuşmacının "RGB" demek istediğinden eminim, çünkü "RGBV" bir şey gibi gözükmüyor. “Normalleştirilmiş” kısım gerçekten önemli değil; Her bir "kovaya" kaç pikselin düştüğünü etkin bir şekilde sayıyor. Bu nedenle, her piksel, kanallarının değerlerinin her birinin konumuna dayanarak (üç boyutlu bir dizide düzenlenmiş; 27'nin küp kökü 3'tür) 27 kovadan birine konur. Windows, her bir renk kanalı için bu rengin yoğunluğunun aralığın alt, orta veya en üst kısmında olup olmadığını belirler. Aralıkların yaklaşık 0-60, 60-200 ve 200-255 olduğu ortaya çıkacaktır. Tamamen şeffaf pikseller hiç dahil edilmemiştir.

Windows daha sonra hangi kepçenin en fazla piksele sahip olduğunu, siyah, beyaz ve gri olanları (üç kanalın hepsinin aynı aralıkta olduğu kovalar) yok sayarak bulur. Bu, SQL Server Management Studio ikonunu açıklıyor - bize sarı görünenlerin çoğu aslında "beyaz" kovaya atılıyor ve yok sayılıyor.

Kabul edilebilir kovaların hiçbirinde piksel yoksa, program, sistem renk şemasına bakılmaksızın açık mavi bir kaplama alır. (Komut istemine bakın.) Bir programda simge yoksa, Windows varsayılan simgesi başka türlü mavi veya yeşil bir kaplama oluştursa bile beyaz / yarı saydam bir kaplama alır.

Birden fazla programın aynı vurgu renge sahip olmasını engelleyen hiçbir şey yoktur. Örneğin en yeni Chrome simgesi, Windows 8'in Gezgini ile aynı sarı renktedir.

Bağlar varsa, görüntüdeki renklerin sırasına bağlı olmayan önceden belirlenmiş bir düzen vardır. Bu muhtemelen maksimum bulunma yönteminin bir sonucudur - daha önce kontrol edilen kovalar daha sonra bir tane bağlansa bile maksimum olmaya devam edecektir. Görünüşe göre sarı renk kontrol edilen ilk kovalardan biri.

Kazanan kepçe keşfedildikten sonra, vurgu rengi, kepçe aralığının ortasında bir yerde bir renge ayarlanmış gibi görünür.

Test durumları (verilen sayılar RGB değeridir):

parlak sarı(255, 247, 209) → varsayılan vurgu
kırmızı 47(47, 0, 0) → varsayılan vurgu
kırmızı 60(60, 0, 0) → koyu kırmızı
kırmızı 66(66, 0, 0) → koyu kırmızı
koyu Kırmızı(165, 0, 0) → kırmızı
gri 128( 128, 128, 128) → varsayılan vurgu
halfs(0, 148, 255) ve (255, 0, 0) →
daha fazlasıaynı alana sahip kırmızı (0, 255, 0) ve (255, 216, 0) → sarı
aynı tersaynı ancak çevrilmiş → sarı
beyaz kırmızı 180(255, 180, 180) → açık kırmızı
beyaz kırmızı 210(255, 210, 210) → varsayılan olarak
kışlasaf mavi, saf sarı, saf kırmızı ve aynı alana sahip saf yeşil vurgulayın → sarı
beyaz kırmızı 61(255, 61, 61) → kırmızı
kırmızı 82(82, 0, 0) → koyu kırmızı


Bu, henüz en hassas cevabı. Teşekkür ederim. Sorun yaşadığım her şeyi açıklıyor ve ayrıca yoğun derinliğe de giriyor. Bravo.
16'da

@ Ben NI bu aptalca bir soru gibi görünüyor biliyorum, ama yine de. Neden 27 kova? 3 ^ 3 olduğunu biliyorum ve ilk 3'ün R, G ve B renkleri olduğunu sanıyorum, ama ikinci 3 ne anlama geliyor?
aexl

@ TheSexiestManinJamaica Ben sadece keyfi olduğunu düşünüyorum; belki Microsoft 3 ^ 3 zerafetini beğendi. Çok az olası renk (3 ^ 2 sadece 9) ve çok sayıda olası renk (3 ^ 4, 81) arasında hoş bir denge var.
Ben N

0

Tahminim, her bir renk için, yukarıdan başlayarak, R, G ve B değerlerini elde etmek ve onlardan üçün en yüksek ve en düşük değerlerini almak ve bunları karşılaştırmak olacaktır. En yüksek ve en düşük arasındaki en büyük boşluğu olan renk, görüntüdeki en parlak renk olacaktır. Şimdi, Chrome simgesi söz konusu olduğunda, en büyük boşluk için bağlı birkaç renk olabilir, ancak kırmızı en üsttedir, bu yüzden ilk önce karşılaşılır ve bu nedenle bu görüntü için baskın olan şey budur. (Sanırım, kendi logonuzu tasarlayarak, Chrome logosunu 120 derece döndürmek ve bunun yerine yeşil mi yoksa sarı renkte mi hakim olduğunu görmek gibi test edebileceğinizi düşünün.)


0

Anladığım kadarıyla - İşletim sistemi, rengini belirlerken birkaç faktörden fazlasını dikkate alır.

  1. İşletim sistemi tarafından bu uygulamaya zaten bir renk atanmış mı? Eğer öyleyse, 7'ye atlayın.
  2. Bu renk program kodunda tanımlanmış mı? Eğer öyleyse, programdan önceden tanımlanmış rengi kullanın. (Evet, bunu kontrol eden Windows programları için değişken bir ayar var, hayır, tam değişken adını bilmiyorum)
  3. 1 = false (Önceden tanımlanmış renk yok), kullanılan simgenin baskın rengini tanımlayın. (Bunun için, Siyah, beyaz ve gri renkler göz ardı edilir)
  4. 2 kullanılan ve kullanılan diğer renklerden daha baskın olan tek bir rengi tanımlayamıyorsa, simgenin ortalama RBG değerini tanımlayın. Tanımlanmış bir renk elde edilirse, bunu kullanın. Bunun için Beyaz, Siyah, Gri ve Kahverengi renkleri tamamen göz ardı edilir.
  5. 3 kara listedeki renklerden birinde (Siyah beyaz veya gri) sonuçlanırsa, kara listedeki renkleri etkilemeden, rasgele ortalama RBG değerini en çok temsil eden bir renk atayın.
  6. Rengin başarıyla atanması tamamlandıktan sonra, daha sonra daha hızlı renk ataması için renk bilgilerini kayıt defterinde saklayın.
  7. Atanan renk şu anda açık olan başka bir uygulama tarafından kullanılan bir renkle eşleşiyorsa, rengi, atanan rengin% 15'i içinde rasgele bir ton miktarıyla dengeleyin.
  8. Ekran rengi

Bu çok yanlış olabilir ve çoğunlukla spekülasyondur, ancak bu size işletim sisteminin renkleri belirlemek için kullanabileceği kolay anlaşılır bir yöntem sunar. Ayrıca önceden tanımlanmış bir renge sahip olmayan bir programın ve eşit miktarda renk kullanan bir simgenin nasıl beyaz / kahverengi / siyah atanmadığını ve neden siyah, beyaz ve griye hiçbir zaman atanmadığını da açıklar. Ayrıca, Simgesine sahip olmayan programların (bazıları hala var), saydam bir sıcak izleme rengini gösterdiğini, bunun da simgenin üzerine gelindiğinde 'daha parlak' olmasına neden olduğunu unutmayın.


Uygulamaların kendi renklerini tanımlamaları için bir yol yoktur. Aynı renge sahip iki programa karşı herhangi bir kural yok gibi görünüyor. Yine de ilginç fikirler.
Ben N,

-2

İşte görüntünün RGB renklerini ortalayan bazı VB kodları:

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

Bir işletim sisteminde kullanım için gerçekten optimize edilmemiştir, ancak size temel bir fikir vermelidir - Source


3
O zaten basit / basit bir ortalama olmadığını açıkladı. Chrome simgesini kodun içinden geçirdiğinizde, bunu kendiniz göreceksiniz.
Synetech
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.