Last active
July 19, 2022 12:53
-
-
Save Benbb96/e7b1ce654f616da08e61fa888e666354 to your computer and use it in GitHub Desktop.
Original PHP script from this stackoverflow question : https://stackoverflow.com/a/42921358/8439435 then updated to Python and following the WCAG 2.0 - G18.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
BLACK_COLOR = "#000000" | |
WHITE_COLOR = "#FFFFFF" | |
def get_contrast_color(background_color: str) -> str: | |
""" | |
Util function to determine what's the best color between black or white to choose for a text | |
depending on the background color given in parameter. | |
Based on algorythm from WCAG 2.0 explained here : https://www.w3.org/TR/WCAG20-TECHS/G18.html#G18-tests | |
:param background_color: the background color in HEX format (eg: #9D412B) | |
:return: A black or a white color in HEX format | |
""" | |
def calc_luminosity_contrast(color: str) -> float: | |
extract_colors = (color[i:i+2] for i in range(1, len(color), 2)) | |
colors_8bit = (int(c, 16) / 255 for c in extract_colors) | |
def relative_luminance(value: float) -> float: | |
return (value / 12.92) if value <= 0.03928 else pow((value + 0.055) / 1.055, 2.4) | |
red, green, blue = (relative_luminance(c) for c in colors_8bit) | |
return 0.2126 * red + 0.7152 * green + 0.0722 * blue | |
l1 = calc_luminosity_contrast(background_color) + 0.05 | |
l2 = calc_luminosity_contrast(BLACK_COLOR) + 0.05 | |
contrast_ratio = l1 / l2 if l1 > l2 else l2 / l1 | |
return BLACK_COLOR if contrast_ratio >= 4.5 else WHITE_COLOR |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Beware: the luminosity contrast algorithm used here is based on an early working draft of WCAG 2.0 techniques. The formula and required ratio changed in the final version.