假设我有一张灰色的图像,我想画一个像文字就可以了。现在图像有一些黑暗和一些明亮的区域。因此,如果我为每个角色选择一个单独的颜色,我会以什么方式计算这样的颜色以获得最高的文本对比度?
务实的方法是使用黄色。 (我不知道为什么,但它常用于电影和纪录片中的字幕) 此外,我可以在明亮背景区域中使黄色变暗,并在深色背景区域突出显示。但这可能会产生一些层效应。
我知道色彩空间可能很重要。我从RGB灰度值开始,但LAB,HSV或HSL可能更适合计算最佳颜色。
修改 因为有一个有用的用例的问题:我真的不想绘制不同颜色的文字。它是关于灰色纹理背景上的特定字形的颜色选择。 (例如MR图像。)
答案 0 :(得分:1)
您问题的最简单答案是最大化背景和文字颜色之间的距离。
如果您转换为HSL,您可以通过最大化L(V HS中的V)之间的距离来实现此目的。所需要的是在背景亮度小于50%时选择白色,否则选择黑色。以下是一个示例:http://jsfiddle.net/E2kU4/
if(bgLightness < 50){
color = "white";
}else{
color = "black";
}
我认为这几乎解决了这个问题,但还有其他一些问题:
我不确定这个用例是什么。带有不同颜色字符的单词可能看起来很糟糕。通常,字幕选择单一颜色以保持一致性。
由于黄色饱和,黄色确实在黑白图像上脱颖而出。此外(并且我不确定如何准确地将其写入单词),与具有相似亮度的其他颜色相比,黄色具有非常高的色度。最好在HUSL页面上进行演示;顺便说一句,HUSL是一个很好的库,用于创建可读的颜色。
黄色很容易与深色对比,因为它非常轻。它也不与浅色对比,但通常通过在字幕中添加阴影/轮廓来解决。另一个例子:http://jsfiddle.net/E2kU4/1/
但是您可以将相同的技术(应用阴影或轮廓)应用于黑/白示例以获得最大对比度。现在,轮廓与文本具有最大对比度。轮廓也从背景中脱颖而出,除非那些颜色相似,在这种情况下对比度已经非常高(例如近黑色背景,黑色轮廓,白色文字)http://jsfiddle.net/E2kU4/2/
最后,转换为HSL / RGB和从HSL / RGB转换应该是微不足道的。有很多库可以做到。