Bagaimana Windows 7 menghitung warna yang akan digunakan untuk taskbar "color hot-tracking"?

20

Ini membuat saya penasaran untuk beberapa waktu.

Adakah yang tahu algoritma yang digunakan Windows 7 Aero untuk menentukan warna yang akan digunakan sebagai sorotan lacak pelacakan panas pada tombol bilah tugas untuk aplikasi yang sedang berjalan?

Bilah tugas Windows 7 melayang-layang warna

Ini pasti didasarkan pada ikon aplikasi, tapi saya tidak bisa melihat pola spesifik dari mana ia mendapatkan nilai warna.

Tampaknya bukan salah satu dari yang berikut:

  1. Nilai warna rata-rata dari seluruh ikon, jika tidak Anda akan menjadi cokelat sepanjang waktu dengan ikon multi-warna seperti Chrome.
  2. Warna yang paling banyak digunakan dalam gambar, jika tidak Anda akan mendapatkan kuning untuk ikon SQL Server Management Studio (ke-6 dari kiri). Juga, ikon Chrome menggunakan warna merah, hijau dan kuning dengan ukuran yang sama.
  3. Warna yang terletak pada koordinat piksel tertentu dalam ikon, karena Chrome berwarna merah - menunjukkan bagian atas ikon - dan Notepad ++ (ke-2 dari kanan) berwarna hijau - menunjukkan bagian bawah ikon.

Saya mengajukan pertanyaan ini di ux.stackoverflow.com dan ditutup sebagai di luar topik, tetapi seseorang menjawab dengan yang berikut:


Seperti yang dijelaskan oleh Raymond Chen dalam artikel blog MSDN ini :

Beberapa orang bertanya bagaimana hal itu dilakukan. Benar-benar tidak ada yang istimewa. Kode hanya mencari warna dominan di ikon. (Dan, karena desainer visual adalah penempel untuk hal semacam ini, hitam, putih, dan nuansa abu-abu tidak dianggap sebagai "warna" untuk tujuan perhitungan ini.)


Namun saya tidak benar-benar puas dengan jawaban itu karena tidak menjelaskan bagaimana warna "dominan" dihitung. Tentunya pada ikon SQL Management Studio, warna dominan, paling tidak bagi saya, adalah kuning. Namun sorotnya hijau. Saya ingin tahu, secara spesifik, apa algoritma itu.

mereka
sumber
An average colour value from the entire icon, otherwise you would get brown all the time.Itu tidak masuk akal. Sebagai contoh, bagaimana rata-rata ikon Skype , command-prompt , atau μTorrent menjadi cokelat? ಠ_ ఠ (Terakhir kali saya melakukan rekayasa balik terhadap salah satu dari algoritma perhitungan warna Windows, butuh beberapa tahun perhatian masuk dan keluar dan banyak jenis pekerjaan yang berbeda untuk akhirnya mengetahuinya. Sepertinya saya mungkin akhirnya meretas ini satu di beberapa titik.)
Synetech
@ Synetech Anda benar - Saya hanya memikirkan beragam ikon yang tersedia dan banyak di antaranya yang berisi banyak warna. Misalnya ikon Chrome atau ikon IIS masing-masing berisi warna merah, hijau kuning & biru dan hijau, kuning & biru. Dengan malas saya pikir ini akan menjadi rata-rata ke warna cokelat keruh, tetapi Anda benar bahwa itu tidak berlaku untuk banyak ikon monokrom lebih atau kurang.
theyetiman
The ONT posting memiliki komentar yang link ke pertanyaan tentang versi Chrome ini dan halaman terkait menjelaskan hal itu dengan memeriksa Chrome kode sumber. Penjelasan (setidaknya untuk itu) bukan algoritma yang sederhana.
Synetech
@Synetech, cari yang bagus - sekarang kami ada di suatu tempat. Ini sesuai dengan apa yang saya cari. Sekarang, andai saja kita bisa mendapatkan kode sumber Win7 ...;)
theyetiman
Saya menduga tetapi, semua piksel berada dalam ruang 3 dimensi (1 nilai untuk setiap warna). Membagi mereka dalam kelompok / kubus misalnya 10x10x10, sehingga warna RGB (12,56,97) masuk dalam kelompok / kubus (10-20,50-60,90-100). Saat membagi piksel atas grup-grup ini, Anda melacak mana yang terbesar. Akhirnya Anda menentukan warna dominan dengan rata-rata grup dengan piksel terbanyak. Ukuran grup kemudian merupakan pertukaran dalam kinerja / akurasi.
mxt3

Jawaban:

14

Dari Selamat Datang di Desktop Windows 7 tepat pada 35 menit dalam:

Ini adalah histogram warna yang dinormalisasi di 27 ember yang berbeda, dan kami mengekstrak hitam, putih, saluran alfa, dan abu-abu, dan menggunakan nilai RGBV [sic] paling dominan ...

Saya cukup yakin pembicara dimaksudkan untuk mengatakan "RGB", karena "RGBV" tampaknya tidak menjadi apa-apa. Bagian "dinormalisasi" tidak terlalu penting; itu secara efektif menghitung berapa banyak piksel yang jatuh ke dalam setiap "ember." Setiap piksel, oleh karena itu, dimasukkan ke dalam salah satu dari 27 ember (disusun dalam susunan tiga dimensi; akar pangkat 27 adalah 3) berdasarkan posisi masing-masing nilai salurannya. Windows menentukan untuk setiap saluran warna apakah intensitas warna itu ada di bagian bawah, tengah, atau atas dari rentang tersebut. Tampaknya kisarannya sekitar 0-60, 60-200, dan 200-255. Pixel yang benar-benar transparan tidak termasuk sama sekali.

Windows kemudian menemukan ember mana yang memiliki piksel paling banyak, mengabaikan yang hitam, putih, dan abu-abu (ember di mana ketiga saluran berada di sepertiga rentang yang sama). Itu menjelaskan ikon SQL Server Management Studio - banyak dari apa yang tampak kuning bagi kita benar-benar dibuang di ember "putih" dan diabaikan.

Jika tidak ada piksel di salah satu kotak yang dapat diterima, program akan mendapatkan hamparan biru muda terlepas dari skema warna sistem. (Lihat prompt perintah.) Jika suatu program tidak memiliki ikon, ia mendapat overlay putih / transparan meskipun ikon default Windows akan menghasilkan overlay biru atau hijau.

Tidak ada yang menghentikan banyak program untuk memiliki warna highlight yang sama. Ikon Chrome terbaru, misalnya, mendapat warna kuning sama dengan Windows 8's Explorer.

Jika ada ikatan, ada urutan yang telah ditentukan yang tidak tergantung pada urutan warna pada gambar. Ini mungkin hanya hasil dari cara maksimum ditemukan - ember yang diperiksa sebelumnya akan terus menjadi maks bahkan jika nanti satu ikatan. Tampaknya kuning adalah salah satu kotak pertama yang diperiksa.

Setelah ember yang menang ditemukan, warna sorotan tampaknya diatur ke warna di suatu tempat di tengah kisaran ember.

Kasus uji (angka yang disediakan adalah nilai RGB):

kuning cerah(255, 247, 209) → sorotan default
merah 47(47, 0, 0) → sorot default
merah 60(60, 0, 0) → merah tua
merah 66(66, 0, 0) → merah tua
merah gelap(165, 0, 0) → merah
abu-abu 128( 128, 128, 128) → sorotan default
setengah(0, 148, 255) dan (255, 0, 0) → merah
lebih banyak setengah(0, 255, 0) dan (255, 216, 0) dengan area yang sama → kuning
sama terbaliksama tetapi terbalik → kuning
merah putih 180(255, 180, 180) → merah terang
merah putih 210(255, 210, 210) → sorotan default
tempat tinggalmurni biru, kuning murni, merah murni, dan hijau murni dengan area yang sama → kuning
merah putih 61(255, 61, 61) → merah
merah 82(82, 0, 0) → merah tua

Ben N
sumber
Ini adalah jawaban yang paling enak. Terima kasih. Ini menjelaskan semua yang saya punya masalah dengan dan juga masuk ke kedalaman. Bravo.
theyetiman
@ Ben NI tahu ini sepertinya pertanyaan bodoh, tapi tetap saja. Kenapa 27 ember? Saya tahu ini 3 ^ 3, dan saya kira 3 yang pertama adalah warna R, G dan B, tapi apa arti 3 kedua?
aexl
@TheSexiestManinJamaica Saya pikir itu hanya sewenang-wenang; mungkin Microsoft menyukai keanggunan 3 ^ 3. Ini keseimbangan yang bagus antara ada sangat sedikit warna yang mungkin (3 ^ 2 hanya 9) dan banyak warna yang mungkin (3 ^ 4 adalah 81).
Ben N
0

Dugaan saya adalah bahwa untuk setiap warna, mulai dari atas, Anda mendapatkan nilai R, G, dan B, dan dari mereka Anda mengambil yang tertinggi dan terendah dari ketiganya dan membandingkannya. Warna dengan celah terbesar antara tertinggi dan terendah akan menjadi warna paling terang dalam gambar. Sekarang dalam kasus, katakanlah, ikon Chrome, mungkin ada beberapa warna terikat untuk kesenjangan terbesar, tetapi merah di atas, jadi itu ditemui pertama, dan dengan demikian itulah yang mendominasi untuk gambar itu. (Saya kira Anda bisa menguji ini dengan mendesain ikon Anda sendiri, seperti memutar logo Chrome 120 derajat dan melihat apakah hijau atau kuning yang mendominasi.)

Darrel Hoffman
sumber
0

Dari cara saya memahaminya - OS memperhitungkan lebih dari beberapa faktor ketika menentukan warna.

  1. Sudahkah warna ditugaskan oleh OS ke aplikasi ini? Jika demikian, lanjutkan ke 7.
  2. Apakah warna ini didefinisikan dalam kode program? Jika demikian, gunakan warna yang telah ditentukan dari program. (Ya, ada pengaturan variabel untuk program windows yang mengontrol ini, tidak, saya tidak tahu nama variabel yang tepat)
  3. jika 1 = false (Berarti tidak ada warna yang ditentukan), tentukan warna dominan ikon yang digunakan. (Untuk ini, warna Hitam, putih dan abu-abu diabaikan)
  4. Jika 2 tidak dapat menentukan satu warna yang digunakan, dan lebih dominan daripada warna lain yang digunakan, tentukan nilai rata-rata RBG dari ikon tersebut. Jika warna yang ditentukan tercapai, gunakan ini. Untuk tujuan ini, warna Putih, Hitam, Abu-abu dan Coklat benar-benar diabaikan.
  5. Jika 3 menghasilkan salah satu warna yang masuk daftar hitam (Hitam putih atau abu-abu), secara acak berikan warna yang paling dekat mewakili nilai RBG rata-rata, tanpa melanggar warna daftar hitam.
  6. Setelah penugasan warna yang berhasil selesai, simpan informasi warna dalam registri untuk penugasan warna yang lebih cepat nanti.
  7. Jika warna yang diberikan cocok dengan warna yang sudah digunakan oleh aplikasi lain yang saat ini terbuka, offset warna dengan jumlah rona acak dalam 15% dari warna yang ditugaskan.
  8. Warna tampilan.

Ini mungkin salah, dan sebagian besar spekulasi, tetapi, ini memberi Anda metode yang mudah dimengerti OS bisa sangat baik digunakan untuk menentukan warna. Ini juga menjelaskan bagaimana program tanpa warna yang telah ditentukan, dan ikon menggunakan jumlah warna yang sama, tidak ditugaskan putih / coklat / hitam, dan mengapa hitam, putih dan abu-abu tidak pernah ditugaskan. Anda juga harus mencatat, bahwa program yang tidak memiliki Ikon (masih ada beberapa) menunjukkan warna pelacakan panas transparan, yang hanya menyebabkan ikon menjadi 'lebih cerah' ketika melayang.

Josh Raymond
sumber
Tidak ada cara bagi aplikasi untuk menentukan warna mereka sendiri. Tampaknya juga tidak ada aturan apa pun terhadap dua program yang memiliki warna yang sama. Tapi ide-ide menarik.
Ben N
-2

Berikut adalah beberapa kode VB yang rata-rata warna RGB dari suatu gambar:

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

Ini tidak benar-benar dioptimalkan untuk digunakan dalam OS, tetapi seharusnya memberi Anda ide dasar - Sumber


sumber
3
Dia sudah menjelaskan bahwa itu bukan rata-rata sederhana / dasar. Jalankan ikon Chrome melalui kode dan Anda akan melihatnya sendiri.
Synetech