Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 找到在彩色表面上绘制的文本的最可读颜色_Graphics_Colors_Drawing_Grayscale - Fatal编程技术网

Graphics 找到在彩色表面上绘制的文本的最可读颜色

Graphics 找到在彩色表面上绘制的文本的最可读颜色,graphics,colors,drawing,grayscale,Graphics,Colors,Drawing,Grayscale,我不知道该怎么问这个问题,但问题来了 我在屏幕上画了一个填充的彩色矩形。颜色是R、G、B的形式 然后我想在矩形的顶部绘制文本,但是文本的颜色必须能够提供最好的对比度,这意味着它是可读的 例如: 如果我画一个黑色矩形,文本的明显颜色将是白色 我现在尝试的是这个。我将矩形的颜色传递给这个函数,它返回一个反转的颜色,然后用于文本 这是可行的,但不是最好的方法 有什么建议吗 // eg. usage: Color textColor = GetInverseLuminance(rectColor); p

我不知道该怎么问这个问题,但问题来了

我在屏幕上画了一个填充的彩色矩形。颜色是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);
}

为什么是灰色?黑色或白色最好。深色为白色,浅色为黑色。只需查看亮度是否高于阈值,然后选择其中一个


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

最可读的颜色是白色或黑色。最“舒缓”的颜色不是白色也不是黑色,而是与背景颜色形成轻微对比的颜色。没有办法通过编程实现这一点,因为这是主观的。你不会为每个人找到最具可读性的颜色,因为每个人对事物的看法都不同

你需要学习一些色彩理论。一个名为“彩色车轮专业”的程序很有趣,可以让你大致了解

本质上,您是在为给定的颜色寻找互补的颜色


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

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

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


因此,用户一次只需关注一种颜色即可阅读文本。这意味着前景是彩色的,或者背景是彩色的,但决不能两者都是。这会导致一种通常称为振动的情况,在这种情况下,眼睛会在前景和背景色之间快速转移焦点,试图分辨形状,但它永远不会分辨,形状永远不会聚焦,它会导致眼睛疲劳。

如果您为其提供RGB(127127),您的功能将无法工作,因为它将返回完全相同的颜色。(修改函数以返回黑色或白色将略微改善情况)

让东西始终可读的最好方法是在白色文本周围加上黑色,或者相反

通常先在(x-1,y-1),(x+1,y-1),(x+1,y-1),(x+1,x+1)绘制黑色文本,然后在(x,y)绘制白色文本


或者,可以先绘制半透明的黑色块,然后在其上绘制不透明的白色文本。这确保了你的背景和文本之间总是有一定的对比度。

一个简单的方法是切换RGB三元组中每个分量的顶部位,这可以保证产生明显不同的颜色

Color inverse(Color c)
{
    return new Color(c.R ^ 0x80, c.G ^ 0x80, c.B ^ 0x80);
}
如果原始颜色为#1AF283,“反向”将为#9A7203

对比将是显著的。我对美学没有任何保证


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

如果你只是补充颜色并保持亮度,人眼就不能很好地拾取边缘(边缘是杆状的,颜色是由锥体完成的)。为了便于阅读,您需要最大亮度对比度=>黑色或白色这非常棒,效果非常好。翻转最后一位实际上实现了什么?比如什么意思以及为什么它会起作用?忘了添加,我使用了你发布的方法,但随后将颜色转换为灰度,它在对比度方面效果非常好。另一种表达每个元素的方式是(c.R+128)%256。你在色彩空间中移动了一半。或者,如果c.R<128,则加128,显着变亮;如果c.R>=128,则减128,显着变暗。@Gautam:请查看维基百科上的解释: