计算最接近colourblind友好的颜色?

时间:2016-05-01 21:49:27

标签: php python algorithm colors accessibility

如何从HEX颜色代码(如#0a87af)或三个RGB值(0-255)计算最接近颜色的友好颜色。

我正在寻找一种有效的计算方法或者这样做,这样我就可以用PHP或Python实现它,并且该算法可以用于更好的网站访问colourblind人。

3 个答案:

答案 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的其他公式计算两种颜色的L1L2的相对亮度:

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