feat: up to 3 options for dynamic scheme

Have up to 3 options for base colour for dynamic scheme
Variants moved to new command
Also remove parallel dependency
This commit is contained in:
2 * r + 2 * t
2025-04-22 17:49:44 +10:00
parent 439f6e6321
commit ce6fdf0ab9
8 changed files with 131 additions and 85 deletions
+38 -19
View File
@@ -2,10 +2,10 @@
import sys
from materialyoucolor.quantize import ImageQuantizeCelebi
from materialyoucolor.hct import Hct
from materialyoucolor.utils.math_utils import sanitize_degrees_int, difference_degrees
from materialyoucolor.dislike.dislike_analyzer import DislikeAnalyzer
from materialyoucolor.hct import Hct
from materialyoucolor.quantize import ImageQuantizeCelebi
from materialyoucolor.utils.math_utils import difference_degrees, sanitize_degrees_int
class Score:
@@ -20,7 +20,7 @@ class Score:
pass
@staticmethod
def score(colors_to_population: dict) -> list[int]:
def score(colors_to_population: dict) -> tuple[list[Hct], list[Hct]]:
desired = 14
filter_enabled = False
dislike_filter = True
@@ -72,7 +72,8 @@ class Score:
chosen_colors = []
for difference_degrees_ in range(90, 0, -1):
chosen_colors.clear()
for hct in [item["hct"] for item in scored_hct]:
for item in scored_hct:
hct = item["hct"]
duplicate_hue = any(
difference_degrees(hct.hue, chosen_hct.hue) < difference_degrees_
for chosen_hct in chosen_colors
@@ -85,31 +86,49 @@ class Score:
break
# Get primary colour
got_primary = False
primary = None
for cutoff in range(20, 0, -1):
for item in scored_hct:
if item["hct"].chroma > cutoff and item["hct"].tone > cutoff * 3:
chosen_colors.insert(0, item["hct"])
got_primary = True
primary = item["hct"]
break
if got_primary:
if primary:
break
# Choose distinct primaries
chosen_primaries = [primary]
for difference_degrees_ in range(90, 14, -1):
chosen_primaries = [primary]
for item in scored_hct:
hct = item["hct"]
duplicate_hue = any(
difference_degrees(hct.hue, chosen_hct.hue) < difference_degrees_
for chosen_hct in chosen_primaries
)
if not duplicate_hue:
chosen_primaries.append(hct)
if len(chosen_primaries) >= 3:
break
if len(chosen_primaries) >= 3:
break
# Fix disliked colours
if dislike_filter:
for chosen_hct in chosen_colors:
chosen_colors[chosen_colors.index(chosen_hct)] = (
DislikeAnalyzer.fix_if_disliked(chosen_hct)
)
for i, chosen_hct in enumerate(chosen_primaries):
chosen_primaries[i] = DislikeAnalyzer.fix_if_disliked(chosen_hct)
for i, chosen_hct in enumerate(chosen_colors):
chosen_colors[i] = DislikeAnalyzer.fix_if_disliked(chosen_hct)
return chosen_colors
return chosen_primaries, chosen_colors
if __name__ == "__main__":
img = sys.argv[1]
mode = sys.argv[2] if len(sys.argv) > 2 else "hex"
colours = ImageQuantizeCelebi(img, 1, 128)
colours = [c.to_rgba()[:3] for c in Score.score(colours)]
# print("".join(["\x1b[48;2;{};{};{}m \x1b[0m".format(*colour) for colour in colours]))
print(" ".join(["{:02X}{:02X}{:02X}".format(*colour) for colour in colours]))
colours = Score.score(ImageQuantizeCelebi(img, 1, 128))
for l in colours:
if mode != "hex":
print("".join(["\x1b[48;2;{};{};{}m \x1b[0m".format(*c.to_rgba()[:3]) for c in l]))
if mode != "swatch":
print(" ".join(["{:02X}{:02X}{:02X}".format(*c.to_rgba()[:3]) for c in l]))