65.9K
CodeProject 正在变化。 阅读更多。
Home

对比色

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.08/5 (14投票s)

2004年4月26日

2分钟阅读

viewsIcon

168576

downloadIcon

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 主题。
© . All rights reserved.