Utility functions for working with colors (conversion, manipulation, validation).
Project description
tintelligence-color-utils
Utility functions for working with colors: conversions, manipulations, family assignment, sorting, and optional Qt helpers.
Installation
pip install tintelligence-color-utils
Optional Qt support
If you need QColor helpers, install with one of the extras:
- PySide6:
pip install "tintelligence-color-utils[qt_pyside6]"
- PyQt6:
pip install "tintelligence-color-utils[qt_pyqt6]"
Quick start
from tintelligence_color_utils import hex_to_hsv, get_color_family
# or
from color_utils import hex_to_hsv, get_color_family
h, s, v = hex_to_hsv("#FF7F00")
print(h, s, v)
print(get_color_family(h, s, v))
API Reference
All functions are available from color_utils or tintelligence_color_utils top-level import.
Conversion
HEX to RGB
hex_to_rgb(hex_code: str) -> tuple[float, float, float]
Convert #RRGGBB or RRGGBB to an (r, g, b) tuple in [0, 1]. Raises ValueError on invalid input.
HEX to HSV
hex_to_hsv(hex_code: str) -> tuple[float, float, float]
Convert a hex color to HSV (h, s, v) where h ∈ [0,1].
Integer RGB to HEX
rgb_to_hex(r: int, g: int, b: int) -> str
Convert integer RGB (0-255) to #RRGGBB.
HEX midpoint
hex_midpoint(c1: str | None, c2: str | None) -> str | None
Midpoint between two hex colors as #RRGGBB. Returns None if inputs are invalid.
RGB to LAB
rgb_to_lab(r: int, g: int, b: int) -> tuple[float, float, float]
Approximate sRGB (D65) to CIE Lab* with L ∈ [0..100].
Normalize LAB
normalize_lab(l: float | None, a: float | None, b: float | None) -> tuple[float | None, float | None, float | None]
Normalize Lab to [0,1] each. L/100, and a,b via (v+128)/255 when needed.
RGB to HSL
rgb_to_hsl(r: int, g: int, b: int) -> tuple[int, int, int]
Convert RGB (0-255) to HSL where H ∈ [0..360], S,L ∈ [0..100] (ints).
LAB to LCH
lab_to_lch(l: float, a: float, b: float) -> tuple[float, float, float]
Convert CIE Lab to LCH(ab) (L, C, H_deg).
Get Brigtness from HEX
brightness_from_hex(hex_color: str) -> float | None
Perceived brightness (Lab L) from a hex color. Higher means brighter.
Color families
Get color family
get_color_family(hue: float, saturation: float, value: float) -> str
Assign a color family based on HSV, with handling for dark and muted tones. Families include e.g. "Black", "Grey", "White / Off-white", "Red", "Pink", "Orange", "Yellow", "Green", "Turquoise / Teal", "Blue", "Purple / Violet", "Brown", "Unknown".
Shades
Get darker shades
get_darker_shades(hex_code: str, steps: int = 2, factor: float = 0.8) -> tuple[str, ...]
Generate steps darker hex shades by multiplying V by factor iteratively.
Sorting
Sort paints by color
sort_paints_by_color(paints: list[dict], mode: str = "hue") -> list[dict]
Sort a list of paint dicts by "hue", "saturation", or "value". Expects hsv_h, hsv_s, hsv_v fields.
Group paints by color family and sort by hue
sort_paints_by_family_value_hue(
paints: list[dict],
order: Literal["bright_to_dark", "dark_to_bright"] = "bright_to_dark",
color_families: list[dict] | None = None,
) -> list[dict]
Group by color_family_id (using the provided color_families order if given; otherwise numeric id order), then sort by HSV V in the chosen order, tie-breaking by HSV H. Returns items enriched with _hsv and _family when color_families is provided.
Group paints by color family and sort by LAB brightness
sort_paints_by_family_lab_brightness(
paints: list[dict],
order: Literal["bright_to_dark", "dark_to_bright"] = "bright_to_dark",
color_families: list[dict] | None = None,
) -> list[dict]
Group by color_family_id (using the provided color_families order if given; otherwise numeric id order), then sort by Lab L in the chosen order, tie-breaking by hsv_h if present.
Sort HEX colors by brightness
sort_hex_by_brightness(hex_codes: list[str], order: Literal["bright_to_dark", "dark_to_bright"] = "bright_to_dark") -> list[str]
Sort a list of hex color codes by perceived brightness (Lab L). Invalid hex codes are placed at the end.
Qt helper (optional)
HEX to QColor
color_utils.qcolor.to_qcolor(color) -> QColor
Convert a hex string, (r, g, b) tuple, or QColor instance to a QColor. Requires PySide6, PyQt6, or a qt_core.QColor shim. Raises RuntimeError if no QColor is available.
Development
- Python 3.9+
- Install dev deps:
pip install -e .[dev] - Build:
python -m build - Test:
pytest
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tintelligence_color_utils-0.1.9.tar.gz.
File metadata
- Download URL: tintelligence_color_utils-0.1.9.tar.gz
- Upload date:
- Size: 8.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25246ee94c323d9c75de535971b07ef166a1ed5e53c46664f2452b3a85db4d58
|
|
| MD5 |
1a1d80a7b0ec98a56193d76f34a6d9bc
|
|
| BLAKE2b-256 |
816d822cad716f727c76791f283393701bc79b416bbc6930f6e3720495d6884b
|
Provenance
The following attestation bundles were made for tintelligence_color_utils-0.1.9.tar.gz:
Publisher:
publish.yml on Tintelligence-App/color-utils
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tintelligence_color_utils-0.1.9.tar.gz -
Subject digest:
25246ee94c323d9c75de535971b07ef166a1ed5e53c46664f2452b3a85db4d58 - Sigstore transparency entry: 537577756
- Sigstore integration time:
-
Permalink:
Tintelligence-App/color-utils@6ee5d665175717ff9ab834bec5680c223220182a -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Tintelligence-App
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6ee5d665175717ff9ab834bec5680c223220182a -
Trigger Event:
push
-
Statement type:
File details
Details for the file tintelligence_color_utils-0.1.9-py3-none-any.whl.
File metadata
- Download URL: tintelligence_color_utils-0.1.9-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb5382c4fa515839bfc3a95fbfeaf8b540e38126f3430c075edb6202d9a1d141
|
|
| MD5 |
59afcfbe2fc7f3cf0b25ba8aae68dbd9
|
|
| BLAKE2b-256 |
ed64e16f1e476fbfd7e32f57048d48f942b49e6b5250b8584b919a28c70a849c
|
Provenance
The following attestation bundles were made for tintelligence_color_utils-0.1.9-py3-none-any.whl:
Publisher:
publish.yml on Tintelligence-App/color-utils
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tintelligence_color_utils-0.1.9-py3-none-any.whl -
Subject digest:
eb5382c4fa515839bfc3a95fbfeaf8b540e38126f3430c075edb6202d9a1d141 - Sigstore transparency entry: 537577758
- Sigstore integration time:
-
Permalink:
Tintelligence-App/color-utils@6ee5d665175717ff9ab834bec5680c223220182a -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Tintelligence-App
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6ee5d665175717ff9ab834bec5680c223220182a -
Trigger Event:
push
-
Statement type: