如何从HEX颜色代码(如#0a87af)或三个RGB值(0-255)计算最接近颜色的友好颜色。
我正在寻找一种有效的计算方法或者这样做,这样我就可以用PHP或Python实现它,并且该算法可以用于更好的网站访问colourblind人。
答案 0 :(得分:3)
对于色盲用户而言,单色不是问题(除非您想传输该色调的非常具体的含义);颜色之间的区别是。
给定两种或更多颜色,您可以使用colorsys将它们转换为HLS,并检查亮度的差异是否足够。如果差异太小,请增加它,如下所示:
import colorsys
import re
def rgb2hex(r, g, b):
return '#%02x%02x%02x' % (r, g, b)
def hex2rgb(hex_str):
m = re.match(
r'^\#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$', hex_str)
assert m
return (int(m.group(1), 16), int(m.group(2), 16), int(m.group(3), 16))
def distinguish_hex(hex1, hex2, mindiff=50):
"""
Make sure two colors (specified as hex codes) are sufficiently different.
Returns the two colors (possibly changed). mindiff is the minimal
difference in lightness.
"""
rgb1 = hex2rgb(hex1)
rgb2 = hex2rgb(hex2)
hls1 = colorsys.rgb_to_hls(*rgb1)
hls2 = colorsys.rgb_to_hls(*rgb2)
l1 = hls1[1]
l2 = hls2[1]
if abs(l1 - l2) >= mindiff: # ok already
return (hex1, hex2)
restdiff = abs(l1 - l2) - mindiff
if l1 >= l2:
l1 = min(255, l1 + restdiff / 2)
l2 = max(0, l1 - mindiff)
l1 = min(255, l2 + mindiff)
else:
l2 = min(255, l2 + restdiff / 2)
l1 = max(0, l2 - mindiff)
l2 = min(255, l1 + mindiff)
hsl1 = (hls1[0], l1, hls1[2])
hsl2 = (hls2[0], l2, hls2[2])
rgb1 = colorsys.hls_to_rgb(*hsl1)
rgb2 = colorsys.hls_to_rgb(*hsl2)
return (rgb2hex(*rgb1), rgb2hex(*rgb2))
print(distinguish_hex('#ff0000', '#0000ff'))
答案 1 :(得分:3)
正如其他人在评论/回答中提到的那样,两种颜色之间的对比非常重要。
W3已经创建了一种方法,用于定义颜色之间的最小对比度,以便传递不同级别的可访问性。
他们提供了说明here,并且计算它的公式位于同一页的底部,here:
contrast ratio = (L1 + 0.05) / (L2 + 0.05)
对于这个看似简单的公式,您需要使用找到here的其他公式计算两种颜色的L1
和L2
的相对亮度:
L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:
if RsRGB <= 0.03928 then R = RsRGB/12.92 else R = ((RsRGB+0.055)/1.055) ^ 2.4
if GsRGB <= 0.03928 then G = GsRGB/12.92 else G = ((GsRGB+0.055)/1.055) ^ 2.4
if BsRGB <= 0.03928 then B = BsRGB/12.92 else B = ((BsRGB+0.055)/1.055) ^ 2.4
和RsRGB,GsRGB和BsRGB定义为:
RsRGB = R8bit/255
GsRGB = G8bit/255
BsRGB = B8bit/255
文本和背景之间的最小对比度对于AA级应为4.5:1,对于AAA级为7:1。这仍然留下了创造漂亮设计的空间。
有一个implementation in JS by Lea Verou的例子。
这不会给你最接近颜色的颜色,因为在独特的背景上会有不止一种颜色给出相同的对比效果,但它是计算对比度的标准方法。
答案 2 :(得分:1)
Contrast-Finder 是一个开源在线工具(由Open-S和M. Faure编写),根据前景色和背景色,将计算对比度,如果不足则根据WCAG公式,会给你一堆背景或前景色,具有足够的对比度,因此选项,使用不同的算法(你必须告诉它,如果你想保持前景色或背景色,如果你想要对比度高于4.5:1或3:1 - AA级 - 或7:1 / 4.5:1 - 级AAA) 很多情侣都很喜欢它。
来源 - 在Java中 - 在GitHub上。
注意:正如其他答案中所写,colourblind人(“有颜色缺陷的人”)只是人们关注颜色选择的一部分:部分视力的人也是。当网站设计师在#FFF上选择#AAA时,对于许多人来说这是一个问题,没有任何视力或颜色感知损失;他们只是在非最佳光照条件下有一个闪亮的Retina®屏幕......:p