| from pathlib import Path |
|
|
| from PIL import Image, ImageEnhance, ImageFilter, ImageOps |
|
|
| from backend.engine import image_to_ascii |
|
|
| ROOT = Path(__file__).resolve().parent.parent |
| SOURCE = ROOT / "assets" / "fallback-master.png" |
| IMAGE_DIR = ROOT / "frontend" / "public" / "fallbacks" |
| ASCII_DIR = ROOT / "backend" / "fallback_ascii" |
|
|
|
|
| def main() -> None: |
| IMAGE_DIR.mkdir(parents=True, exist_ok=True) |
| ASCII_DIR.mkdir(parents=True, exist_ok=True) |
| source = Image.open(SOURCE).convert("RGB") |
|
|
| for index in range(20): |
| angle = ((index % 5) - 2) * 1.2 |
| width, height = source.size |
| inset_x = int(width * (index % 4) * 0.025) |
| inset_y = int(height * ((index * 3) % 4) * 0.02) |
| image = source.crop((inset_x, inset_y, width - inset_x, height - inset_y)) |
| image = image.rotate(angle, resample=Image.Resampling.BICUBIC, expand=False) |
| image = ImageOps.fit(image, (768, 512), method=Image.Resampling.LANCZOS) |
| image = ImageEnhance.Contrast(image).enhance(0.9 + (index % 5) * 0.09) |
| image = ImageEnhance.Color(image).enhance(0.45 + (index % 4) * 0.22) |
| if index % 3 == 0: |
| image = image.filter(ImageFilter.GaussianBlur(radius=0.45)) |
| if index % 4 == 0: |
| image = ImageOps.posterize(image, 5) |
|
|
| image_path = IMAGE_DIR / f"fallback-{index + 1:02d}.webp" |
| ascii_path = ASCII_DIR / f"fallback-{index + 1:02d}.txt" |
| image.save(image_path, "WEBP", quality=76, method=6) |
| ascii_path.write_text(image_to_ascii(image), encoding="utf-8") |
|
|
| print("Generated 20 fallback images and ASCII files") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|