Compare commits
2 Commits
d00fe9c315
...
b8011837e9
Author | SHA1 | Date | |
---|---|---|---|
b8011837e9 | |||
c8444ed3b6 |
111
main.py
Normal file
111
main.py
Normal 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)
|
73
speckles.py
73
speckles.py
@ -8,44 +8,17 @@ from pathlib import Path
|
|||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import numpy as np
|
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(
|
def make_wallpaper(
|
||||||
background: str,
|
background: str,
|
||||||
speckle_colours: list[str],
|
speckle_colours: list[str],
|
||||||
filename: str | Path,
|
filename: str | Path,
|
||||||
density: int = 20,
|
density: int = 0.6,
|
||||||
dimensions: tuple[float | int, float | int] = (1920, 1080),
|
dimensions: tuple[float | int, float | int] = (1920, 1080),
|
||||||
) -> None:
|
) -> None:
|
||||||
x, y = dimensions
|
x, y = dimensions
|
||||||
|
speckles_per_colour = x / 100 * y / 100 * density
|
||||||
|
|
||||||
fig, ax = plt.subplots(figsize=(x / 100, y / 100), facecolor=background)
|
fig, ax = plt.subplots(figsize=(x / 100, y / 100), facecolor=background)
|
||||||
ax.set_facecolor(background)
|
ax.set_facecolor(background)
|
||||||
[spine.set_color(background) for spine in ax.spines.values()]
|
[spine.set_color(background) for spine in ax.spines.values()]
|
||||||
@ -58,8 +31,8 @@ def make_wallpaper(
|
|||||||
np.logspace(1, 6, 8, base=2),
|
np.logspace(1, 6, 8, base=2),
|
||||||
):
|
):
|
||||||
plt.scatter(
|
plt.scatter(
|
||||||
[random.random() * x / 8 for _ in range(density)],
|
[random.random() * x / 8 for _ in range(speckles_per_colour)],
|
||||||
[random.random() * y / 8 for _ in range(density)],
|
[random.random() * y / 8 for _ in range(speckles_per_colour)],
|
||||||
c=color,
|
c=color,
|
||||||
s=size,
|
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))
|
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))
|
print(len(palettes))
|
||||||
for palette in palettes:
|
for palette in palettes:
|
||||||
night_sky(palette)
|
night_sky(palette)
|
||||||
|
Loading…
Reference in New Issue
Block a user