ColorController is a Pythonic interface for managing colors by english-language name and various color values.

Overview

ColorController.py

Table of Contents

  1. Encode color data in various formats.
  2. Modify a color using simple, convenient methods.
  3. Invert a color
  4. Access a rich set of color values and color names

Welcome to the ColorController Python library!

My name is Tal Zaken, and I wrote this library for use in a natural language processing project that aims to take in free-form text, and spit out color data which somehow relates to the text's content.

Enough about that. Here are some things that you can do with ColorController:

1. Encode color data in various formats.

Example 1.1: Create a ColorController object using a familiar, english-language color name, and print out its properties.

You can set a color using a very large library of color names. See the colornames.txt document contained herein, with enormous thanks to Martin Krzywinski.

The following code:

from ColorController import ColorController

color = ColorController(name='hazel')

print(f"Name: {color.name}",
      f"Hex Code: {color.hex_code}",
      f"RGB: {color.rgb}",
      f"HSV: {color.hsv}",
      sep='\n')

outputs:

Name: hazel
Hex Code: ['#8E7618']
RGB: [(142, 118, 24)]
HSV: [(0.133, 0.831, 142)]

Further, you can change all the ColorController's properties by changing any one of them.

By example:

color.name = 'blue'

print(f"Name: {color.name}", 
      f"Hex Code: {color.hex_code}", 
      f"RGB: {color.rgb}", 
      f"HSV: {color.hsv}", 
      sep='\n')

You will see that all properties have updated:

Name: blue
Hex Code: ['#00008B', '#0000CD', '#0000EE', '#0000FF', '#0018A8', '#0087BD', '#0093AF', '#0247FE', '#0343DF', '#1F75FE', '#2242C7', '#333399']
RGB: [(0, 0, 139), (0, 0, 205), (0, 0, 238), (0, 0, 255), (0, 24, 168), (0, 135, 189), (0, 147, 175), (2, 71, 254), (3, 67, 223), (31, 117, 254), (34, 66, 199), (51, 51, 153)]
HSV: [(0.667, 1.0, 139), (0.667, 1.0, 205), (0.667, 1.0, 238), (0.667, 1.0, 255), (0.643, 1.0, 168), (0.548, 1.0, 189), (0.527, 1.0, 175), (0.621, 0.992, 254), (0.618, 0.987, 223), (0.602, 0.878, 254), (0.634, 0.829, 199), (0.667, 0.667, 153)]

Notably, the colornames.txt file has numerous entries that all share the name "blue." This is true of many colors. Because color is thought to be a culturally relative phenomenon, I have chosen to return all hex codes that match a given name. You will notice a similar phenomenon occurs for color names when you set a color using hex code, RGB, or HSV. This is because there are sometimes many names that all describe the same color.

Example 1.2: Show a color.

We've had a lot of talk about colors so far, but we haven't even seen any colors yet! Let's solve that now, and do away with these lengthy print statements:

color.hex_code ='#ffbff9'

color.show_color()

Shows:

pale_orchid

That said, the ColorController object is biased toward whatever you, the user, set it to be. If you explicitly set a name, then that will be the singular name of your object. Similarly, if you explicitly set a hex code, then that will be the value of your hex code. If you leave a leading # off of your hex code, then everything will still work, but that will be the hex code value. For example...

Example 1.3: Create a ColorController object using a hex code.

color = ColorController(hex_code='#990000')

color.show_color()

Shows:

['crimson_red', 'stizza', 'ou_crimson_red', 'usc_cardinal']

While:

color.hex_code = '990000'

color.show_color()

Shows very similar results:

['crimson_red', 'stizza', 'ou_crimson_red', 'usc_cardinal']

Example 1.4: Create a ColorController object using an RGB triplet.

You can also pass a 3-tuple whose values are each contained in range(0,256) to the rgb property. For example:

color = ColorController(rgb=(10, 255, 230))

color.show_color()

Shows:

[bright_aqua]

Example 1.5: Create a ColorController object using an HSV triplet, and print out its properties.

Lastly, you can also pass a 3-tuple whose first two values are a floating point number between 0 and 1 inclusive, and whose third value falls in range(0, 256):

color = ColorController(hsv=(0.25, 1, 255))

color.show_color()

Shows:

[chartreuse]

NOTE: While this is the HSV value format that comes included with the colorsys python standard library, it doesn't seem to be a very common format elsewhere. To match formats used in other locations, see the following functions:

def colorsys_hsv_to_hsv360(colorsys_hsv=tuple):
    """Takes an HSV triplet as provided by colorsys, and converts it to match the
    notation used in colornames.txt"""

def hsv360_to_hsvdistance(hsv360=tuple):
    """Takes an HSV triplet as provided by colorsys_hsv_to_hsv360(), and converts it to match the
    notation used in the function for calculating distance between colors."""  

2. Modify a color using simple, convenient methods.

Example 2.1: Darken a color.

You can darken a color using the darken_color() method. For example:

from ColorController import ColorController

color = ColorController(name='forest')

color.show_color()

color.darken_color()

color.show_color()

Will show the following in series:

[forest] [hunter_green]

You can also pass in a darkening_value between zero and one, to set the percent darker you'd like to go. For instance:

color = ColorController(name='cocoa')

color.show_color()

color.darken_color(.3)

color.show_color()

Shows the following in series:

[cocoa] [nutmeg]

In the above example, note that our color object was first initiated by the name property, meaning that there are lists of associated hex, rgb, and hsv values stored in their respective properties. When we lighten the color, we have to select one index from these lists to operate on. The default behavior is to operate on the first index. See the unlist() function in helpers.py.

Example 2.2: Lighten a color.

You can also pass in a lightening_value between zero and one, to set the percent lighter you'd like to go. For instance:

color = ColorController(hex_code='#6c3461')

color.show_color()

color.lighten_color(.5)

color.show_color()

Shows the following in series:

[grape] [grayish_fuchsia]

Example 2.3: Brighten a color.

3. Invert a color.

Example:

from ColorController.conversions import invert_rgb
from ColorController import ColorController


color = ColorController(hex_code='#9ffeb0')
color.show_color()

r, g, b = color.rgb
color.rgb = invert_rgb(r, g, b)
color.show_color()

Shows the following in series:

[mint] [deep_orchid]

4. Access a rich set of color values and color names (prepared by Martin Krzywinski), conveniently stored in a Pandas DataFrame.

Example:

from ColorController.ColorController import colors_df

print(colors_df.iloc[5000])

Outputs:

IDX                                                                  5000
NAME                                                    light_apple_green
rgb                                                                   rgb
R                                                                     220
G                                                                     231
B                                                                     139
hex                                                                   hex
HEX                                                               #DCE78B
hsv                                                                   hsv
h                                                                      67
s                                                                      40
v                                                                      91
xyz                                                                   xyz
X                                                                    0.63
Y                                                                    0.74
Z                                                                    0.35
lab                                                                   lab
L                                                                      89
A                                                                     -17
B                                                                      44
lch                                                                   lch
L                                                                      89
C                                                                      47
H                                                                     112
cmyk                                                                 cmyk
C                                                                       4
M                                                                       0
Y                                                                      36
K                                                                       9
NEIGHBOUR_STR           PMS586[775][226,229,132](3.6):hypnotic[4592][2...
NUM_NEIGHBOURS_MAXDE                                                    4
WORD_TAGS               [light, PMS586, hypnotic, jonquil, green, lime...
Name: 5000, dtype: object

Known Bugs:

  • I don't know of any right now, but I'm sure they exist!

Ideas

  • tint and shade methods instead of or in addition to lighten/darken?
  • more unit tests
  • module to mix colors
    • this will require converting to LAB or another subtractive space, so more getter/setter methods

Resources:

Owner
Tal Zaken
Tal Zaken
A fixture that allows runtime xfail

pytest-runtime-xfail pytest plugin, providing a runtime_xfail fixture, which is callable as runtime_xfail(), to allow runtime decisions to mark a test

Brian Okken 4 Apr 06, 2022
A Python class for checking the status of an enabled Minecraft server

mcstatus provides an easy way to query Minecraft servers for any information they can expose. It provides three modes of access (query, status and ping), the differences of which are listed below in

Nathan Adams 1.1k Jan 06, 2023
We provide useful util functions. When adding a util function, please add a description of the util function.

Utils Collection Motivation When we implement codes, we often search for util functions that are already implemented. Here, we are going to share util

6 Sep 09, 2021
Python Libraries with functions and constants related to electrical engineering.

ElectricPy Electrical-Engineering-for-Python Python Libraries with functions and constants related to electrical engineering. The functions and consta

Joe Stanley 39 Dec 23, 2022
A python module to manipulate XCode projects

This module can read, modify, and write a .pbxproj file from an Xcode 4+ projects. The file is usually called project.pbxproj and can be found inside the .xcodeproj bundle. Because some task cannot b

Ignacio Calderon 1.1k Jan 02, 2023
SysInfo is an app developed in python which gives Basic System Info , and some detailed graphs of system performance .

SysInfo SysInfo is an app developed in python which gives Basic System Info , and some detailed graphs of system performance . Installation Download t

5 Nov 08, 2021
✨ Un DNS Resolver totalement fait en Python par moi, et en français

DNS Resolver ❗ Un DNS Resolver totalement fait en Python par moi, et en français. 🔮 Grâce a une adresse (url) vous pourrez avoir l'ip ainsi que le DN

MrGabin 3 Jun 06, 2021
A simple and easy to use Spam Bot made in Python!

This is a simple spam bot made in python. You can use to to spam anyone with anything on any platform.

7 Sep 08, 2022
A work in progress box containing various Python utilities

python-wipbox A set of modern Python libraries under development to simplify the execution of reusable routines by different projects. Table of Conten

Deepnox 2 Jan 20, 2022
Python program for analyzing the output files of phonopy.

PhononTools Description Python program to analyze the results generated by phonopy. Using the .yaml and .dat files that phonopy generates one can plot

Harry LaBollita 8 Nov 27, 2022
A program will generate a eth key pair that has the public key that starts with a defined amount of 0

ETHAdressGenerator This short program will generate a eth key pair that has the public key that starts with a defined amount of 0 Requirements Python

3 Nov 19, 2021
Python program for Linux users to change any url to any domain name they want.

URLMask Python program for Linux users to change a URL to ANY domain. A program than can take any url and mask it to any domain name you like. E.g. ne

2 Jun 20, 2022
Script to rename and resize folders of images

script to rename and resize folders of images

Tega Brain 2 Oct 29, 2021
Experimental python optimistic rollup fraud-proof generation

Macula Experimental python optimistic rollup fraud-proof generation tech by @protolambda. Working on a python version for brevity and simplicity. See

Diederik Loerakker 30 Sep 01, 2022
produces PCA on genotypes from fasta files (popPhyl's ID format)

popPhyl_PCA Performs PCA of genotypes. Works in two steps. 1. Input file A single fasta file containing different loci, in different populations/speci

camille roux 2 Oct 08, 2021
✨ Un chois aléatoire d'un article sur Wikipedia totalement fait en Python par moi, et en français.

Wikipedia Random Article ❗ Un chois aléatoire d'un article sur Wikipedia totalement fait en Python par moi, et en français. 🔮 Grâce a une requète a w

MrGabin 4 Jul 18, 2021
Create C bindings for python automatically with the help of libclang

Python C Import Dynamic library + header + ctypes = Module like object! Create C bindings for python automatically with the help of libclang. Examples

1 Jul 25, 2022
Playing with python imports and inducing those pesky errors.

super-duper-python-imports In this repository we are playing with python imports and inducing those pesky ImportErrors. File Organization project │

James Kelsey 2 Oct 14, 2021
Bounding Boxes Python Utils

Bounding Boxes Python Utils

Vadim 4 May 01, 2022
✨ Un bot Twitter totalement fait en Python par moi, et en français.

Twitter Bot ❗ Un bot Twitter totalement fait en Python par moi, et en français. Il faut remplacer auth = tweepy.OAuthHandler(consumer_key, consumer_se

MrGabin 3 Jun 06, 2021