Windows 7 คำนวณสีที่ใช้สำหรับทาสก์บาร์“ color hot-tracking” อย่างไร


20

สิ่งนี้ทำให้ฉันทึ่งในบางครั้ง

ไม่มีใครรู้ว่าอัลกอริทึม Windows 7 Aero ใช้ในการกำหนดสีที่จะใช้เป็นไฮไลต์โฮเวอร์การติดตามร้อนบนปุ่มแถบงานสำหรับแอปที่รันอยู่ในปัจจุบันหรือไม่

แถบสีของ Windows 7 มีแถบโฮเวอร์

มันขึ้นอยู่กับไอคอนของแอพ แต่ฉันไม่สามารถเห็นรูปแบบเฉพาะของที่ซึ่งมันได้รับค่าสี

มันไม่ได้ดูเหมือนจะเป็นใด ๆ ต่อไปนี้:

  1. ค่าสีเฉลี่ยจากไอคอนทั้งหมดมิฉะนั้นคุณจะได้สีน้ำตาลตลอดเวลาด้วยไอคอนหลายสีเช่น Chrome
  2. สีใช้รูปภาพมากที่สุดมิฉะนั้นคุณจะได้สีเหลืองสำหรับไอคอน SQL Server Management Studio (ที่ 6 จากซ้าย) นอกจากนี้ไอคอน Chrome ยังใช้สีแดงสีเขียวและสีเหลืองในขนาดที่เท่ากัน
  3. สีที่อยู่ที่พิกัดพิกเซลที่กำหนดภายในไอคอนเนื่องจาก Chrome เป็นสีแดงซึ่งระบุด้านบนของไอคอน - และแผ่นจดบันทึก ++ (ที่ 2 จากขวา) เป็นสีเขียว - ระบุด้านล่างของไอคอน

ฉันถามคำถามนี้ใน ux.stackoverflow.com และถูกปิดเป็นนอกหัวข้อ แต่มีคนตอบด้วยต่อไปนี้:


ตามที่อธิบายโดย Raymond Chen ในบทความบล็อก MSDN นี้ :

บางคนถามว่ามันเสร็จแล้ว มันไม่มีอะไรพิเศษจริงๆ รหัสจะมองหาสีเด่นในไอคอน (และเนื่องจากนักออกแบบภาพเป็นตัวติดสำหรับสิ่งนี้สีดำสีขาวและสีเทาไม่ถือเป็น "สี" เพื่อจุดประสงค์ในการคำนวณนี้)


อย่างไรก็ตามฉันไม่พอใจกับคำตอบนั้นจริง ๆ เพราะมันไม่ได้อธิบายวิธีการคำนวณสี "เด่น" อย่างน้อยบนไอคอน SQL Management Studio สีที่เด่นที่สุดอย่างน้อยก็คือสีเหลือง แต่จุดเด่นคือสีเขียว ฉันอยากรู้ว่าอัลกอริทึมคืออะไร


An average colour value from the entire icon, otherwise you would get brown all the time.ไม่สมเหตุสมผลเลย ตัวอย่างเช่นไอคอนSkype , พรอมต์คำสั่งหรือไอคอนTorrentจะกลายเป็นสีน้ำตาลได้อย่างไร ಠ_ఠ (ครั้งสุดท้ายที่ฉันย้อนกลับวิศวกรรมหนึ่งในอัลกอริทึมการคำนวณสีของ Windows มันใช้เวลาหลายปีในการเปิดและปิดความสนใจและหลายชนิดของงานที่แตกต่างกันในที่สุดคิดออกดูเหมือนว่าฉันอาจแฮ็คนี้ หนึ่งในบางจุด.)
Synetech

@Synetech คุณพูดถูก - ฉันแค่คิดถึงไอคอนที่มีให้เลือกมากมายและมีหลายสีที่มีหลายสี ตัวอย่างเช่นไอคอน Chrome หรือไอคอน IIS มีสีแดงสีเขียวสีเหลือง & สีน้ำเงินและสีเขียวสีเหลือง & สีน้ำเงินตามลำดับ ฉันคิดอย่างเกียจคร้านเหล่านี้จะมีสีน้ำตาลคล้ำ แต่คุณพูดถูกว่ามันใช้ไม่ได้กับไอคอนโมโนโครมจำนวนมากหรือน้อย
พวกเขา

โพสต์ ONTมีความคิดเห็นที่เชื่อมโยงไปยังคำถามเกี่ยวกับรุ่นของ Chrome นี้และหน้าที่เชื่อมโยงอธิบายได้โดยการตรวจสอบ Chrome ซอร์สโค้ด คำอธิบาย (อย่างน้อยนั้น) นั้นไม่ใช่วิธีง่าย ๆ
Synetech

@Synetech พบที่ดี - ตอนนี้เรากำลังได้รับที่ไหนสักแห่ง นี่คือสิ่งที่ฉันกำลังมองหา ตอนนี้ถ้าเพียง แต่เราจะได้รับซอร์สโค้ด Win7 ... ;)
พวกเขา

ฉันคาดเดา แต่พิกเซลทั้งหมดอยู่ในพื้นที่ 3 มิติ (1 ค่าสำหรับแต่ละสี) แบ่งพวกมันเป็นกลุ่ม / ลูกบาศก์ตัวอย่างเช่น 10x10x10 ดังนั้นสี RGB (12,56,97) จะได้รับอยู่ในกลุ่ม / ลูกบาศก์ (10-20,50-60,90-100) เมื่อแบ่งพิกเซลออกเป็นกลุ่มเหล่านี้คุณจะติดตามว่าอันไหนที่ใหญ่ที่สุด ในที่สุดคุณกำหนดสีเด่นโดยเฉลี่ยกลุ่มที่มีพิกเซลมากที่สุด ขนาดของกลุ่มนั้นเป็นการแลกเปลี่ยนของประสิทธิภาพ / ความถูกต้อง
mxt3

คำตอบ:


14

จากยินดีต้อนรับสู่เดสก์ท็อป Windows 7ในเวลา 35 นาที:

มันเป็นฮิสโตแกรมสีที่ได้รับการปรับให้เป็นมาตรฐานในถังที่แตกต่างกัน 27 ถังและเราแยกสีดำขาวช่องอัลฟาและสีเทาและใช้ค่า RGBV [sic] ที่โดดเด่นที่สุด ...

ฉันค่อนข้างแน่ใจว่าผู้พูดหมายถึง "RGB" เนื่องจาก "RGBV" ดูเหมือนจะไม่เป็นอะไร ส่วน "ปกติ" ไม่สำคัญจริงๆ มันมีประสิทธิภาพนับจำนวนพิกเซลตกอยู่ใน "ถัง" แต่ละ ดังนั้นแต่ละพิกเซลจึงถูกใส่ลงในหนึ่งใน 27 ถัง (จัดเรียงในอาร์เรย์สามมิติโดยรูทคิวบ์ที่ 27 คือ 3) ขึ้นอยู่กับตำแหน่งของค่าของแต่ละช่อง Windows กำหนดสำหรับแต่ละช่องสีว่าความเข้มของสีนั้นอยู่ที่ช่วงล่างกลางหรือบนสุดของช่วง ดูเหมือนว่าช่วงจะอยู่ในช่วง 0-60, 60-200 และ 200-255 พิกเซลที่โปร่งใสทั้งหมดจะไม่ถูกรวม

Windows จะค้นหาที่เก็บข้อมูลที่มีพิกเซลมากที่สุดโดยไม่สนใจสีดำสีขาวและสีเทา (ที่ฝากข้อมูลที่ช่องทั้งสามอยู่ในช่วงที่สามของช่วงเดียวกัน) ที่อธิบายไอคอนสตูดิโอจัดการเซิร์ฟเวอร์ SQL - สิ่งที่ปรากฏเป็นสีเหลืองสำหรับเราได้รับการทิ้งในที่ฝากข้อมูล "สีขาว" และถูกละเว้น

หากไม่มีพิกเซลในที่เก็บข้อมูลใด ๆ ที่ยอมรับได้โปรแกรมจะได้รับการซ้อนทับสีน้ำเงินอ่อนโดยไม่คำนึงถึงโทนสีของระบบ (ดูที่พรอมต์คำสั่ง) หากโปรแกรมไม่มีไอคอนโปรแกรมจะได้รับการซ้อนทับสีขาว / โปร่งแสงแม้ว่าไอคอนเริ่มต้นของ Windows จะสร้างภาพซ้อนทับสีน้ำเงินหรือสีเขียว

ไม่มีอะไรจะหยุดหลายโปรแกรมจากการมีสีไฮไลต์เดียวกัน ยกตัวอย่างเช่นไอคอน Chrome ใหม่ล่าสุดจะได้รับสีเหลืองเหมือนกับ Explorer ของ Windows 8

หากมีความสัมพันธ์กันจะมีลำดับที่กำหนดไว้ล่วงหน้าซึ่งไม่ได้ขึ้นอยู่กับลำดับของสีในภาพ นี่อาจเป็นเพียงผลลัพธ์ของวิธีการหาค่าสูงสุด - ถังที่ตรวจสอบก่อนหน้านี้จะยังคงเป็นค่าสูงสุดแม้ว่าจะมีการผูกไว้ในภายหลัง ปรากฏว่าสีเหลืองเป็นหนึ่งในการตรวจสอบถังแรก

เมื่อค้นพบถังที่ชนะแล้วสีของไฮไลต์จะถูกตั้งค่าเป็นสีที่อยู่ตรงกลางของกลุ่มของที่เก็บข้อมูล

กรณีทดสอบ (ตัวเลขที่ให้ไว้คือค่า RGB):

สีเหลืองสดใส(255, 247, 209) →ไฮไลต์เริ่มต้น
สีแดง 47(47, 0, 0) →ไฮไลต์เริ่มต้น
สีแดง 60(60, 0, 0) →แดงเข้ม
สีแดง 66(66, 0, 0) →แดงเข้ม
ดำแดง(165, 0, 0) →แดง
สีเทา 128( 128, 128, 128) →ไฮไลต์เริ่มต้น
halfs(0, 148, 255) และ (255, 0, 0) →สีแดง
มากกว่าครึ่ง(0, 255, 0) และ (255, 216, 0) ด้วยพื้นที่เดียวกัน→สีเหลือง
ย้อนกลับเดียวกันเหมือนกัน แต่พลิก→ สีเหลือง
สีขาวสีแดง 180(255, 180, 180) →สีแดงอ่อน
สีขาวสีแดง 210(255, 210, 210) →ค่าเริ่มต้นเน้น
ไตรมาสสีฟ้าบริสุทธิ์, สีเหลืองบริสุทธิ์, สีแดงบริสุทธิ์และสีเขียวบริสุทธิ์ในพื้นที่เดียวกัน→สีเหลือง
ขาวแดง 61(255, 61, 61) →สีแดง
สีแดง 82(82, 0, 0) →แดงเข้ม


นี่คือคำตอบที่หลอกลวงที่สุด ขอขอบคุณ. มันอธิบายทุกสิ่งที่ฉันมีปัญหากับและยังไปลึกมาก ไชโย
Theyetiman

@Ben NI รู้ว่านี่เป็นคำถามที่โง่ แต่ก็ยัง ทำไมต้องถัง 27 ถัง? ฉันรู้ว่ามันคือ 3 ^ 3 และฉันเดาว่า 3 ข้อแรกคือสี R, G และ B แต่สิ่งที่สามที่สองนี้แทน?
aexl

@ TheSexiestManinJamaica ฉันคิดว่ามันเป็นเรื่องโดยพล; บางที Microsoft อาจชอบความงดงามของ 3 ^ 3 มันเป็นความสมดุลที่ดีระหว่างการมีสีที่เป็นไปได้น้อยมาก (3 ^ 2 เป็นเพียง 9) และสีที่เป็นไปได้มากมาย (3 ^ 4 คือ 81)
Ben N

0

ฉันเดาว่าสำหรับแต่ละสีเริ่มจากด้านบนคุณจะได้รับค่า R, G และ B และจากนั้นคุณจะได้คะแนนสูงสุดและต่ำสุดของทั้งสามและเปรียบเทียบพวกเขา สีที่มีช่องว่างที่ใหญ่ที่สุดระหว่างสูงสุดและต่ำสุดจะเป็นสีที่สว่างที่สุดในภาพ ในกรณีนี้กล่าวว่าไอคอน Chrome อาจมีหลายสีที่เชื่อมโยงกับช่องว่างที่ใหญ่ที่สุด แต่สีแดงอยู่ด้านบนสุดดังนั้นจึงพบเจอก่อนและนั่นคือสิ่งที่สำคัญสำหรับภาพนั้น (ฉันคิดว่าคุณสามารถทดสอบสิ่งนี้ได้ด้วยการออกแบบไอคอนของคุณเองเช่นหมุนโลโก้ Chrome 120 องศาและดูว่าสีเขียวหรือสีเหลืองครอบงำแทนหรือไม่)


0

จากวิธีที่ฉันเข้าใจ - ระบบปฏิบัติการใช้ปัจจัยมากกว่าสองสามข้อในการพิจารณาสี

  1. มีการกำหนดสีของระบบปฏิบัติการให้กับแอปพลิเคชันนี้หรือไม่ หากเป็นเช่นนั้นให้ข้ามไปที่ 7
  2. สีนี้ถูกกำหนดไว้ในรหัสโปรแกรมหรือไม่? ถ้าเป็นเช่นนั้นใช้สีที่กำหนดไว้ล่วงหน้าจากโปรแกรม (ใช่มีการตั้งค่าตัวแปรสำหรับโปรแกรม windows ที่ควบคุมสิ่งนี้ไม่ฉันไม่ทราบชื่อตัวแปรที่แน่นอน)
  3. ถ้า 1 = false (หมายถึงไม่มีสีที่กำหนดไว้ล่วงหน้า) ให้กำหนดสีที่โดดเด่นของไอคอนที่ใช้ (สำหรับสิ่งนี้สีดำขาวและเทาจะถูกละเว้น)
  4. หาก 2 ไม่สามารถกำหนดสีเดียวที่ใช้และโดดเด่นกว่าสีอื่น ๆ ที่ใช้ให้กำหนดค่า RBG เฉลี่ยของไอคอน หากสีที่กำหนดสำเร็จให้ใช้สีนี้ เพื่อจุดประสงค์นี้สีขาวดำเทาและน้ำตาลจะถูกละเว้นอย่างสมบูรณ์
  5. หากผลลัพธ์ 3 รายการในหนึ่งในสีดำ (สีขาวดำหรือสีเทา) ให้กำหนดสีแบบสุ่มที่แสดงค่า RBG เฉลี่ยมากที่สุดโดยไม่ละเมิดสีดำของรายการ
  6. เมื่อการกำหนดสีสำเร็จแล้วให้เก็บข้อมูลสีในรีจิสทรีเพื่อให้การกำหนดสีเร็วขึ้นในภายหลัง
  7. หากสีที่กำหนดตรงกับสีที่แอปพลิเคชันอื่นเปิดอยู่ในขณะนี้ให้ชดเชยสีด้วยจำนวนสีแบบสุ่มภายใน 15% ของสีที่กำหนด
  8. แสดงสี

นี่อาจเป็นสิ่งที่ผิดและส่วนใหญ่เป็นการเก็งกำไร แต่นี่เป็นวิธีการที่เข้าใจง่ายที่ระบบปฏิบัติการอาจใช้เพื่อกำหนดสี นอกจากนี้ยังอธิบายวิธีที่โปรแกรมที่ไม่มีสีที่กำหนดไว้ล่วงหน้าและไอคอนที่ใช้สีจำนวนเท่ากันไม่ได้กำหนดสีขาว / น้ำตาล / ดำและทำไมสีดำสีขาวและสีเทาจึงไม่เคยถูกกำหนด นอกจากนี้คุณควรทราบว่าโปรแกรมที่ไม่มีไอคอน (ยังมีบางส่วน) แสดงสีติดตามร้อนแบบโปร่งใสซึ่งทำให้ไอคอนนั้น 'สว่างขึ้น' เมื่ออยู่เหนือ


ไม่มีวิธีสำหรับแอปพลิเคชันในการกำหนดสีของตัวเอง ดูเหมือนจะไม่มีกฎใด ๆ กับสองโปรแกรมที่มีสีเดียวกัน ความคิดที่น่าสนใจแม้ว่า
Ben N

-2

นี่คือรหัส VB ​​บางตัวที่เฉลี่ยสี RGB ของภาพ:

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

มันไม่ได้ปรับให้เหมาะสมสำหรับการใช้งานในระบบปฏิบัติการ แต่ควรให้แนวคิดพื้นฐาน - แหล่งที่มา


3
เขาอธิบายแล้วว่าไม่ใช่ค่าเฉลี่ย / ธรรมดา เปิดใช้งานไอคอน Chrome ผ่านรหัสและคุณจะเห็นว่าตัวคุณเอง
Synetech
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.