speckles/speckles.py
2023-05-18 16:31:37 +02:00

110 lines
3.9 KiB
Python

import itertools
import json
import random
from collections import Counter
from datetime import datetime
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
palettes = [
{ "colours": ["#eee4ab", "#e5cb9f", "#99c4c8", "#68a7ad"], "votes": 100000 },
{ "colours": ["#e4d192", "#cba0ae", "#af7ab3", "#80558c"], "votes": 100000 },
{ "colours": ["#eeeeee", "#e1d4bb", "#cbb279", "#537188"], "votes": 100000 },
{ "colours": ["#c0dbea", "#ba90c6", "#e8a0bf", "#fdf4f5"], "votes": 100000 },
{ "colours": ["#f5ffc9", "#b3e5be", "#a86464", "#804674"], "votes": 100000 },
{ "colours": ["#ffde7d", "#f6416c", "#f8f3d4", "#00b8a9"], "votes": 100000 },
{ "colours": ["#53354a", "#903749", "#e84545", "#2b2e4a"], "votes": 100000 },
{ "colours": ["#967e76", "#d7c0ae", "#eee3cb", "#b7c4cf"], "votes": 100000 },
{ "colours": ["#fc5185", "#f5f5f5", "#3fc1c9", "#364f6b"], "votes": 100000 },
{ "colours": ["#eaeaea", "#ff2e63", "#252a34", "#08d9d6"], "votes": 100000 },
{ "colours": ["#eeeeee", "#00adb5", "#393e46", "#222831"], "votes": 100000 },
{ "colours": ["#2cd3e1", "#a459d1", "#f266ab", "#ffb84c"], "votes": 100000 },
{ "colours": ["#ffe194", "#e8f6ef", "#1b9c85", "#4c4c6d"], "votes": 100000 },
{ "colours": ["#146c94", "#19a7ce", "#b0daff", "#feff86"], "votes": 100000 },
{ "colours": ["#4c3d3d", "#c07f00", "#ffd95a", "#fff7d4"], "votes": 100000 },
{ "colours": ["#8bacaa", "#b04759", "#e76161", "#f99b7d"], "votes": 100000 },
{ "colours": ["#146c94", "#19a7ce", "#afd3e2", "#f6f1f1"], "votes": 100000 },
{ "colours": ["#9ba4b5", "#212a3e", "#394867", "#f1f6f9"], "votes": 100000 },
{ "colours": ["#00ffca", "#05bfdb", "#088395", "#0a4d68"], "votes": 100000 },
{ "colours": ["#7c9070", "#9ca777", "#fee8b0", "#f97b22"], "votes": 100000 },
{ "colours": ["#002a19", "#000000", "#ffffff", "#e0512f"], "votes": 100000 },
]
palette_files = ["colorhunt.json", "coolors.json"]
for palette_file in palette_files:
with open(palette_file, "rt") as f:
palettes += json.load(f)
def make_wallpaper(
background: str,
speckle_colours: list[str],
filename: str | Path,
density: int = 20,
dimensions: tuple[float | int, float | int] = (1920, 1080),
) -> None:
x, y = dimensions
fig, ax = plt.subplots(figsize=(x / 100, y / 100), facecolor=background)
ax.set_facecolor(background)
[spine.set_color(background) for spine in ax.spines.values()]
plt.xticks([])
plt.yticks([])
plt.margins(0, 0)
for color, size in itertools.product(
speckle_colours,
np.logspace(1, 6, 8, base=2),
):
plt.scatter(
[random.random() * x / 8 for _ in range(density)],
[random.random() * y / 8 for _ in range(density)],
c=color,
s=size,
)
plt.tight_layout()
# plt.xlim(0, x)
# plt.ylim(0, y)
# plt.axis("off")
plt.savefig(
filename,
dpi=128,
bbox_inches="tight",
pad_inches=0,
)
# plt.show()
plt.close()
# palette = random.choice(palettes)
def speckles(palette):
for i, background in enumerate(palette):
speckle_colours = palette[:i] + palette[i + 1 :]
_id = "_".join(speckle_colours).replace("#", "")
speckle_colours += ["#000000", "#000000", "#ffffff"]
make_wallpaper(
background,
speckle_colours,
f"speckles/speckles_{_id}.png",
)
def night_sky(palette):
speckle_colours = palette + ["#ffffff"]
_id = "_".join(palette).replace("#", "")
make_wallpaper(
"#000000",
speckle_colours,
f"speckles/night_sky_{_id}.png",
)
print(len(palettes))
palettes = [palette["colours"] for palette in palettes if palette["votes"] > 30000 or len(palette["colours"]) > 5]
print(len(palettes))
for palette in palettes:
night_sky(palette)
speckles(palette)