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