C++ 在给定前景色和背景色的情况下,如何计算第三种颜色?

C++ 在给定前景色和背景色的情况下,如何计算第三种颜色?,c++,colors,highlight,C++,Colors,Highlight,我再次问这个问题是因为我的第一次尝试被错误地标记为重复,我仍然希望有人能给我一个答案 我必须为C++/VCL应用程序中的特定控件编写自己的鼠标悬停代码。问题是,给定任何前景色和背景色的组合,如何计算高光颜色以指示鼠标位于该控件上方 我不是在问如何根据背景色选择字体/文本颜色。这个问题肯定已经得到了回答。我需要做的是选择第三种颜色,以便在鼠标悬停在项目上时突出显示该项目 我在想我可能想做一些事情,比如拿背景色,在色轮上找到它的对立面(我不知道怎么做)。如果该颜色与文本颜色太接近(无论您如何确定),

我再次问这个问题是因为我的第一次尝试被错误地标记为重复,我仍然希望有人能给我一个答案

我必须为C++/VCL应用程序中的特定控件编写自己的鼠标悬停代码。问题是,给定任何前景色和背景色的组合,如何计算高光颜色以指示鼠标位于该控件上方

我不是在问如何根据背景色选择字体/文本颜色。这个问题肯定已经得到了回答。我需要做的是选择第三种颜色,以便在鼠标悬停在项目上时突出显示该项目

我在想我可能想做一些事情,比如拿背景色,在色轮上找到它的对立面(我不知道怎么做)。如果该颜色与文本颜色太接近(无论您如何确定),请将其调亮或调暗

有谁愿意分享算法吗


谢谢

如果要查找互补色(色轮上的相反方向),可以将前景色转换为(或任何其他颜色空间,如Y'CbCr、Y'IQ等),将色调组件旋转180°并转换回RGB

正如您所怀疑的,如果背景颜色与结果颜色太接近,则此操作可能不起作用。不过,这给了你一些选择。如果将两种颜色(fg和bg)都转换为HSV,则可以找到两种颜色,其色调正好介于前景色和背景色之间。只需在两种输入颜色的色调之间找到中间的角度即可得到第一种可能的颜色,然后再将其加上180°即可得到另一种可能的颜色


但更大的问题是,为什么要设置选择颜色?你应该使用系统高亮显示颜色,除非你有很好的理由不这样做。

这个线程似乎有一个关于混合颜色的经过充分研究的答案:也许你可以交换颜色。从r g b介质计算亮度。如果亮度>阈值:亮度+=X;else brightness-=X。通过这种方式,您可以在悬停时增加亮度,如果背景太亮,只会使背景变暗。幸运的是,问题太广泛了。有10多种可能的方法可以做到这一点。他们都有各自的优点和缺点。选择一个颜色空间。使用一些启发性的方法来找到一种远离两者的颜色。迭代到产品中,确定它在您的UI框架中是否看起来不错(例如,文本颜色是否比背景颜色更均匀?)我不使用系统颜色的原因是我们允许用户在应用程序中自定义调色板。我现在尝试了几种将RGB转换为HSL/B/V的方法,并尝试修改H值。我的主要问题是前景色是白色或黑色,这是非常普遍的。明天我将尝试添加更多的特殊案例代码,看看我是否能理智地解决这个问题。幸运的是,我可以在应用程序启动时执行一次此操作,所以我不必担心性能问题。