对比色






4.08/5 (14投票s)
2004年4月26日
2分钟阅读

168576

2148
一种为给定颜色计算对比色的新方法

引言
计算对比色的传统方法是对给定颜色与 0xFFFFFF (或 &HFFFFFF) 进行异或运算。然而,这种方法得到的对比色有时可能与原始颜色相似,我们的眼睛很难明显区分两者。因此,这种传统方法不够好。例如,灰色,其十六进制值为 0x808080,与 0xFFFFFF 异或后得到 0x7F7F7F,这与原始颜色非常接近。
我提出了一种新的简单解决方案,该方案基于这种传统方法。该解决方案计算出更好的对比色,但请注意,它并非总是完美的。(注意:我不确定是否已经存在这种方法)。
解决方案
该方法通过测试给定颜色的每个分量(即红色、绿色和蓝色)是否接近 0x80(十进制的 128)。接近程度由编译时宏 TOLERANCE
定义,它只是一个值。如果所有分量都接近 0x80,则使用旧方法计算的对比色将不会与原始颜色形成良好的对比。新的方法通过将 0x7F7F7F 添加到给定颜色来克服这个问题,然后为了防止溢出(因为颜色值仅在 0x000000 到 0xFFFFFF 范围内),结果会与 0xFFFFFF 进行与运算。
使用代码
这个项目的主要内容是函数 CalcContrastingColor
,如下所示。
在运行时,单击“背景...”按钮以选择背景颜色。然后程序将使用计算出的对比色显示文本。您还可以更改文本的字体。
// crBG is in 0xRRGGBB or 0xBBGGRR format. INT CalcContrastColor (INT crBg){ if ( abs(((crBg ) & 0xFF) - 0x80) <= TOLERANCE && abs(((crBg >> 8) & 0xFF) - 0x80) <= TOLERANCE && abs(((crBg >> 16) & 0xFF) - 0x80) <= TOLERANCE ) return (0x7F7F7F + crBg) & 0xFFFFFF; else return crBg ^ 0xFFFFFF; }
历史
版本 2 的改进- 显示如上图所示的输出。
- 包含一些文本,以便用户更好地判断是否为良好的对比色。
- 兼容 Windows XP 主题。