"""Guarda una PIL Image como PNG con metadata embebida en chunks tEXt.""" from __future__ import annotations import os def image_save_png(img: "PIL.Image.Image", path: str, metadata: dict | None = None) -> str: """Guarda una PIL Image como PNG en la ruta indicada. Embebe metadata arbitraria en chunks tEXt del PNG (clave/valor string). Util para registrar prompt, seed, steps, sampler, model dentro del archivo para reproducibilidad. Crea el directorio padre si no existe. Args: img: imagen PIL a guardar. path: ruta de destino (absoluta o relativa). Debe terminar en .png. metadata: dict opcional de pares {clave: valor} a embeber en el PNG. Los valores se convierten a str automaticamente. Returns: Ruta absoluta del archivo PNG escrito. Raises: ImportError: si Pillow no esta instalado. OSError: si no se puede escribir en la ruta indicada. """ try: from PIL import PngImagePlugin except ImportError as exc: raise ImportError( "Pillow no esta instalado. Instalar con: pip install Pillow" ) from exc abs_path = os.path.abspath(path) parent = os.path.dirname(abs_path) if parent: os.makedirs(parent, exist_ok=True) png_info = PngImagePlugin.PngInfo() if metadata: for key, value in metadata.items(): png_info.add_text(str(key), str(value)) img.save(abs_path, format="PNG", pnginfo=png_info) return abs_path