storyboard-tui / scripts /build_fallbacks.py
drdavidtang's picture
Update professor voice and storyboard flow
bb94a34 verified
Raw
History Blame Contribute Delete
1.65 kB
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()