import numpy as np | |
from .contrast_detector import ContrastDetector | |
class LuminanceContrastDetector(ContrastDetector): | |
"""WCAG luminance contrast detector""" | |
def calculate_relative_luminance(self, rgb): | |
"""Calculate relative luminance according to WCAG 2.0""" | |
rgb_normalized = np.array(rgb) / 255.0 | |
rgb_linear = np.where( | |
rgb_normalized <= 0.03928, | |
rgb_normalized / 12.92, | |
((rgb_normalized + 0.055) / 1.055) ** 2.4 | |
) | |
return 0.2126 * rgb_linear[0] + 0.7152 * rgb_linear[1] + 0.0722 * rgb_linear[2] | |
def calculate_contrast(self, color1, color2): | |
"""Calculate WCAG contrast ratio""" | |
luminance1 = self.calculate_relative_luminance(color1) | |
luminance2 = self.calculate_relative_luminance(color2) | |
# Ensure luminance1 is the lighter color | |
if luminance1 < luminance2: | |
luminance1, luminance2 = luminance2, luminance1 | |
return (luminance1 + 0.05) / (luminance2 + 0.05) | |