Làm thế nào để Windows 7 tính toán màu sắc để sử dụng cho thanh tác vụ màu sắc theo dõi nóng?


20

Điều này đã gây tò mò cho tôi khá lâu.

Có ai biết thuật toán Windows 7 Aero sử dụng để xác định màu sắc sẽ sử dụng làm điểm nhấn di chuột theo dõi nóng trên các nút trên thanh tác vụ cho các ứng dụng hiện đang chạy không?

Màu sắc của thanh tác vụ Windows 7

Nó chắc chắn dựa trên biểu tượng của ứng dụng, nhưng tôi không thể thấy một mẫu cụ thể nơi nó nhận được giá trị màu từ đó.

Nó dường như không phải là một trong những điều sau đây:

  1. Một giá trị màu trung bình từ toàn bộ biểu tượng, nếu không bạn sẽ nhận được nâu tất cả các thời gian với các biểu tượng đa màu như Chrome.
  2. Màu được sử dụng nhiều nhất trong hình ảnh, nếu không, bạn sẽ có màu vàng cho biểu tượng SQL Server Management Studio (thứ 6 từ trái sang). Ngoài ra, biểu tượng Chrome đã sử dụng màu đỏ, xanh lá cây và vàng theo số đo bằng nhau.
  3. Một màu nằm ở tọa độ pixel nhất định trong biểu tượng, bởi vì Chrome có màu đỏ - biểu thị phần trên cùng của biểu tượng - và Notepad ++ (thứ 2 từ phải sang) có màu xanh lục - biểu thị phần dưới của biểu tượng.

Tôi đã hỏi câu hỏi này trên ux.stackoverflow.com và nó đã bị đóng ngoài chủ đề, nhưng ai đó đã trả lời như sau:


Theo mô tả của Raymond Chen trong bài viết trên blog MSDN này :

Một số người hỏi làm thế nào nó được thực hiện. Nó thực sự không có gì đặc biệt. Mã chỉ tìm màu chủ đạo trong biểu tượng. (Và, vì các nhà thiết kế hình ảnh là người gắn bó với loại vật này, màu đen, trắng và sắc thái của màu xám không được coi là "màu sắc" cho mục đích tính toán này.)


Tuy nhiên tôi không thực sự hài lòng với câu trả lời đó vì nó không giải thích cách tính màu "chiếm ưu thế". Chắc chắn trên biểu tượng SQL Management Studio, màu chủ đạo, ít nhất là trong mắt tôi, là màu vàng. Tuy nhiên, điểm nổi bật là màu xanh lá cây. Tôi muốn biết, cụ thể, thuật toán là gì.


An average colour value from the entire icon, otherwise you would get brown all the time.Điều đó không có ý nghĩa. Ví dụ, làm thế nào sẽ là Skype , nhắc lệnh , hoặc μTorrent biểu tượng trung bình ra màu nâu? ಠ_ ఠ (Lần cuối cùng tôi thiết kế ngược một trong các thuật toán tính toán màu của Windows, phải mất vài năm để chú ý và rất nhiều loại công việc khác nhau để tìm ra nó. Có vẻ như tôi cuối cùng đã hack nó một lúc nào đó.)
Synetech

@Synetech bạn nói đúng - Tôi chỉ nghĩ về một loạt các biểu tượng có sẵn và rất nhiều trong số chúng có chứa nhiều màu sắc. Ví dụ: biểu tượng Chrome hoặc biểu tượng IIS lần lượt chứa các màu đỏ, xanh lá cây và xanh dương và xanh lục, vàng và xanh lam. Tôi uể oải nghĩ rằng những thứ này sẽ có màu nâu đục, nhưng bạn nói đúng rằng nó không áp dụng cho nhiều biểu tượng đơn sắc nhiều hơn hoặc ít hơn.
theyetiman

Bài đăng ONTmột nhận xét liên kết đến một câu hỏi về phiên bản này của Chrome và trang được liên kết giải thích nó bằng cách kiểm tra mã nguồn Chrome. Giải thích (ít nhất là vậy) không chính xác là một thuật toán đơn giản.
Synetech

@Synetech tìm thấy tốt đẹp - bây giờ chúng tôi đang nhận được ở đâu đó. Đây là dọc theo dòng của những gì tôi đang tìm kiếm. Bây giờ, nếu chúng ta có thể lấy mã nguồn Win7 ...;)
theyetiman

Tôi đoán nhưng, tất cả các pixel đều ở trong không gian 3 chiều (1 giá trị cho mỗi màu). Chia chúng thành các nhóm / khối ví dụ như 10x10x10, do đó, màu RGB (12,56,97) có được trong nhóm / khối (10-20,50-60,90-100). Khi chia các pixel cho các nhóm này, bạn theo dõi cái nào là lớn nhất. Cuối cùng, bạn xác định màu chủ đạo bằng cách lấy trung bình nhóm có nhiều pixel nhất. Kích thước của các nhóm sau đó là một sự đánh đổi về hiệu suất / độ chính xác.
mxt3

Câu trả lời:


14

Từ Chào mừng đến với Máy tính để bàn Windows 7 vào đúng 35 phút sau:

Đó là biểu đồ màu được chuẩn hóa trên 27 nhóm khác nhau và chúng tôi trích xuất màu đen, lòng trắng, kênh alpha và màu xám và sử dụng giá trị RGBV [sic] nổi trội nhất ...

Tôi khá chắc chắn rằng người nói có nghĩa là nói "RGB", vì "RGBV" dường như không phải là một điều. Phần "bình thường hóa" không thực sự quan trọng; nó thực sự đếm được bao nhiêu pixel rơi vào mỗi "thùng". Do đó, mỗi pixel được đặt vào một trong 27 nhóm (được sắp xếp trong một mảng ba chiều; căn bậc ba của 27 là 3) dựa trên vị trí của mỗi giá trị của các kênh. Windows xác định cho từng kênh màu cho dù cường độ của màu đó nằm ở phần dưới cùng, giữa hoặc phần trên cùng của phạm vi. Dường như các phạm vi là khoảng 0-60, 60-200 và 200-255. Pixel hoàn toàn trong suốt hoàn toàn không được bao gồm.

Sau đó, Windows sẽ tìm thấy nhóm nào có nhiều pixel nhất, bỏ qua các màu đen, trắng và xám (các nhóm trong đó cả ba kênh nằm trong cùng một phần ba của phạm vi). Điều đó giải thích biểu tượng SQL Server Management Studio - phần lớn những gì xuất hiện màu vàng đối với chúng tôi thực sự bị bỏ vào thùng "trắng" và bị bỏ qua.

Nếu không có pixel trong bất kỳ nhóm nào có thể chấp nhận, chương trình sẽ có lớp phủ màu xanh nhạt bất kể bảng màu của hệ thống. (Xem dấu nhắc lệnh.) Nếu một chương trình không có biểu tượng, nó sẽ có lớp phủ màu trắng / mờ mặc dù biểu tượng mặc định của Windows sẽ tạo ra lớp phủ màu xanh lam hoặc xanh lục.

Không có gì ngăn cản nhiều chương trình có cùng màu nổi bật. Chẳng hạn, biểu tượng Chrome mới nhất có màu vàng giống như Explorer của Windows 8.

Nếu có các mối quan hệ, có một thứ tự được xác định trước không phụ thuộc vào thứ tự của các màu trong hình ảnh. Đây có lẽ chỉ là kết quả của cách tìm thấy mức tối đa - các thùng được kiểm tra trước đó sẽ tiếp tục là mức tối đa ngay cả khi một mối quan hệ sau này. Có vẻ như màu vàng là một trong những thùng đầu tiên được kiểm tra.

Khi xô chiến thắng được phát hiện, màu nổi bật dường như được đặt thành màu ở đâu đó ở giữa phạm vi của thùng.

Các trường hợp thử nghiệm (số được cung cấp là giá trị RGB):

Vàng tươi(255, 247, 209) → tô sáng mặc định
đỏ 47(47, 0, 0) → tô sáng mặc định
đỏ 60(60, 0, 0) → đỏ đậm
đỏ 66(66, 0, 0) → đỏ đậm
đỏ sẫm(165, 0, 0) → đỏ
xám 128( 128, 128, 128) → tô sáng mặc định
một nửa(0, 148, 255) và (255, 0, 0) → đỏ
hơn một nửa(0, 255, 0) và (255, 216, 0) với cùng một khu vực →
cùng đảo ngượccùng màu vàng nhưng được lật → vàng
trắng đỏ 180(255, 180, 180) → đỏ nhạt
trắng đỏ 210(255, 210, 210) → tô
khu phốsáng mặc định màu xanh lam thuần khiết, vàng thuần khiết, đỏ thuần khiết và xanh lục thuần khiết có cùng diện tích → vàng
trắng đỏ 61(255, 61, 61) → đỏ
đỏ 82(82, 0, 0) → đỏ sẫm


Đây là câu trả lời thú vị nhất chưa. Cảm ơn bạn. Nó giải thích mọi thứ tôi gặp khó khăn và cũng đi vào chiều sâu. Bravo.
theyetiman

@Ben NI biết điều này có vẻ như một câu hỏi ngớ ngẩn, nhưng vẫn còn. Tại sao 27 thùng? Tôi biết đó là 3 ^ 3, và tôi đoán 3 đầu tiên là các màu R, G và B, nhưng 3 thứ hai đại diện cho cái gì?
aexl

@TheSexiestManinJamaica Tôi nghĩ rằng nó chỉ là tùy ý; có lẽ Microsoft thích sự thanh lịch của 3 ^ 3. Đó là sự cân bằng tuyệt vời giữa việc có rất ít màu có thể (3 ^ 2 chỉ 9) và rất nhiều màu có thể (3 ^ 4 là 81).
Ben N

0

Tôi đoán là với mỗi màu, bắt đầu từ đầu, bạn nhận được các giá trị R, G và B, và từ chúng, bạn lấy giá trị cao nhất và thấp nhất trong ba màu và so sánh chúng. Màu có khoảng cách lớn nhất giữa cao nhất và thấp nhất sẽ là màu sáng nhất trong ảnh. Bây giờ, trong trường hợp, biểu tượng Chrome, có thể có một số màu được gắn với khoảng cách lớn nhất, nhưng màu đỏ nằm ở trên cùng, do đó, nó được bắt gặp đầu tiên và do đó, đó là thứ chi phối cho hình ảnh đó. (Tôi cho rằng bạn có thể kiểm tra điều này bằng cách thiết kế biểu tượng của riêng bạn, như xoay logo Chrome 120 độ và xem màu xanh lá cây hoặc màu vàng chiếm ưu thế.)


0

Theo cách tôi hiểu - Hệ điều hành cần nhiều hơn một vài yếu tố khi xác định màu sắc.

  1. Hệ điều hành đã được gán màu cho ứng dụng này chưa? Nếu vậy, bỏ qua đến 7.
  2. Là màu này được xác định trong mã chương trình? Nếu vậy, sử dụng màu được xác định trước từ chương trình. (Có, có một cài đặt biến cho các chương trình windows kiểm soát điều này, không, tôi không biết tên biến chính xác)
  3. if 1 = false (Có nghĩa là không có màu được xác định trước), xác định màu chủ đạo của biểu tượng được sử dụng. (Đối với điều này, các màu Đen, trắng và xám bị bỏ qua)
  4. Nếu 2 không thể xác định một màu được sử dụng và chiếm ưu thế hơn các màu khác được sử dụng, hãy xác định giá trị RBG trung bình của biểu tượng. Nếu một màu xác định đạt được, sử dụng này. Với mục đích này, các màu Trắng, Đen, Xám và Nâu hoàn toàn bị bỏ qua.
  5. Nếu 3 kết quả là một trong các màu được liệt kê trong danh sách đen (Đen trắng hoặc xám), chỉ định ngẫu nhiên một màu đại diện gần nhất cho giá trị RBG trung bình, mà không vi phạm các màu trong danh sách đen.
  6. Khi việc gán màu thành công hoàn tất, hãy lưu trữ thông tin màu trong sổ đăng ký để gán màu nhanh hơn sau đó.
  7. Nếu màu được gán khớp với màu đã được sử dụng bởi một ứng dụng khác hiện đang mở, hãy bù màu bằng một lượng màu sắc ngẫu nhiên trong phạm vi 15% màu được gán.
  8. Màu hiển thị.

Điều này rất có thể sai, và chủ yếu là suy đoán, nhưng, điều này mang đến cho bạn một phương pháp dễ hiểu mà HĐH rất có thể đang sử dụng để xác định màu sắc. Nó cũng giải thích cách một chương trình không có màu được xác định trước và biểu tượng sử dụng số lượng màu bằng nhau, không được gán trắng / nâu / đen và tại sao đen, trắng và xám không bao giờ được gán. Ngoài ra, bạn cần lưu ý rằng các chương trình không có Biểu tượng (vẫn còn một số) hiển thị màu theo dõi nóng trong suốt, điều này chỉ khiến biểu tượng 'sáng hơn' khi di chuột qua.


Không có cách nào để các ứng dụng xác định màu sắc riêng của chúng. Dường như cũng không có bất kỳ quy tắc nào chống lại hai chương trình có cùng màu. Ý tưởng thú vị, mặc dù.
Ben N

-2

Dưới đây là một số mã VB tính trung bình các màu RGB của hình ảnh:

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

Nó không thực sự được tối ưu hóa để sử dụng trong HĐH, nhưng nó sẽ cung cấp cho bạn một ý tưởng cơ bản - Nguồn


3
Ông đã giải thích rằng nó không phải là một mức trung bình đơn giản / cơ bản. Chạy biểu tượng Chrome thông qua mã và bạn sẽ thấy điều đó cho chính mình.
Synetech
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.