Compare commits

...

2 Commits

Author SHA1 Message Date
b8011837e9 orientation option 2023-07-10 07:14:05 +00:00
c8444ed3b6 Density option 2023-06-14 09:05:25 +00:00
2 changed files with 156 additions and 38 deletions

111
main.py Normal file
View File

@ -0,0 +1,111 @@
import io
import logging
import itertools
import json
import random
from collections import Counter
from copy import deepcopy
from datetime import datetime
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import uvicorn
from fastapi import FastAPI, Response
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import StreamingResponse
app = FastAPI(title="Speckles API", root_path="/images")
origins = [
"http://localhost",
"http://localhost:3000",
"https://localhost",
"https://0124816.xyz",
"http://0124816.xyz:3001",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
MEDIA_TYPES = {
"png": "image/png",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"svg": "image/svg+xml",
"pdf": "application/pdf",
}
@app.get("/speckles/")
def make_wallpaper(
speckle_colours: str,
density: float | None = 0.12,
size: float | None = 3,
fileformat: str = "svg",
orientation: str | None = "landscape",
):
if not fileformat in MEDIA_TYPES:
return
speckle_colours = speckle_colours.split(",")
background = speckle_colours.pop(0)
if orientation == "portrait":
x, y = (1080, 1920)
elif orientation == "landscape":
x, y = (1920, 1080)
elif "x" in orientation:
resolution = orientation.split("x")
if len(resolution) !=2 :
logging.critical("input resolution has more or less than 2 dimensions")
return
x,y = resolution
if all([x.isdigit(), y.isdigit()]):
x,y = int(x), int(y)
else:
return
else:
x, y = (1920, 1080)
speckles_per_colour = int(x / 128 * y / 128 * density)
fig, ax = plt.subplots(figsize=(x / 120, y / 120), facecolor=background)
ax.set_facecolor(background)
[spine.set_color(background) for spine in ax.spines.values()]
ax.set_xticks([])
ax.set_yticks([])
ax.margins(0, 0)
for color, size in itertools.product(
speckle_colours,
np.logspace(0, size, 10, base=np.exp(2)),
):
ax.scatter(
[random.random() * x / 8 for _ in range(speckles_per_colour)],
[random.random() * y / 8 for _ in range(speckles_per_colour)],
c=color,
s=size,
)
fig.tight_layout()
# plt.xlim(0, x)
# plt.ylim(0, y)
# plt.axis("off")
buf = io.BytesIO()
fig.savefig(
buf,
format=fileformat,
dpi=128,
bbox_inches="tight",
pad_inches=0,
)
buf.seek(0)
return StreamingResponse(content=buf, media_type=MEDIA_TYPES[fileformat])
buf.close()
if __name__ == "__main__":
uvicorn.run("main:app", workers=2, port=8099, reload=False)

View File

@ -8,44 +8,17 @@ 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,
density: int = 0.6,
dimensions: tuple[float | int, float | int] = (1920, 1080),
) -> None:
x, y = dimensions
speckles_per_colour = x / 100 * y / 100 * density
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()]
@ -58,8 +31,8 @@ def make_wallpaper(
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)],
[random.random() * x / 8 for _ in range(speckles_per_colour)],
[random.random() * y / 8 for _ in range(speckles_per_colour)],
c=color,
s=size,
)
@ -101,8 +74,42 @@ def night_sky(palette):
)
if __name__ == "__main__":
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"]
for palette_file in palette_files:
with open(palette_file, "rt") as f:
palettes += json.load(f)
print(len(palettes))
palettes = [palette["colours"] for palette in palettes if palette["votes"] > 30000 or len(palette["colours"]) > 5]
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)