summaryrefslogtreecommitdiff
path: root/src/caelestia/utils/colourfulness.py
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-06-25 23:44:50 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-06-25 23:44:50 +1000
commit35ea4a2dbca7969940e63b7655a613399a17259f (patch)
tree07b424a9b52fa785482a10576d9afe83acbfd900 /src/caelestia/utils/colourfulness.py
parentschemes: fix static themes (diff)
downloadcaelestia-cli-35ea4a2dbca7969940e63b7655a613399a17259f.tar.gz
caelestia-cli-35ea4a2dbca7969940e63b7655a613399a17259f.tar.bz2
caelestia-cli-35ea4a2dbca7969940e63b7655a613399a17259f.zip
wallpaper: better variant detection
Diffstat (limited to 'src/caelestia/utils/colourfulness.py')
-rw-r--r--src/caelestia/utils/colourfulness.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/caelestia/utils/colourfulness.py b/src/caelestia/utils/colourfulness.py
new file mode 100644
index 0000000..f76c1b6
--- /dev/null
+++ b/src/caelestia/utils/colourfulness.py
@@ -0,0 +1,42 @@
+import math
+
+from PIL import Image
+
+
+def mean(values: list[float]) -> float:
+ return sum(values) / len(values) if values else 0
+
+
+def stddev(values: list[float], mean_val: float) -> float:
+ return math.sqrt(sum((x - mean_val) ** 2 for x in values) / len(values)) if values else 0
+
+
+def calc_colourfulness(image: Image) -> float:
+ width, height = image.size
+ pixels = list(image.getdata()) # List of (R, G, B) tuples
+
+ rg_diffs = []
+ yb_diffs = []
+
+ for r, g, b in pixels:
+ rg = abs(r - g)
+ yb = abs(0.5 * (r + g) - b)
+ rg_diffs.append(rg)
+ yb_diffs.append(yb)
+
+ mean_rg = mean(rg_diffs)
+ mean_yb = mean(yb_diffs)
+ std_rg = stddev(rg_diffs, mean_rg)
+ std_yb = stddev(yb_diffs, mean_yb)
+
+ return math.sqrt(std_rg**2 + std_yb**2) + 0.3 * math.sqrt(mean_rg**2 + mean_yb**2)
+
+
+def get_variant(image: Image) -> str:
+ colourfulness = calc_colourfulness(image)
+
+ if colourfulness < 10:
+ return "neutral"
+ if colourfulness < 20:
+ return "content"
+ return "tonalspot"