You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现RGB颜色对比度检测及颜色值差值含义咨询

Python实现RGB颜色对比度检测及颜色值差值含义咨询

嘿,这个问题问得特别实用,毕竟文字可读性直接影响用户体验!我来一步步帮你搞定这两个问题~

一、如何用Python检测字体与背景的对比度

首先,你拿到的是整数形式的RGB值(比如16777215是白色,对应十六进制0xFFFFFF),咱们得先把它拆分成单独的R、G、B分量(每个分量范围0-255),然后遵循WCAG(Web内容无障碍指南)的标准来计算对比度。

步骤1:拆分整数RGB为R、G、B

可以用位运算快速拆分:

def rgb_int_to_components(rgb_int):
    r = (rgb_int >> 16) & 0xFF
    g = (rgb_int >> 8) & 0xFF
    b = rgb_int & 0xFF
    return (r, g, b)

步骤2:计算颜色的相对亮度

WCAG定义了相对亮度的计算公式,核心是把RGB分量转换成线性的亮度值:

def calculate_relative_luminance(r, g, b):
    # 先把每个分量归一到0-1范围
    r_norm = r / 255.0
    g_norm = g / 255.0
    b_norm = b / 255.0

    # 转换为线性值
    def linearize(val):
        if val <= 0.03928:
            return val / 12.92
        else:
            return ((val + 0.055) / 1.055) ** 2.4

    r_linear = linearize(r_norm)
    g_linear = linearize(g_norm)
    b_linear = linearize(b_norm)

    # 计算相对亮度
    return 0.2126 * r_linear + 0.7152 * g_linear + 0.0722 * b_linear

步骤3:计算对比度并判断可读性

对比度是两个颜色相对亮度的比值(较亮的亮度+0.05)除以(较暗的亮度+0.05),WCAG的标准是:

  • 普通文本:对比度至少4.5:1才符合AA级标准
  • 大文本(比如标题):对比度至少3:1符合AA级,7:1符合AAA级

对应的函数:

def check_contrast(background_rgb, font_rgb):
    bg_r, bg_g, bg_b = rgb_int_to_components(background_rgb)
    font_r, font_g, font_b = rgb_int_to_components(font_rgb)

    bg_luminance = calculate_relative_luminance(bg_r, bg_g, bg_b)
    font_luminance = calculate_relative_luminance(font_r, font_g, font_b)

    # 确保L1是较亮的那个
    L1 = max(bg_luminance, font_luminance)
    L2 = min(bg_luminance, font_luminance)

    contrast_ratio = (L1 + 0.05) / (L2 + 0.05)
    return {
        "contrast_ratio": round(contrast_ratio, 2),
        "is_aa_normal": contrast_ratio >= 4.5,
        "is_aa_large": contrast_ratio >= 3.0,
        "is_aaa": contrast_ratio >= 7.0
    }

举个例子,白色背景(16777215)和黑色字体(0)的对比度是21:1,完全符合最高标准:

print(check_contrast(16777215, 0))
# 输出:{'contrast_ratio': 21.0, 'is_aa_normal': True, 'is_aa_large': True, 'is_aaa': True}

二、颜色值差值的含义

你问的“16777215 - 12788622”这种数值差,其实只是两个整数的数学差,和对比度没有直接关系。

因为整数形式的RGB是把R、G、B三个分量按位拼接成的十进制数:R << 16 | G << 8 | B。数值差可能只是某一个分量的变化导致的,比如:

  • 假设颜色A是0xFF0000(红色,十进制16711680),颜色B是0x00FF00(绿色,十进制65280),它们的数值差是16646400,但对比度其实只有3.18:1(刚好够大文本的AA标准)
  • 而颜色C是0xFFFFFF(白色)和颜色D是0x7F7F7F(灰色),数值差是8421504,但对比度是4.5:1(刚好够普通文本的AA标准)

所以数值差只能反映两个RGB整数的大小差异,完全不能代表视觉上的对比度,必须用前面提到的相对亮度方法来计算才准确。

备注:内容来源于stack exchange,提问作者mike3467

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:49:34