"""Functions for converting colors from one representation to another.
.. seealso::
- W3C-Wiki:
- `CSS3/Color <https://www.w3.org/wiki/CSS3/Color>`_
- `Extended color keywords
<https://www.w3.org/wiki/CSS3/Color/Extended_color_keywords>`_
- Wikipedia:
- `RGB color model <https://en.wikipedia.org/wiki/RGB_color_model>`_
- `Web Colors/X11 color names
<https://en.wikipedia.org/wiki/Web_colors#X11_color_names>`_
"""
import string
__all__ = ['color_names', 'floats2rgb', 'hex2rgb', 'is_valid_name', 'name2hex',
'name2rgb', 'rgb2floats', 'rgb2hex']
_COLOR_NAMES = {
'aliceblue': ('#F0F8FF', 240, 248, 255),
'antiquewhite': ('#FAEBD7', 250, 235, 215),
'aqua': ('#00FFFF', 0, 255, 255),
'aquamarine': ('#7FFFD4', 127, 255, 212),
'azure': ('#F0FFFF', 240, 255, 255),
'beige': ('#F5F5DC', 245, 245, 220),
'bisque': ('#FFE4C4', 255, 228, 196),
'black': ('#000000', 0, 0, 0),
'blanchedalmond': ('#FFEBCD', 255, 235, 205),
'blue': ('#0000FF', 0, 0, 255),
'blueviolet': ('#8A2BE2', 138, 43, 226),
'brown': ('#A52A2A', 165, 42, 42),
'burlywood': ('#DEB887', 222, 184, 135),
'cadetblue': ('#5F9EA0', 95, 158, 160),
'chartreuse': ('#7FFF00', 127, 255, 0),
'chocolate': ('#D2691E', 210, 105, 30),
'coral': ('#FF7F50', 255, 127, 80),
'cornflowerblue': ('#6495ED', 100, 149, 237),
'cornsilk': ('#FFF8DC', 255, 248, 220),
'crimson': ('#DC143C', 220, 20, 60),
'cyan': ('#00FFFF', 0, 255, 255),
'darkblue': ('#00008B', 0, 0, 139),
'darkcyan': ('#008B8B', 0, 139, 139),
'darkgoldenrod': ('#B8860B', 184, 134, 11),
'darkgray': ('#A9A9A9', 169, 169, 169),
'darkgreen': ('#006400', 0, 100, 0),
'darkgrey': ('#A9A9A9', 169, 169, 169),
'darkkhaki': ('#BDB76B', 189, 183, 107),
'darkmagenta': ('#8B008B', 139, 0, 139),
'darkolivegreen': ('#556B2F', 85, 107, 47),
'darkorange': ('#FF8C00', 255, 140, 0),
'darkorchid': ('#9932CC', 153, 50, 204),
'darkred': ('#8B0000', 139, 0, 0),
'darksalmon': ('#E9967A', 233, 150, 122),
'darkseagreen': ('#8FBC8F', 143, 188, 143),
'darkslateblue': ('#483D8B', 72, 61, 139),
'darkslategray': ('#2F4F4F', 47, 79, 79),
'darkslategrey': ('#2F4F4F', 47, 79, 79),
'darkturquoise': ('#00CED1', 0, 206, 209),
'darkviolet': ('#9400D3', 148, 0, 211),
'deeppink': ('#FF1493', 255, 20, 147),
'deepskyblue': ('#00BFFF', 0, 191, 255),
'dimgray': ('#696969', 105, 105, 105),
'dimgrey ': ('#696969', 105, 105, 105),
'dodgerblue': ('#1E90FF', 30, 144, 255),
'firebrick': ('#B22222', 178, 34, 34),
'floralwhite': ('#FFFAF0', 255, 250, 240),
'forestgreen': ('#228B22', 34, 139, 34),
'fuchsia': ('#FF00FF', 255, 0, 255),
'gainsboro': ('#DCDCDC', 220, 220, 220),
'ghostwhite': ('#F8F8FF', 248, 248, 255),
'gold': ('#FFD700', 255, 215, 0),
'goldenrod': ('#DAA520', 218, 165, 32),
'gray': ('#808080', 128, 128, 128),
'green': ('#008000', 0, 128, 0),
'greenyellow': ('#ADFF2F', 173, 255, 47),
'grey': ('#808080', 128, 128, 128),
'honeydew': ('#F0FFF0', 240, 255, 240),
'hotpink': ('#FF69B4', 255, 105, 180),
'indianred': ('#CD5C5C', 205, 92, 92),
'indigo': ('#4B0082', 75, 0, 130),
'ivory': ('#FFFFF0', 255, 255, 240),
'khaki': ('#F0E68C', 240, 230, 140),
'lavender': ('#E6E6FA', 230, 230, 250),
'lavenderblush': ('#FFF0F5', 255, 240, 245),
'lawngreen': ('#7CFC00', 124, 252, 0),
'lemonchiffon': ('#FFFACD', 255, 250, 205),
'lightblue': ('#ADD8E6', 173, 216, 230),
'lightcoral': ('#F08080', 240, 128, 128),
'lightcyan': ('#E0FFFF', 224, 255, 255),
'lightgoldenrodyellow': ('#FAFAD2', 250, 250, 210),
'lightgray': ('#D3D3D3', 211, 211, 211),
'lightgreen': ('#90EE90', 144, 238, 144),
'lightgrey': ('#D3D3D3', 211, 211, 211),
'lightpink': ('#FFB6C1', 255, 182, 193),
'lightsalmon': ('#FFA07A', 255, 160, 122),
'lightseagreen': ('#20B2AA', 32, 178, 170),
'lightskyblue': ('#87CEFA', 135, 206, 250),
'lightslategray': ('#778899', 119, 136, 153),
'lightslategrey': ('#778899', 119, 136, 153),
'lightsteelblue': ('#B0C4DE', 176, 196, 222),
'lightyellow': ('#FFFFE0', 255, 255, 224),
'lime': ('#00FF00', 0, 255, 0),
'limegreen': ('#32CD32', 50, 205, 50),
'linen': ('#FAF0E6', 250, 240, 230),
'magenta': ('#FF00FF', 255, 0, 255),
'maroon': ('#800000', 128, 0, 0),
'mediumaquamarine': ('#66CDAA', 102, 205, 170),
'mediumblue': ('#0000CD', 0, 0, 205),
'mediumorchid': ('#BA55D3', 186, 85, 211),
'mediumpurple': ('#9370DB', 147, 112, 219),
'mediumseagreen': ('#3CB371', 60, 179, 113),
'mediumslateblue': ('#7B68EE', 123, 104, 238),
'mediumspringgreen': ('#00FA9A', 0, 250, 154),
'mediumturquoise': ('#48D1CC', 72, 209, 204),
'mediumvioletred': ('#C71585', 199, 21, 133),
'midnightblue': ('#191970', 25, 25, 112),
'mintcream': ('#F5FFFA', 245, 255, 250),
'mistyrose': ('#FFE4E1', 255, 228, 225),
'moccasin': ('#FFE4B5', 255, 228, 181),
'navajowhite': ('#FFDEAD', 255, 222, 173),
'navy': ('#000080', 0, 0, 128),
'oldlace': ('#FDF5E6', 253, 245, 230),
'olive': ('#808000', 128, 128, 0),
'olivedrab': ('#6B8E23', 107, 142, 35),
'orange': ('#FFA500', 255, 165, 0),
'orangered': ('#FF4500', 255, 69, 0),
'orchid': ('#DA70D6', 218, 112, 214),
'palegoldenrod': ('#EEE8AA', 238, 232, 170),
'palegreen': ('#98FD98', 152, 253, 152),
'paleturquoise': ('#AFEEEE', 175, 238, 238),
'palevioletred': ('#DB7093', 219, 112, 147),
'papayawhip': ('#FFEFD5', 255, 239, 213),
'peachpuff': ('#FFDAB9', 255, 218, 185),
'peru': ('#CD853F', 205, 133, 63),
'pink': ('#FFC0CD', 255, 192, 205),
'plum': ('#DDA0DD', 221, 160, 221),
'powderblue': ('#B0E0E6', 176, 224, 230),
'purple': ('#800080', 128, 0, 128),
'red': ('#FF0000', 255, 0, 0),
'rosybrown': ('#BC8F8F', 188, 143, 143),
'royalblue': ('#4169E1', 65, 105, 225),
'saddlebrown': ('#8B4513', 139, 69, 19),
'salmon': ('#FA8072', 250, 128, 114),
'sandybrown': ('#F4A460', 244, 164, 96),
'seagreen': ('#2E8B57', 46, 139, 87),
'seashell': ('#FFF5EE', 255, 245, 238),
'sienna': ('#A0522D', 160, 82, 45),
'silver': ('#C0C0C0', 192, 192, 192),
'skyblue': ('#87CEEB', 135, 206, 235),
'slateblue': ('#6A5ACD', 106, 90, 205),
'slategray': ('#708090', 112, 128, 144),
'slategrey': ('#708090', 112, 128, 144),
'snow': ('#FFFAFA', 255, 250, 250),
'springgreen': ('#00FF7F', 0, 255, 127),
'steelblue': ('#4682B4', 70, 130, 180),
'tan': ('#D2B48C', 210, 180, 140),
'teal': ('#008080', 0, 128, 128),
'thistle': ('#D8BFD8', 216, 191, 216),
'tomato': ('#FF6347', 255, 99, 71),
'turquoise': ('#40E0D0', 64, 224, 208),
'saddlebrown': ('#8B4513', 139, 69, 19),
'violet': ('#EE82EE', 238, 130, 238),
'wheat': ('#F5DEB3', 245, 222, 179),
'white': ('#FFFFFF', 255, 255, 255),
'whitesmoke': ('#F5F5F5', 245, 245, 245),
'yellow': ('#FFFF00', 255, 255, 0),
'yellowgreen': ('#9ACD32', 154, 205, 50)
}
[docs]def color_names():
"""Return an iterator over all HTML/CSS color names."""
return iter(_COLOR_NAMES.keys())
[docs]def is_valid_name(name):
"""Return whether name is a valid color name.
:param str name: color name
:return: ``True`` if the name is valid
:rtype: bool
"""
return name.lower() in _COLOR_NAMES
[docs]def name2rgb(name):
"""Return the RGB values for name.
:param str name: color name
:return: RGB-triple
:rtype: tuple(int, int, int)
:raises KeyError: if name is not valid
"""
return _COLOR_NAMES[name.lower()][1:]
[docs]def name2hex(name):
"""Return the hexadecimal string for name.
:param str name: color name
:return: hexadecimal string (# + 6 hex digits)
:rtype: str
:raises KeyError: if name is not valid
"""
return _COLOR_NAMES[name.lower()][0]
[docs]def rgb2hex(r, g, b):
"""Convert from RGB to hexadecimal.
:param int r: red value ∈ [0..255]
:param int g: green value ∈ [0..255]
:param int b: blue value ∈ [0..255]
:return: hexadecimal string (# + 6 hex digits)
:rtype: str
:raises ValueError: if one of the arguments is not in [0..255]
"""
_check_args((r, g, b), (255, 255, 255))
return '#%02X%02X%02X' % (r, g, b)
[docs]def hex2rgb(hexstr):
"""Convert from hexadecimal to RGB.
:param str hexstr: string with three or six hex digits,
optionally prefixed with #
:return: RGB-triple
:rtype: tuple(int, int, int)
:raises ValueError: if one of the arguments is not in [0..255]
"""
if hexstr.startswith('#'):
hexstr = hexstr[1:]
if not all(x in string.hexdigits for x in hexstr):
raise ValueError('argument "%s" contains non-hex digit' % hexstr)
if len(hexstr) not in (3, 6):
raise ValueError('argument "%s" has wrong length '
'(3 or 6 hex digits are required)' % hexstr)
if len(hexstr) == 3:
hexstr = ''.join(x + x for x in hexstr)
return tuple(int(hexstr[i:i + 2], 16) for i in range(0, 6, 2))
[docs]def rgb2floats(rgb):
"""Convert a RGB-triple with ints to one with floats.
Useful when using functions that take or return RGB values as
floats from 0 to 1, e.g. the functions in module :mod:`colorsys`.
:param rgb: RGB-triple with values ∈ [0..255]
:type rgb: tuple(int, int, int)
:return: RGB-triple with values ∈ [0, 1]
:rtype: tuple(float, float, float)
.. versionadded:: 0.2.0
"""
return tuple(x / 255 for x in rgb)
[docs]def floats2rgb(rgb):
"""Convert a RGB-triple with floats to one with ints.
Useful when using functions that take or return RGB values as
floats from 0 to 1, e.g. the functions in module :mod:`colorsys`.
:param rgb: RGB-triple with values ∈ [0, 1]
:type rgb: tuple(float, float, float)
:return: RGB-triple with values ∈ [0..255]
:rtype: tuple(int, int, int)
.. versionadded:: 0.2.0
"""
return tuple(round(x * 255) for x in rgb)
def _check_args(args, max_vals):
if not all(isinstance(x, int) for x in args):
raise TypeError('arguments must be integers')
for x, m in zip(args, max_vals):
if x < 0 or x > m:
raise ValueError(
'argument "%d" outside allowed interval [0..%d]' % (x, m))