4

我不知道如何问这个,但这里有。

我在屏幕上绘制了一个填充的彩色矩形。颜色是 R,G,B 的形式

然后我想在矩形顶部绘制文本,但是文本的颜色必须能够提供最佳对比度,这意味着它是可读的。

例子:

如果我画一个黑色矩形,文本的明显颜色将是白色。

我现在尝试的是这个。我将矩形的颜色传递给这个函数,它返回一个反转的颜色,然后我将它用于我的文本。

它有效,但这不是最好的方法。

有什么建议么?

// eg. usage: Color textColor = GetInverseLuminance(rectColor);
private Color GetInverseLuminance(Color color)
{
    int greyscale = (int)(255 - ((color.R * 0.30f) + (color.G * 0.59f) + (color.B * 0.11f)));

    return Color.FromArgb(greyscale, greyscale, greyscale);
}
4

6 回答 6

3

保证提供显着不同颜色的一种简单方法是切换 RGB 三元组的每个组件的最高位。

Color inverse(Color c)
{
    return new Color(c.R ^ 0x80, c.G ^ 0x80, c.B ^ 0x80);
}

如果原始颜色为#1AF283,则“反色”将为#9A7203。

对比将是显着的。我对美学不做任何保证。

2009 年 4 月 3 日更新:我尝试了这个和其他方案。结果在我的博客

于 2009-03-14T17:34:59.257 回答
2

最易读的颜色将是白色或黑色。最“舒缓”的颜色将不是白色也不是黑色,它将是一种与背景颜色形成轻微对比的颜色。没有办法以编程方式执行此操作,因为它是主观的。你不会为每个人找到最易读的颜色,因为每个人对事物的看法都不一样。

于 2009-03-14T15:28:27.237 回答
2

关于颜色的一些技巧,特别是关于前景和背景并置的提示,例如与文本。

人眼本质上是一个简单的镜头,因此一次只能有效地聚焦一种颜色。大多数现代相机中使用的镜头通过使用多个不同折射率的镜头(彩色镜头)来解决这个问题,以便所有颜色同时聚焦,但人眼并没有那么先进。

出于这个原因,您的用户应该一次只关注一种颜色来阅读文本。这意味着要么前景是彩色的,要么是背景,但绝不是两者兼而有之。 这会导致一种通常称为振动的情况,在这种情况下,眼睛会在前景颜色和背景颜色之间快速转移焦点,试图分辨形状,但它永远不会分辨,形状永远不会聚焦,并导致眼睛疲劳。

于 2009-03-14T16:03:38.650 回答
2

如果您为它提供 RGB(127,127,127),您的函数将不起作用,因为它将返回完全相同的颜色。(修改你的函数以返回黑色或白色会稍微改善一些事情)

始终保持可读性的最好方法是在白色文本周围加上黑色,或者反过来。

它通常通过首先在 (x-1,y-1),(x+1,y-1),(x+1,y-1),(x+1,x+1) 和然后是 (x,y) 处的白色文本。

或者,您可以先绘制一个半透明的黑色块,然后在其上绘制不透明的白色文本。这样可以确保您的背景和文本之间始终存在一定程度的对比。

于 2009-03-14T16:05:28.460 回答
1

为什么是灰色的?最好是黑色或白色。深色搭配白色,浅色搭配黑色。只需查看亮度是否高于阈值并选择一个或另一个

(顺便说一下,您不需要 .net、c# 或 asp.net 标签)

于 2009-03-14T15:22:17.017 回答
1

你需要学习一些色彩理论。一个名为“Color Wheel Pro”的程序玩起来很有趣,会给你一个大致的想法。

本质上,您正在寻找给定颜色的互补色。

也就是说,我想你会发现虽然色彩理论有帮助,但你仍然需要人眼来微调。

于 2009-03-14T15:28:32.853 回答