ChatCraft / backend /scripts /generate_map_lod.py
gabraken's picture
feat: add new units/buildings/map assets, admin routes, and frontend build
dd96d2f
#!/usr/bin/env python3
"""
Génère des versions basse résolution de MAP.png pour le chargement progressif.
MAP_quarter.png → 1/4 de la taille originale (chargement rapide ~1-2 Mo)
MAP_half.png → 1/2 de la taille originale (qualité intermédiaire ~7 Mo)
Usage :
cd backend && python -m scripts.generate_map_lod
cd backend && python -m scripts.generate_map_lod --input static/MAP.png
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
from PIL import Image
_backend = Path(__file__).resolve().parent.parent
if str(_backend) not in sys.path:
sys.path.insert(0, str(_backend))
def generate_lods(input_path: Path) -> None:
src = Image.open(input_path).convert("RGB")
w, h = src.size
size_mb = input_path.stat().st_size / 1024 / 1024
print(f"Source : {w}×{h} ({size_mb:.1f} Mo) → {input_path}")
lods = [
("MAP_half.png", (w // 2, h // 2)),
("MAP_quarter.png", (w // 4, h // 4)),
]
for filename, size in lods:
out_path = input_path.parent / filename
resized = src.resize(size, Image.LANCZOS)
resized.save(out_path, format="PNG", optimize=True)
out_mb = out_path.stat().st_size / 1024 / 1024
print(f" {filename:25s} {size[0]}×{size[1]} ({out_mb:.1f} Mo) → {out_path}")
def main() -> None:
default = _backend / "static" / "MAP.png"
parser = argparse.ArgumentParser(description="Génère MAP_half.png et MAP_quarter.png")
parser.add_argument("--input", type=Path, default=default)
args = parser.parse_args()
if not args.input.is_file():
raise SystemExit(f"Fichier introuvable : {args.input}")
generate_lods(args.input)
if __name__ == "__main__":
main()