Spaces:
Sleeping
Sleeping
| """ | |
| Generate synthetic test images in samples/ directory. | |
| These are used by load_test.py to populate the Grafana dashboard. | |
| Run: python scripts/generate_samples.py | |
| """ | |
| import os | |
| import numpy as np | |
| from PIL import Image, ImageDraw | |
| SAMPLES_DIR = os.path.join(os.path.dirname(__file__), "..", "samples") | |
| os.makedirs(SAMPLES_DIR, exist_ok=True) | |
| def save(img: Image.Image, name: str): | |
| path = os.path.join(SAMPLES_DIR, name) | |
| img.save(path) | |
| print(f" Saved {name}") | |
| return path | |
| def gradient(w=128, h=128): | |
| arr = np.zeros((h, w, 3), dtype=np.uint8) | |
| arr[:, :, 0] = np.linspace(30, 220, w) # R gradient horizontal | |
| arr[:, :, 1] = np.linspace(50, 180, h)[:, None] # G gradient vertical | |
| arr[:, :, 2] = 120 | |
| return Image.fromarray(arr) | |
| def checkerboard(w=128, h=128, tile=16): | |
| arr = np.zeros((h, w, 3), dtype=np.uint8) | |
| for y in range(0, h, tile): | |
| for x in range(0, w, tile): | |
| color = 220 if (x // tile + y // tile) % 2 == 0 else 50 | |
| arr[y:y+tile, x:x+tile] = color | |
| return Image.fromarray(arr) | |
| def portrait(w=96, h=128): | |
| img = Image.new("RGB", (w, h), (200, 180, 160)) | |
| draw = ImageDraw.Draw(img) | |
| # sky | |
| draw.rectangle([0, 0, w, h//3], fill=(100, 150, 220)) | |
| # ground | |
| draw.rectangle([0, h*2//3, w, h], fill=(80, 130, 80)) | |
| # body | |
| draw.rectangle([w//3, h//2, w*2//3, h*2//3], fill=(50, 80, 150)) | |
| # head | |
| draw.ellipse([w//3, h//4, w*2//3, h//2], fill=(220, 180, 140)) | |
| return img | |
| def cityscape(w=160, h=96): | |
| img = Image.new("RGB", (w, h), (180, 200, 230)) | |
| draw = ImageDraw.Draw(img) | |
| # sky gradient approximation | |
| draw.rectangle([0, 0, w, h//2], fill=(100, 140, 200)) | |
| # buildings | |
| buildings = [ | |
| (10, 60, 30, h, (80, 80, 100)), | |
| (35, 40, 60, h, (100, 90, 110)), | |
| (65, 50, 85, h, (70, 70, 90)), | |
| (90, 30, 115, h, (90, 80, 100)), | |
| (120, 55, 145, h, (85, 85, 95)), | |
| ] | |
| for x0, y0, x1, y1, c in buildings: | |
| draw.rectangle([x0, y0, x1, y1], fill=c) | |
| # windows | |
| for wx in range(x0+4, x1-4, 8): | |
| for wy in range(y0+6, y1-4, 10): | |
| draw.rectangle([wx, wy, wx+4, wy+5], fill=(220, 220, 150)) | |
| return img | |
| def nature(w=128, h=128): | |
| img = Image.new("RGB", (w, h), (100, 160, 220)) | |
| draw = ImageDraw.Draw(img) | |
| # sky | |
| draw.rectangle([0, 0, w, h//2], fill=(100, 160, 220)) | |
| # hills | |
| draw.ellipse([-20, h//2-20, w//2+20, h+10], fill=(60, 120, 60)) | |
| draw.ellipse([w//3, h//2-10, w+20, h+10], fill=(80, 140, 80)) | |
| # sun | |
| draw.ellipse([w-30, 10, w-10, 30], fill=(255, 220, 50)) | |
| return img | |
| if __name__ == "__main__": | |
| print("Generating sample images...") | |
| save(gradient(), "gradient.png") | |
| save(checkerboard(), "checkerboard.png") | |
| save(portrait(), "portrait.png") | |
| save(cityscape(), "cityscape.png") | |
| save(nature(), "nature.png") | |
| print(f"\nDone — {len(os.listdir(SAMPLES_DIR))} images in samples/") | |