pep-mklive/pylibraries/ttkbootstrap/colorutils.py

205 lines
5.1 KiB
Python

from PIL import ImageColor
from colorsys import rgb_to_hls
RGB = 'rgb'
HSL = 'hsl'
HEX = 'hex'
NAME = 'name'
HUE = 360
SAT = 100
LUM = 100
def color_to_rgb(color, model=HEX):
"""Convert color value to rgb.
The color and model parameters represent the color to be converted.
The value is expected to be a string for "name" and "hex" models and
a Tuple or List for "rgb" and "hsl" models.
Parameters:
color (Any):
The color values for the model being converted.
model (str):
The color model being converted.
Returns:
Tuple[int, int, int]:
The rgb color values.
"""
color_ = conform_color_model(color, model)
try:
return ImageColor.getrgb(color_)
except:
print('this')
def color_to_hex(color, model=RGB):
"""Convert color value to hex.
The color and model parameters represent the color to be converted.
The value is expected to be a string for "name" and "hex" models and
a Tuple or List for "rgb" and "hsl" models.
Parameters:
color (Any):
The color values for the model being converted.
model (str):
The color model being converted.
Returns:
str:
The hexadecimal color value.
"""
r, g, b = color_to_rgb(color, model)
return f'#{r:02x}{g:02x}{b:02x}'
def color_to_hsl(color, model=HEX):
"""Convert color value to hsl.
The color and model parameters represent the color to be converted.
The value is expected to be a string for "name" and "hex" models and
a Tuple or List for "rgb" and "hsl" models.
Parameters:
color (Any):
The color values for the model being converted.
model (str):
The color model being converted.
Returns:
Tuple[int, int, int]:
The hsl color values.
"""
r, g, b = color_to_rgb(color, model)
hls = rgb_to_hls(r/255, g/255, b/255)
h = int(hls[0]*HUE)
l = int(hls[1]*LUM)
s = int(hls[2]*SAT)
return h, s, l
def update_hsl_value(color, hue=None, sat=None, lum=None, inmodel=HSL, outmodel=HSL):
"""Change hue, saturation, or lumenosity of the color based on the
hue, sat, lum parameters provided.
Parameters:
color (Any):
The color
hue (int):
A number between 0 and 360.
sat (int):
A number between 0 and 100.
lum (int):
A number between 0 and 100.
inmodel (str):
The color model used by the color to be changed. One of
hsl, rgb, hex, name.
outmodel (str):
The color value model to be returned when the color is
changed. One of hsl, rgb, hex.
Returns:
Union[Tuple[int, int, int], str]:
The color value based on the selected color model.
"""
h, s, l = color_to_hsl(color, inmodel)
if hue is not None:
h = hue
if sat is not None:
s = sat
if lum is not None:
l = lum
if outmodel == RGB:
return color_to_rgb([h, s, l], HSL)
elif outmodel == HEX:
return color_to_hex([h, s, l], HSL)
else:
return h, s, l
"""
https://stackoverflow.com/questions/1855884/determine-font-color-based-on-background-color
"""
def contrast_color(color, model=RGB, darkcolor='#000', lightcolor='#fff'):
"""Returns the best matching contrasting light or dark color for
the given color.
Parameters:
color (Any):
The color value to evaluate.
model (str):
The model of the color value to be evaluated. 'rgb' by
default.
darkcolor (Any):
The color value to be returned when the constrasting color
should be dark.
lightcolor (Any):
The color value to be returned when the constrasting color
should be light.
Returns:
str:
The matching color value.
"""
if model != RGB:
r, g, b = color_to_rgb(color, model)
else:
r, g, b = color
luminance = ((0.299 * r) + (0.587 * g) + (0.114 * b))/255
if luminance > 0.5:
return darkcolor
else:
return lightcolor
def conform_color_model(color, model):
"""Conform the color values to a string that can be interpreted
by the `PIL.ImageColor.getrgb method`.
Parameters:
color (Union[Tuple[int, int, int], str]):
The color value to conform.
model (str):
One of 'HSL', 'RGB', or 'HEX'
Returns:
str:
A color value string that can be used as a parameter in the
PIL.ImageColor.getrgb method.
"""
if model == HSL:
h, s, l = color
return f'hsl({h},{s}%,{l}%)'
elif model == RGB:
r, g, b = color
return f'rgb({r},{g},{b})'
else:
return color