import random as rand
import numpy as np
import colorsys
[docs]class Color:
[docs] @classmethod
def create(cls, color):
"""
Creates color class
string - generates color from hex
tuple and values between [0, 1] - generates from hls
tuple and values between [0, 255] - generates from rgb
:param color: tuple, list, str
:returns: color class
"""
if isinstance(color, str):
return cls(hex=color)
if isinstance(color, (list, tuple)):
if np.any(np.array(color) > 1):
return cls(rgb=color)
return cls(hls=color)
if isinstance(color, Color):
return color
return cls().random()
[docs] @classmethod
def random(cls, h=(0, 1), l=(0.35,0.70), s=(0.6, 1)):
"""
Generates a random color
:param l: range for lightness
:type l: tuple
:param h: range for hue
:type h: tuple
:param s: range for saturation
:type s: tuple
:returns: randomly generated color
:rtype: :class:`Color`
"""
h = rand.uniform(h[0], h[1])
l = rand.uniform(l[0], l[1])
s = rand.uniform(s[0], s[1])
return cls(hls=(h, l, s))
def __init__(self, hls=None, rgb=None, hex=None):
self._hls = hls
self._rgb = rgb
self._hex = hex
@property
def hex(self):
"""
Hex representation of color
"""
if not self._hex:
r, g, b = self.rgb
self._hex = '#%02x%02x%02x' % (r, g, b)
return self._hex
@property
def hls(self):
"""
HLS representation of color
"""
if not self._hls:
self._hls = colorsys.rgb_to_hls(*[i/255 for i in self.rgb])
return self._hls
@property
def rgb(self):
"""
RGB representation of color
"""
if not self._rgb:
if self._hex:
h = self.hex.lstrip('#')
self._rgb = tuple(int(h[i:i + 2], 16) for i in (0, 2, 4))
else:
self._rgb = [int(i*255) for i in colorsys.hls_to_rgb(*self.hls)]
return self._rgb
__all__ = ['Color']