Density option
This commit is contained in:
		
							
								
								
									
										94
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | |||||||
|  | import io | ||||||
|  | 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, | ||||||
|  |     dimensions: tuple[float | int, float | int] = (1920, 1080), | ||||||
|  |     density: float | None = 0.12, | ||||||
|  |     fileformat: str = "svg", | ||||||
|  | ): | ||||||
|  |     if not fileformat in MEDIA_TYPES: | ||||||
|  |         return | ||||||
|  |     speckle_colours = speckle_colours.split(",") | ||||||
|  |     background = speckle_colours.pop(0) | ||||||
|  |     x, y = dimensions | ||||||
|  |     speckles_per_colour = int(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()] | ||||||
|  |     ax.set_xticks([]) | ||||||
|  |     ax.set_yticks([]) | ||||||
|  |     ax.margins(0, 0) | ||||||
|  |  | ||||||
|  |     for color, size in itertools.product( | ||||||
|  |         speckle_colours, | ||||||
|  |         np.logspace(1, 6.6, 8, base=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) | ||||||
		Reference in New Issue
	
	Block a user