#!/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()