2016-01-05 74 views
-1

我在重複問這個問題,因爲我的第一次嘗試被錯誤地標記爲重複,並且我仍然希望有人可能爲我解答。如何根據前景色和背景色計算第三種顏色?

我不得不爲C++/VCL應用程序中的特定控件編寫自己的鼠標懸停代碼。問題是,由於任何前景和背景顏色的組合,你如何計算高光顏色來表明鼠標在該控件上?

我不問如何選擇基於背景顏色的字體/文本顏色。這個問題當然得到了答覆。我需要做的是選擇第三種顏色來在鼠標懸停時突出顯示該項目。

我在想我可能想要做一些類似於背景顏色,在色輪上找到它的對立面(我不知道該怎麼做)。如果該顏色太接近(但是您確定)顏色,請將其設置爲更亮或更暗。

有沒有人有他們願意分享的算法?

謝謝!

+0

此線程似乎有一個關於混合顏色很好的研究答案:http://stackoverflow.com/questions/14819058/mixing-two-colors-naturally-in-javascript – edencorbin

+0

也許你可以只交換顏色。 –

+0

從r g中計算亮度b。如果亮度> THRESHOLD:亮度+ = X;其他亮度 - = X.這樣你可以增加懸停時的邊緣性,如果已經太亮就會簡單地使背景變暗 – I3ck

回答

1

如果要查找補色(在色輪上相反),可以將前景色轉換爲HSV space(或其他任何色彩空間,如Y'CbCr,Y'IQ等)。 ),將色相分量旋轉180°並轉換回RGB。

正如您懷疑的那樣,如果背景顏色太接近所得顏色,則可能無法使用。不過,這給了你一些選擇。如果將兩種顏色(fg & bg)轉換爲HSV,則可以找到兩種顏色,其顏色恰好在前景色和背景色之間。只需在2種輸入顏色的色調中間找到角度即可獲得第一種可能的顏色,然後再添加180°即可獲得其他可能的顏色。

但更大的問題是爲什麼你試圖設置選擇顏色呢?除非你有一個非常好的理由,否則你應該使用系統高亮顏色。

+0

我不使用系統顏色的原因是我們允許用戶在我們的應用程序中自定義調色板。我現在已經嘗試了將RGB轉換爲HSL/B/V並嘗試修改H值的幾種方法。我的主要麻煩是前景色是白色或黑色,這是非常普遍的。明天我會嘗試添加一些更特殊的案例代碼,看看我是否無法解決這個問題。 幸運的是,我可以在應用程序啓動時執行此操作,因此我不必擔心性能。 –